commit 4b86068d8fcdba2a5efc5f6c8a9e6fa63c937d39 Author: James Jia - Test Date: Fri Sep 8 13:52:13 2023 -0700 Initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..acb3efa --- /dev/null +++ b/.env @@ -0,0 +1,18 @@ +VITE_BASE_URL=https://v4.testnet.dydx.exchange + +VITE_ALCHEMY_API_KEY=FP275q327Yh7qswtZWenbPXdZZdnAFmC + +VITE_FAUCET_URL_DEV=https://faucet.v4dev.dydx.exchange/ +VITE_FAUCET_URL_STAGE=https://faucet.v4staging.dydx.exchange/ +VITE_FAUCET_URL_TESTNET2=https://faucet.v4testnet2.dydx.exchange/ + +VITE_VALIDATOR_URL_DEV=http://52.192.187.113:26657/ +VITE_VALIDATOR_URL_STAGE=https://validator.v4staging.dydx.exchange/ +VITE_VALIDATOR_URL_TESTNET2=https://validator.v4testnet2.dydx.exchange/ + +VITE_INDEXER_URL_DEV=http://dev-indexer-apne1-lb-public-890774175.ap-northeast-1.elb.amazonaws.com +VITE_INDEXER_URL_STAGE=https://indexer.v4staging.dydx.exchange +VITE_INDEXER_URL_TESTNET2=https://indexer.v4testnet2.dydx.exchange + +VITE_WALLETCONNECT1_BRIDGE=wss://api.dydx.exchange/wc/ +VITE_WALLETCONNECT2_PROJECT_ID=fbe94eaa691fa8d929561f8567062b32 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0a69401 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +VITE_BASE_URL= + +VITE_ALCHEMY_API_KEY= +VITE_PK_ENCRYPTION_KEY= +VITE_WALLETCONNECT2_PROJECT_ID= + +VITE_FAUCET_URL_DEV= +VITE_FAUCET_URL_STAGE= +VITE_FAUCET_URL_TESTNET2= + +VITE_VALIDATOR_URL_DEV= +VITE_VALIDATOR_URL_STAGE= +VITE_VALIDATOR_URL_TESTNET2= + +VITE_INDEXER_URL_DEV= +VITE_INDEXER_URL_STAGE= +VITE_INDEXER_URL_TESTNET2= diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..1dd398d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,19 @@ +/node_modules +vite-env.d.ts +polyfills.ts +vite.config.ts + +# Temporarily ignore, we will slowly remove each directory as we fix files to follow ESLint rules +/src/components +/src/dialogs +/src/forms +/src/hooks +/src/history.ts +/src/icons +/src/lib +/src/main.tsx +/src/menus +/src/pages +/src/state +/src/styles +/src/views diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ae7f722 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,97 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "airbnb", + "airbnb-typescript", + "plugin:prettier/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "prettier" + ], + "overrides": [], + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["react", "prettier"], + "parser": "@typescript-eslint/parser", + "rules": { + "class-methods-use-this": "off", + "import/extensions": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": ["./scripts/*.js"] + } + ], + "import/no-named-as-default": "off", + "import/prefer-default-export": "off", + "jsx-a11y/anchor-is-valid": "off", + "jsx-a11y/click-events-have-key-events": "off", + "no-continue": "off", + "no-console": [ + "error", + { + "devDependencies": ["./scripts/*.js"] + } + ], + "no-lonely-if": "off", + "no-nested-ternary": "off", + "no-return-assign": "off", + "no-return-await": "off", + "no-underscore-dangle": "off", + "no-use-before-define": "off", + "prefer-destructuring": "off", + "prettier/prettier": "error", + "react/forbid-prop-types": "off", + "react/function-component-definition": [ + "error", + { "namedComponents": "arrow-function", "unnamedComponents": "arrow-function" } + ], + "react/jsx-curly-newline": "off", + "react/jsx-filename-extension": ["error", { "extensions": [".js", ".jsx", ".ts", ".tsx"] }], + "react/jsx-fragments": "off", + "react/jsx-one-expression-per-line": "off", + "react/jsx-props-no-spreading": "off", + "react/jsx-wrap-multilines": "off", + "react/jsx-indent": "off", + "react/no-danger": "off", + "react/react-in-jsx-scope": "off", + "react/require-default-props": "off", + "react/sort-comp": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/comma-dangle": "off", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + }, + "multilineDetection": "brackets" + } + ], + "@typescript-eslint/semi": "off" + }, + "globals": { + "fetch": true, + "window": true, + "document": true, + "globalThis": true + }, + "settings": { + "import/resolver": { + "typescript": { + "project": "./tsconfig.json" + } + } + } +} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..de27fed --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,79 @@ + + + + +--- + + + +## Views + +* New: `` + * + * + +* `` + * + * New: `` + * Rename: `` → `` + * + +## Components + +* New: `` + * + * + +* `` + * + * New: `` + * Rename: `` → `` + * + +## Styles/Mixins + +* `styles/_____` + * + * New: `` + * Rename: `` → `` + * + +## Constants/Types + +* `constants/_____` + * + * + +## Functions + +* `lib/_____` + * + * + +## Hooks + +* `hooks/_____` + * + * + +## State + +* `state/_____` + * + * + +## Packages + +* `package-name` + * + * updated: v__ -> v__ + +## Workflows + +* `workflow-name.yml` + * + * + +--- + + diff --git a/.github/workflows/deploy-staging.yml b/.github/workflows/deploy-staging.yml new file mode 100644 index 0000000..8bb757e --- /dev/null +++ b/.github/workflows/deploy-staging.yml @@ -0,0 +1,41 @@ +name: Deploy to v4.stage.dydx.exchange + +on: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up pnpm + uses: dydxprotocol/setup-pnpm@v1 + + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 + registry-url: https://registry.npmjs.org/ + cache: pnpm + + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pnpm install --loglevel warn + + - name: Build + env: + NODE_OPTIONS: '--max-old-space-size=4096' + run: | + pnpm run build --mode staging + + - name: Upload to IPFS via web3.storage + uses: dydxprotocol/add-to-web3@v1 + id: web3storage + with: + web3_token: ${{ secrets.WEB3_STORAGE_TOKEN }} + path_to_add: 'dist' \ No newline at end of file diff --git a/.github/workflows/deploy-testnet.yml b/.github/workflows/deploy-testnet.yml new file mode 100644 index 0000000..8aef558 --- /dev/null +++ b/.github/workflows/deploy-testnet.yml @@ -0,0 +1,55 @@ +name: Deploy to v4.testnet.dydx.exchange + +on: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up pnpm + uses: dydxprotocol/setup-pnpm@v1 + + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 + registry-url: https://registry.npmjs.org/ + cache: pnpm + + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pnpm install --loglevel warn + + - name: Build + env: + NODE_OPTIONS: '--max-old-space-size=4096' + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }} + STATUS_PAGE_SCRIPT_URI: ${{ secrets.STATUS_PAGE_SCRIPT_URI }} + run: | + pnpm run build + pnpm run build:inject-amplitude + pnpm run build:inject-bugsnag + pnpm run build:inject-statuspage + + - name: Upload to IPFS via web3.storage + uses: dydxprotocol/add-to-web3@v1 + id: web3storage + with: + web3_token: ${{ secrets.WEB3_STORAGE_TOKEN }} + path_to_add: 'dist' + + - name: Update IPNS record via web3name + id: web3name + env: + WEB3NAME_SIGNING_KEY: ${{ secrets.WEB3NAME_SIGNING_KEY }} + run: | + echo $WEB3NAME_SIGNING_KEY | base64 -d > .web3name.key + pnpm run deploy:update-ipns --cid=${{ steps.web3storage.outputs.cid }} --key=.web3name.key diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..384dab7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +build +node_modules +dist +dist-ssr +*.local +*.key + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Charting Library +public/tradingview +public/datafeed diff --git a/.ladle/components.tsx b/.ladle/components.tsx new file mode 100644 index 0000000..40cade6 --- /dev/null +++ b/.ladle/components.tsx @@ -0,0 +1,92 @@ +import '@/polyfills'; +import { useEffect, useState } from 'react'; +import { Provider } from 'react-redux'; +import styled from 'styled-components'; + +import { store } from '@/state/_store'; + +import { SelectMenu, SelectItem } from '@/components/SelectMenu'; + +import { setLocaleLoaded } from '@/state/localization'; + +import '@/index.css'; +import './ladle.css'; + +export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [theme, setTheme] = useState('Default theme'); + + useEffect(() => { + switch (theme) { + case 'Dark theme': { + document?.documentElement?.classList.remove('theme-light'); + document?.documentElement?.classList.add('theme-dark'); + break; + } + case 'Light theme': { + document?.documentElement?.classList.remove('theme-dark'); + document?.documentElement?.classList.add('theme-light'); + break; + } + default: { + document?.documentElement?.classList.remove('theme-dark', 'theme-light'); + break; + } + } + }, [theme]); + + useEffect(() => { + store.dispatch(setLocaleLoaded(true)); + }, []); + + return ( + + +

Active Theme:

+ + {[ + { + value: 'Default theme', + label: 'Default theme', + }, + { + value: 'Dark theme', + label: 'Dark theme', + }, + { + value: 'Light theme', + label: 'Light theme', + }, + ].map(({ value, label }) => ( + + ))} + +
+
+ {children} +
+ ); +}; + +const StoryHeader = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; +`; + +const StoryContent = styled.div` + --default-border-width: 1px; + --border-width: var(--default-border-width); + + display: flex; + align-items: center; + justify-content: center; + height: 100%; +`; diff --git a/.ladle/ladle.css b/.ladle/ladle.css new file mode 100644 index 0000000..fdcddfc --- /dev/null +++ b/.ladle/ladle.css @@ -0,0 +1,7 @@ +:root { + --ladle-bg-color-primary: transparent; +} + +#ladle-root { + height: 100vh; +} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ab7b778 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5", + "jsxBracketSameLine": false +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..9634540 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "styled-components.vscode-styled-components" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d42566a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "explorer.sortOrder": "mixed" +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1f77995 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contributing to V4-web +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features + +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: + +1. Fork the repo and create your branch from `master`. +2. If you've added code, thoroughly test your code locally. +3. Make sure your code lints. +4. Issue that pull request! + +## Any contributions you make will be under the same License +When you submit code changes, your submissions are understood to be under the same [License](https://github.com/dydxprotocol/v4-web/blob/master/LICENSE) that covers the project. + +## Report bugs using Github's [issues](https://github.com/dydxprotocol/v4-web/issues) +Report a bug by [opening a new issue](https://github.com/dydxprotocol/v4-web/issues/new). + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Attach screenshots or videos +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..07d5a96 --- /dev/null +++ b/LICENSE @@ -0,0 +1,841 @@ +Subject to your compliance with applicable law, you are granted the right to use the Licensed Work (defined below) under the terms of the below licenses; provided, however, that if you violate any such applicable law in your use of the Licensed Work, all of your rights and licenses to use (including any rights to reproduce, distribute, install or modify) the Licensed Work will automatically and immediately terminate. + +Use of this software before the Change Date specified in the LICENSE file is governed by the Business Source License included in the LICENSE file and at https://spdx.org/licenses/BUSL-1.1.html. + +On and after the Change Date specified in the LICENSE file, use of this software will be governed by the Change License (GNU Affero GPL v3) as specified in the LICENSE file. + + +Business Source License 1.1 +Business Source License text copyright © 2023 MariaDB plc, All Rights Reserved. “Business Source License” is a trademark of MariaDB plc. +Copyright (C) 2023 dYdX Trading Inc. + +Parameters +Licensor: dYdX Trading Inc. +Licensed Work: dydxprotocol/cosmos-sdk, dydxprotocol/cometbft, dydxprotocol/v4-chain, dydxprotocol/v4-clients, dydxprotocol/v4-web, dydxprotocol/v4-abacus, dydxprotocol/v4-localization, dydxprotocol/v4-documentation, and any dYdX or dYdX Trading Inc. github repository reflecting a copy of this license, or link to this license. +Additional Use Grant: None +Change Date: On the later to occur of (i) the release of the Licensed Work labeled “dYdX Version 1.0 Affero GPL”, and which includes a document uploaded to the relevant github repository stating “The software in this repository is Version 1.0, subject to Affero GPL license”, and (ii) September 30, 2023 (approximate projected release of “Version 1.0” of this software). +Change License: GNU Affero GPL License v3 + +License text copyright © 2023 MariaDB plc, All Rights Reserved. “Business Source License” is a trademark of MariaDB plc. +Terms +The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use. +Effective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of the Change License, and the rights granted in the paragraph above terminate. +If your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed Work. +All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each version of the Licensed Work released by Licensor. +You must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply to your use of that work. +Any use of the Licensed Work in violation of this License will automatically terminate your rights under this License for the current and all other versions of the Licensed Work. +This License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License).TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE. MariaDB hereby grants you permission to use this License’s text to license your works, and to refer to it using the trademark “Business Source License”, as long as you comply with the Covenants of Licensor below. +Covenants of Licensor +In consideration of the right to use this License’s text and the “Business Source License” name and trademark, Licensor covenants to MariaDB, and to all other recipients of the licensed work to be provided by Licensor: +To specify as the Change License the GPL Version 2.0 or any later version, or a license that is compatible with GPL Version 2.0 or a later version, where “compatible” means that software provided under the Change License can be included in a program with software provided under GPL Version 2.0 or a later version. Licensor may specify additional Change Licenses without limitation. +To either: (a) specify an additional grant of rights to use that does not impose any additional restriction on the right granted in this License, as the Additional Use Grant; or (b) insert the text “None” to specify a Change Date. Not to modify this License in any other way. +Notice +The Business Source License (this document, or the “License”) is not an Open Source license. However, the Licensed Work will eventually be made available under an Open Source License, as stated in this License. + + + + + + +OPEN SOURCE LICENSE BELOW - TO BE APPLIED AFTER THE CHANGE DATE. + + +Copyright (C) 2023 dYdX Trading Inc. + +Subject to your compliance with applicable law, you are granted the right to use the Licensed Work (defined below) under the terms of the GNU Affero General Public License as set forth below; provided, however, that if you violate any such applicable law in your use of the Licensed Work, all of your rights and licenses to use (including any rights to reproduce, distribute, install or modify) the Licensed Work will automatically and immediately terminate. + + +The GNU Affero General Public License +Version 3, 19 November 2007 + + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + + Preamble + + + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + + The precise terms and conditions for copying, distribution and +modification follow. + + + + TERMS AND CONDITIONS + + + 0. Definitions. + + + "This License" refers to version 3 of the GNU Affero General Public License. + + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + + A "covered work" means either the unmodified Program or a work based +on the Program. + + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + + + 1. Source Code. + + + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + + + The Corresponding Source for a work in source code form is that +same work. + + + 2. Basic Permissions. + + + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; Section 10 +makes it unnecessary. + + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + + + 4. Conveying Verbatim Copies. + + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with Section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + + 5. Conveying Modified Source Versions. + + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of Section 4, provided that you also meet all of these conditions: + + + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under Section + 7. This requirement modifies the requirement in Section 4 to + "keep intact all notices". + + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable Section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + + + 6. Conveying Non-Source Forms. + + + + You may convey a covered work in object code form under the terms +of Sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with Subsection 6b. + + + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under Subsection 6d. + + + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + + + 7. Additional Terms. + + + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + + + a) Disclaiming warranty or limiting liability differently from the + terms of Sections 15 and 16 of this License; or + + + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of Section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + + + 8. Termination. + + + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of Section 11). + + + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under Section 10. + + + + 9. Acceptance Not Required for Having Copies. + + + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + + + 10. Automatic Licensing of Downstream Recipients. + + + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + + + 11. Patents. + + + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + + + 12. No Surrender of Others' Freedom. + + + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + + + 13. Remote Network Interaction; Use with the GNU General Public License. + + + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + + + 14. Revised Versions of this License. + + + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + + + 15. Disclaimer of Warranty. + + + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + + + 16. Limitation of Liability. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + 17. Interpretation of Sections 15 and 16. + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + +For more information about this software, see https://dydx.exchange. + Copyright (C) 2023 dYdX Trading Inc. diff --git a/README.md b/README.md new file mode 100644 index 0000000..483d5a5 --- /dev/null +++ b/README.md @@ -0,0 +1,148 @@ +# v4 Web App + +## Prerequisites + +- Node.js version 18 and `pnpm` installed on your system + +For deploying with Vercel, create an account with [Vercel](https://vercel.com/signup) if you don't have one already. + +For deploying to IPFS, choose one of the following: + +- **Option 1:** A free [web3.storage](https://web3.storage/) account +- **Option 2:** An IPFS client such as [IPFS Kubo](https://docs.ipfs.tech/install/command-line/) + +For web3.storage, sign up for an account and generate an API token on the [API tokens page](https://web3.storage/manage/tokens). web3.storage offers an easy-to-use interface for storing and retrieving content on IPFS. + +Alternatively, follow the [IPFS Kubo installation guide](https://docs.ipfs.tech/install/command-line/) to download the IPFS command-line tool. + +## Part 1: Setting up your local environment + +### Step 1: Clone the repo + +Clone the repository and navigate to its directory: + +```bash +git clone https://github.com/dydxprotocol/v4-web.git +cd v4-web +``` + +### Step 2: Install pnpm and dependencies + +Install pnpm and the project dependencies: + +```bash +npm i -g pnpm +pnpm i +``` + +## Part 2: Running the project locally + +Run the following command in the project directory to start the development server: + +```bash +pnpm dev +``` + +The development server will be running at `http://localhost:5173` (or the port number displayed in the terminal). Visit this URL to interact with the web app and see your changes in real-time. + +To view component stories: + +```bash +pnpm ladle +``` + +This will automatically open your default browser at `http://localhost:61000`. + +## Part 3: Deploying with Vercel + +### Step 1: Connect your repository to Vercel + +Select "Import Git Repository" from your dashboard, and provide the URL of this repository or your forked repository. + +### Step 2: Configure your project + +For the "Build & Development Settings", we recommend the following: +- Framework Preset: `Vite` +- Build Command (override): `pnpm run build` + +If you wish to incorporate analytics via Amplitude and Bugsnag, you can use our scripts: +`pnpm run build:inject-amplitude` and `pnpm run build:inject-bugsnag`. You will need to provide your own API keys for these services. In the Environment Variables section, name the variables as `AMPLITUDE_API_KEY` and `BUGSNAG_API_KEY` and provide the respective keys as their values. + +For more details, check out Vercel's [official documentation](https://vercel.com/docs). + +## Part 4: Deploying to IPFS + +### web3.storage: deploy to IPFS via web3.storage using the provided script + +Export the API token as an environment variable (replace `your_token` with the generated token), and run the script to build and deploy to IPFS: + +```bash +export WEB3_STORAGE_TOKEN=your_token +pnpm run deploy:ipfs +``` + +Save the URL provided in the output, as it is the link to your deployed content on IPFS. + +### IPFS client: deploy with the command-line tool + +To use the IPFS command-line tool, run: + +```bash +ipfs add -r dist +``` + +Save the CID provided in the output. + +### Accessing your content on IPFS + +To access your content on IPFS: + +1. **Native IPFS support in a browser:** Use a browser with native IPFS support, such as Brave or Opera. Enable a local IPFS node and visit the URL directly using the IPNS protocol, like `ipfs://your_cid`. + +2. **Public IPFS gateway:** Access your content via a public IPFS gateway, such as [https://dweb.link](https://dweb.link/) or [https://w3s.link/](https://w3s.link/). Use the gateway URL with your CID appended, like `https://dweb.link/ipfs/your_cid`. + +Replace `your_cid` with the actual CID. + + +## Part 5: Customization + +### Using CircularXX font + +1. **Procure a license for CircularXX:** Visit [Lineto](https://lineto.com/shop/select?family=circular&set=DOPhtVQR-8m) and add `Circular/Family Package` + `Circular Mono/Regular` to your cart. Check the applicable boxes in the `Configure` step to fill out licensing information. After the `Payment` step, download the `.woff2` files. + +2. **Add the fonts to `v4-web`:** Add `CircularXXWeb-Bold.woff2`, `CircularXXWeb-Book.woff2`, `CircularXXWeb-Medium.woff2`, and `CircularXXMonoWeb-Regular.woff2` to the `src/styles/fonts` directory. + +3. **Add font-family to stylesheets:** In `src/styles/fonts.css`, add the following code to import your newly purchased `Circular` font. +```css + @font-face { + src: url("fonts/CircularXXWeb-Book.woff2") format("woff2"); + font-family: "Circular"; + font-weight: 450; + } + + @font-face { + src: url("fonts/CircularXXWeb-Medium.woff2") format("woff2"); + font-family: "Circular"; + font-weight: 500; + } + + @font-face { + src: url("fonts/CircularXXWeb-Bold.woff2") format("woff2"); + font-family: "Circular"; + font-weight: 700; + } + + @font-face { + src: url("fonts/CircularXXMonoWeb-Regular.woff2") format("woff2"); + font-family: "CircularMono"; + font-weight: 400; + } +``` + +In `src/styles/text.css`, update lines `4` and `5` to +```css + --fontFamily-base: "Circular", "Satoshi", system-ui, -apple-system, Helvetica, Arial, sans-serif; + --fontFamily-monospace: "CircularMono", Courier, monospace, var(--fontFamily-base); +``` + +Enjoy the newly installed font. diff --git a/index.html b/index.html new file mode 100644 index 0000000..bcb21eb --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + + + dYdX + + + + + + + + + + + + + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..d783b0b --- /dev/null +++ b/package.json @@ -0,0 +1,153 @@ +{ + "name": "dydx-chain-web", + "private": true, + "version": "0.0.1", + "type": "module", + "license": "BSL-1.1", + "engines": { + "node": ">=18" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "build:inject-amplitude": "node scripts/inject-amplitude.js", + "build:inject-bugsnag": "node scripts/inject-bugsnag.js", + "build:inject-statuspage": "node scripts/inject-statuspage.js", + "deploy:ipfs": "node scripts/upload-ipfs.js --verbose", + "deploy:update-ipns": "node scripts/update-ipns.js", + "deploy:update-dnslink": "node scripts/update-dnslink.js", + "coverage": "vitest run --coverage", + "clean-install": "rm -rf node_modules/ && pnpm i", + "preview": "vite preview", + "ladle": "ladle serve", + "ladle-b": "ladle build", + "ladle-p": "ladle preview", + "lint": "eslint --ext .ts,.tsx src/", + "fix-lint": "eslint --fix --ext .ts,.tsx src/", + "test": "vitest", + "tsc": "tsc", + "postinstall": "tar -xzC public -f tradingview/tradingview.tgz" + }, + "packageManager": "pnpm@8.6.6", + "dependencies": { + "@0xsquid/sdk": "^1.10.0", + "@cosmjs/amino": "^0.31.0", + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/proto-signing": "^0.31.0", + "@cosmjs/stargate": "^0.31.0", + "@cosmjs/tendermint-rpc": "^0.31.0", + "@dydxprotocol/abacus": "^0.4.16", + "@dydxprotocol/v4-client-js": "^0.32.0", + "@dydxprotocol/v4-localization": "^0.0.25", + "@ethersproject/providers": "^5.7.2", + "@js-joda/core": "^5.5.3", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-navigation-menu": "^1.1.3", + "@radix-ui/react-popover": "^1.0.6", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.4", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-toggle-group": "^1.0.4", + "@radix-ui/react-toolbar": "^1.0.4", + "@radix-ui/react-tooltip": "^1.0.6", + "@radix-ui/react-use-rect": "^1.0.1", + "@react-spring/web": "^9.7.2", + "@react-stately/table": "^3.9.1", + "@react-types/grid": "^3.1.8", + "@react-types/shared": "^3.18.1", + "@react-types/table": "^3.6.1", + "@reduxjs/toolkit": "^1.9.5", + "@scure/bip32": "^1.3.0", + "@scure/bip39": "^1.2.0", + "@types/lodash": "^4.14.195", + "@types/styled-components": "^5.1.26", + "@visx/axis": "^3.1.0", + "@visx/curve": "^3.0.0", + "@visx/event": "^3.0.1", + "@visx/gradient": "^3.0.0", + "@visx/group": "^3.0.0", + "@visx/point": "^3.0.1", + "@visx/react-spring": "^3.1.0", + "@visx/responsive": "^3.0.0", + "@visx/scale": "^3.0.0", + "@visx/shape": "^3.0.0", + "@visx/text": "^3.0.0", + "@visx/threshold": "^3.0.0", + "@visx/tooltip": "^3.1.2", + "@visx/xychart": "^3.1.2", + "bignumber.js": "^9.1.1", + "buffer": "^6.0.3", + "cmdk": "^0.2.0", + "color": "^4.2.3", + "crypto-js": "^4.1.1", + "ethers": "^6.6.1", + "graz": "^0.0.43", + "lodash": "^4.17.21", + "long": "^5.2.3", + "luxon": "^3.3.0", + "qr-code-styling": "1.6.0-rc.1", + "react": "^18.2.0", + "react-aria": "^3.25.0", + "react-dom": "^18.2.0", + "react-number-format": "^5.2.2", + "react-query": "^3.39.3", + "react-redux": "^8.1.1", + "react-router-dom": "^6.14.0", + "react-stately": "^3.23.0", + "reselect": "^4.1.8", + "styled-components": "^5.3.11", + "use-latest": "^1.2.1", + "viem": "^1.1.6", + "wagmi": "^1.3.7" + }, + "devDependencies": { + "@babel/core": "^7.22.5", + "@ladle/react": "^2.15.0", + "@types/color": "^3.0.3", + "@types/crypto-js": "^4.1.1", + "@types/luxon": "^3.3.0", + "@types/node": "^20.3.1", + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "@vitejs/plugin-react": "^4.0.1", + "assert": "^2.0.0", + "babel-loader": "^9.1.2", + "babel-plugin-styled-components": "^2.1.4", + "browserify-zlib": "^0.2.0", + "eslint": "^8.43.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-config-standard-with-typescript": "^35.0.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-n": "^16.0.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "minimist": "^1.2.8", + "node-fetch": "^3.3.1", + "pnpm": "^8.6.6", + "prettier": "^2.8.8", + "typescript": "^5.1.3", + "url-polyfill": "^1.1.12", + "util": "^0.12.5", + "vite": "^4.3.9", + "vite-plugin-svgr": "^3.2.0", + "vitest": "^0.32.2", + "w3name": "^1.0.8", + "web3.storage": "^4.5.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..5a49136 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,14285 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@0xsquid/sdk': + specifier: ^1.10.0 + version: 1.10.0 + '@cosmjs/amino': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/crypto': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/encoding': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/proto-signing': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/stargate': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/tendermint-rpc': + specifier: ^0.31.0 + version: 0.31.0 + '@dydxprotocol/abacus': + specifier: ^0.4.16 + version: 0.4.16 + '@dydxprotocol/v4-client-js': + specifier: ^0.32.0 + version: 0.32.0 + '@dydxprotocol/v4-localization': + specifier: ^0.0.25 + version: 0.0.25 + '@ethersproject/providers': + specifier: ^5.7.2 + version: 5.7.2 + '@js-joda/core': + specifier: ^5.5.3 + version: 5.5.3 + '@radix-ui/react-collapsible': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.5 + version: 2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-navigation-menu': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-radio-group': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slider': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-switch': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toast': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toolbar': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tooltip': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-rect': + specifier: ^1.0.1 + version: 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@react-spring/web': + specifier: ^9.7.2 + version: 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@react-stately/table': + specifier: ^3.9.1 + version: 3.9.1(react@18.2.0) + '@react-types/grid': + specifier: ^3.1.8 + version: 3.1.8(react@18.2.0) + '@react-types/shared': + specifier: ^3.18.1 + version: 3.18.1(react@18.2.0) + '@react-types/table': + specifier: ^3.6.1 + version: 3.6.1(react@18.2.0) + '@reduxjs/toolkit': + specifier: ^1.9.5 + version: 1.9.5(react-redux@8.1.1)(react@18.2.0) + '@scure/bip32': + specifier: ^1.3.0 + version: 1.3.0 + '@scure/bip39': + specifier: ^1.2.0 + version: 1.2.0 + '@types/lodash': + specifier: ^4.14.195 + version: 4.14.195 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + '@visx/axis': + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) + '@visx/curve': + specifier: ^3.0.0 + version: 3.0.0 + '@visx/event': + specifier: ^3.0.1 + version: 3.0.1 + '@visx/gradient': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/group': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/point': + specifier: ^3.0.1 + version: 3.0.1 + '@visx/react-spring': + specifier: ^3.1.0 + version: 3.1.0(@react-spring/web@9.7.2)(react@18.2.0) + '@visx/responsive': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/scale': + specifier: ^3.0.0 + version: 3.0.0 + '@visx/shape': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/text': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/threshold': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/tooltip': + specifier: ^3.1.2 + version: 3.1.2(react-dom@18.2.0)(react@18.2.0) + '@visx/xychart': + specifier: ^3.1.2 + version: 3.1.2(@react-spring/web@9.7.2)(react-dom@18.2.0)(react@18.2.0) + bignumber.js: + specifier: ^9.1.1 + version: 9.1.1 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + cmdk: + specifier: ^0.2.0 + version: 0.2.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + color: + specifier: ^4.2.3 + version: 4.2.3 + crypto-js: + specifier: ^4.1.1 + version: 4.1.1 + ethers: + specifier: ^6.6.1 + version: 6.6.1 + graz: + specifier: ^0.0.43 + version: 0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + long: + specifier: ^5.2.3 + version: 5.2.3 + luxon: + specifier: ^3.3.0 + version: 3.3.0 + qr-code-styling: + specifier: 1.6.0-rc.1 + version: 1.6.0-rc.1 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-aria: + specifier: ^3.25.0 + version: 3.25.0(react-dom@18.2.0)(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-number-format: + specifier: ^5.2.2 + version: 5.2.2(react-dom@18.2.0)(react@18.2.0) + react-query: + specifier: ^3.39.3 + version: 3.39.3(react-dom@18.2.0)(react@18.2.0) + react-redux: + specifier: ^8.1.1 + version: 8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + react-router-dom: + specifier: ^6.14.0 + version: 6.14.0(react-dom@18.2.0)(react@18.2.0) + react-stately: + specifier: ^3.23.0 + version: 3.23.0(react@18.2.0) + reselect: + specifier: ^4.1.8 + version: 4.1.8 + styled-components: + specifier: ^5.3.11 + version: 5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + use-latest: + specifier: ^1.2.1 + version: 1.2.1(@types/react@18.2.14)(react@18.2.0) + viem: + specifier: ^1.1.6 + version: 1.1.6(typescript@5.1.3) + wagmi: + specifier: ^1.3.7 + version: 1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + +devDependencies: + '@babel/core': + specifier: ^7.22.5 + version: 7.22.5 + '@ladle/react': + specifier: ^2.15.0 + version: 2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0) + '@types/color': + specifier: ^3.0.3 + version: 3.0.3 + '@types/crypto-js': + specifier: ^4.1.1 + version: 4.1.1 + '@types/luxon': + specifier: ^3.3.0 + version: 3.3.0 + '@types/node': + specifier: ^20.3.1 + version: 20.3.1 + '@types/react': + specifier: ^18.2.14 + version: 18.2.14 + '@types/react-dom': + specifier: ^18.2.6 + version: 18.2.6 + '@typescript-eslint/eslint-plugin': + specifier: ^5.60.0 + version: 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': + specifier: ^5.60.0 + version: 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@vitejs/plugin-react': + specifier: ^4.0.1 + version: 4.0.1(vite@4.3.9) + assert: + specifier: ^2.0.0 + version: 2.0.0 + babel-loader: + specifier: ^9.1.2 + version: 9.1.2(@babel/core@7.22.5)(webpack@5.88.2) + babel-plugin-styled-components: + specifier: ^2.1.4 + version: 2.1.4(@babel/core@7.22.5)(styled-components@5.3.11) + browserify-zlib: + specifier: ^0.2.0 + version: 0.2.0 + eslint: + specifier: ^8.43.0 + version: 8.43.0 + eslint-config-airbnb: + specifier: ^19.0.4 + version: 19.0.4(eslint-plugin-import@2.27.5)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.2)(eslint@8.43.0) + eslint-config-airbnb-typescript: + specifier: ^17.0.0 + version: 17.0.0(@typescript-eslint/eslint-plugin@5.60.0)(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-config-prettier: + specifier: ^8.8.0 + version: 8.8.0(eslint@8.43.0) + eslint-config-standard-with-typescript: + specifier: ^35.0.0 + version: 35.0.0(@typescript-eslint/eslint-plugin@5.60.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0)(typescript@5.1.3) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: + specifier: ^2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-jsx-a11y: + specifier: ^6.7.1 + version: 6.7.1(eslint@8.43.0) + eslint-plugin-n: + specifier: ^16.0.0 + version: 16.0.0(eslint@8.43.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.43.0) + eslint-plugin-react: + specifier: ^7.32.2 + version: 7.32.2(eslint@8.43.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.43.0) + minimist: + specifier: ^1.2.8 + version: 1.2.8 + node-fetch: + specifier: ^3.3.1 + version: 3.3.1 + pnpm: + specifier: ^8.6.6 + version: 8.6.6 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + typescript: + specifier: ^5.1.3 + version: 5.1.3 + url-polyfill: + specifier: ^1.1.12 + version: 1.1.12 + util: + specifier: ^0.12.5 + version: 0.12.5 + vite: + specifier: ^4.3.9 + version: 4.3.9(@types/node@20.3.1) + vite-plugin-svgr: + specifier: ^3.2.0 + version: 3.2.0(vite@4.3.9) + vitest: + specifier: ^0.32.2 + version: 0.32.2 + w3name: + specifier: ^1.0.8 + version: 1.0.8 + web3.storage: + specifier: ^4.5.4 + version: 4.5.4(node-fetch@3.3.1) + +packages: + + /@0xsquid/sdk@1.10.0: + resolution: {integrity: sha512-NKxHYB+g/TMPY+XmCHs+LuhyfbhH4KvAbGpVBOBPXM9Q5FsKcKrDJpTd5YnGYCLF9B3qXAzVTR0XhiC73GmOOA==} + dependencies: + '@cosmjs/encoding': 0.31.0 + '@cosmjs/stargate': 0.31.0 + axios: 0.27.2 + cosmjs-types: 0.8.0 + ethers: 5.7.2 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adraffy/ens-normalize@1.9.0: + resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} + dev: false + + /@adraffy/ens-normalize@1.9.2: + resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==} + dev: false + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@assemblyscript/loader@0.9.4: + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} + dev: true + + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.22.5: + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helpers': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.5): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.22.10: + resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.10 + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + + /@babel/traverse@7.22.10(supports-color@5.5.0): + resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + /@bufbuild/buf-darwin-arm64@1.19.0-1: + resolution: {integrity: sha512-HsWPii21wm3QSyuxrNq9+Yf8iAgpnC4rNCy4x3d6P1fd/LmgE1NPzQW0ghEZvl9dgAQKkL/4S5bKhlm7kbUdmQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-darwin-x64@1.19.0-1: + resolution: {integrity: sha512-2+Ig7ylYpVh4kms/OeJJVY+X0KX4awPA6hYr7L7aZOIcHwZEM8lWtSTO/se5pQc7dc8FXNiC4YUqHC8yfxxX6Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-linux-aarch64@1.19.0-1: + resolution: {integrity: sha512-g/Vxg3WiBr3nhsxsRr2Q81xXJD+0ktHIO3ZJggTG2Sbbl3dh8kyg1iKM6MjJiMP7su5RKCylLigzoEJzVTShyA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-linux-x64@1.19.0-1: + resolution: {integrity: sha512-anYuGx8k/2kp8GPX3eHNUf3IY/01Zpnyw0HaLPXK1Btqyy6XkapVywrDqg7YUzMd1ySFEp1wD9UqRNdEFNCQ4A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-win32-arm64@1.19.0-1: + resolution: {integrity: sha512-xXgF1qYnCfRKbGx1FqvPbpZ6ajh4ddxpXhSxI3VCeb3MsMBuIbiLqX4fQAL3ls/Zwz8tVIITuSwOhYmSEGcpBA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-win32-x64@1.19.0-1: + resolution: {integrity: sha512-futmqgpMQCR1lcAzZJEGjPr7ECw1gYTPIV8crm5SY+iCJ7sOeStOBNt7q5hV4LKmmeWmvm03XIMZPjhQzjH5NQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf@1.19.0-1: + resolution: {integrity: sha512-TIsLTTQUntr/Xq/IMSULv3dlC3/ZsVwQtWgxmJ++IzSuOW79TFQfq59vFeTWrPa6+QXFMz5t6jkMyD4ghzO5nw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@bufbuild/buf-darwin-arm64': 1.19.0-1 + '@bufbuild/buf-darwin-x64': 1.19.0-1 + '@bufbuild/buf-linux-aarch64': 1.19.0-1 + '@bufbuild/buf-linux-x64': 1.19.0-1 + '@bufbuild/buf-win32-arm64': 1.19.0-1 + '@bufbuild/buf-win32-x64': 1.19.0-1 + dev: false + + /@coinbase/wallet-sdk@3.7.1: + resolution: {integrity: sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@solana/web3.js': 1.78.4 + bind-decorator: 1.0.11 + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 6.1.0 + eth-json-rpc-filters: 5.1.0 + eth-rpc-errors: 4.0.2 + json-rpc-engine: 6.1.0 + keccak: 3.0.3 + preact: 10.17.0 + qs: 6.11.2 + rxjs: 6.6.7 + sha.js: 2.4.11 + stream-browserify: 3.0.0 + util: 0.12.5 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@confio/ics23@0.6.8: + resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + dependencies: + '@noble/hashes': 1.3.1 + protobufjs: 6.11.4 + dev: false + + /@cosmjs/amino@0.27.1: + resolution: {integrity: sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA==} + dependencies: + '@cosmjs/crypto': 0.27.1 + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + dev: false + + /@cosmjs/amino@0.29.3: + resolution: {integrity: sha512-BFz1++ERerIggiFc7iGHhGe1CeV3rCv8BvkoBQTBN/ZwzHOaKvqQj8smDlRGlQxX3HWlTwgiLN2A+OB5yX4ZRw==} + dependencies: + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + dev: false + + /@cosmjs/amino@0.30.1: + resolution: {integrity: sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==} + dependencies: + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + dev: false + + /@cosmjs/amino@0.31.0: + resolution: {integrity: sha512-xJ5CCEK7H79FTpOuEmlpSzVI+ZeYESTVvO3wHDgbnceIyAne3C68SvyaKqLUR4uJB0Z4q4+DZHbqW6itUiv4lA==} + dependencies: + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + dev: false + + /@cosmjs/cosmwasm-stargate@0.30.1: + resolution: {integrity: sha512-W/6SLUCJAJGBN+sJLXouLZikVgmqDd9LCdlMzQaxczcCHTWeJAmRvOiZGSZaSy3shw/JN1qc6g6PKpvTVgj10A==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + pako: 2.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/crypto@0.27.1: + resolution: {integrity: sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==} + dependencies: + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + bip39: 3.1.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + js-sha3: 0.8.0 + libsodium-wrappers: 0.7.11 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + + /@cosmjs/crypto@0.29.5: + resolution: {integrity: sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ==} + dependencies: + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers: 0.7.11 + dev: false + + /@cosmjs/crypto@0.30.1: + resolution: {integrity: sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==} + dependencies: + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers: 0.7.11 + dev: false + + /@cosmjs/crypto@0.31.0: + resolution: {integrity: sha512-UaqCe6Tgh0pe1QlZ66E13t6FlIF86QrnBXXq+EN7Xe1Rouza3fJ1ojGlPleJZkBoq3tAyYVIOOqdZIxtVj/sIQ==} + dependencies: + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers-sumo: 0.7.11 + dev: false + + /@cosmjs/encoding@0.27.1: + resolution: {integrity: sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.29.5: + resolution: {integrity: sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.30.1: + resolution: {integrity: sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.31.0: + resolution: {integrity: sha512-NYGQDRxT7MIRSlcbAezwxK0FqnaSPKCH7O32cmfpHNWorFxhy9lwmBoCvoe59Kd0HmArI4h+NGzLEfX3OLnA4Q==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/json-rpc@0.29.5: + resolution: {integrity: sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w==} + dependencies: + '@cosmjs/stream': 0.29.5 + xstream: 11.14.0 + dev: false + + /@cosmjs/json-rpc@0.30.1: + resolution: {integrity: sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==} + dependencies: + '@cosmjs/stream': 0.30.1 + xstream: 11.14.0 + dev: false + + /@cosmjs/json-rpc@0.31.0: + resolution: {integrity: sha512-Ix2Cil2qysiLNrX+E0w3vtwCrqxGVq8jklpLA7B2vtMrw7tru/rS65fdFSy8ep0wUNLL6Ud32VXa5K0YObDOMA==} + dependencies: + '@cosmjs/stream': 0.31.0 + xstream: 11.14.0 + dev: false + + /@cosmjs/launchpad@0.27.1: + resolution: {integrity: sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==} + dependencies: + '@cosmjs/amino': 0.27.1 + '@cosmjs/crypto': 0.27.1 + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + axios: 0.21.4 + fast-deep-equal: 3.1.3 + transitivePeerDependencies: + - debug + dev: false + + /@cosmjs/math@0.27.1: + resolution: {integrity: sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.29.5: + resolution: {integrity: sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.30.1: + resolution: {integrity: sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.31.0: + resolution: {integrity: sha512-Sb/8Ry/+gKJaYiV6X8q45kxXC9FoV98XCY1WXtu0JQwOi61VCG2VXsURQnVvZ/EhR/CuT/swOlNKrqEs3da0fw==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/proto-signing@0.29.3: + resolution: {integrity: sha512-Ai3l9THjMOrLJ4Ebn1Dgptwg6W5ZIRJqtnJjijHhGwTVC1WT0WdYU3aMZ7+PwubcA/cA1rH4ZTK7jrfYbra63g==} + dependencies: + '@cosmjs/amino': 0.29.3 + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + cosmjs-types: 0.5.2 + long: 4.0.0 + dev: false + + /@cosmjs/proto-signing@0.30.1: + resolution: {integrity: sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + dev: false + + /@cosmjs/proto-signing@0.31.0: + resolution: {integrity: sha512-JNlyOJRkn8EKB9mCthkjr6lVX6eyVQ09PFdmB4/DR874E62dFTvQ+YvyKMAgN7K7Dcjj26dVlAD3f6Xs7YOGDg==} + dependencies: + '@cosmjs/amino': 0.31.0 + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + cosmjs-types: 0.8.0 + long: 4.0.0 + dev: false + + /@cosmjs/socket@0.29.5: + resolution: {integrity: sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ==} + dependencies: + '@cosmjs/stream': 0.29.5 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/socket@0.30.1: + resolution: {integrity: sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow==} + dependencies: + '@cosmjs/stream': 0.30.1 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/socket@0.31.0: + resolution: {integrity: sha512-WDh9gTyiP3OCXvSAJJn33+Ef3XqMWag+bpR1TdMBxTmlTxuvU+kPy4cf6P2OF+jkkUBEA5Se2EAju0eFbJMT+w==} + dependencies: + '@cosmjs/stream': 0.31.0 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.29.3: + resolution: {integrity: sha512-455TgXStCi6E8KDjnhDAM8wt6aLSjobH4Dixvd7Up1DfCH6UB9NkC/G0fMJANNcNXMaM4wSX14niTXwD1d31BA==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.29.3 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/proto-signing': 0.29.3 + '@cosmjs/stream': 0.29.5 + '@cosmjs/tendermint-rpc': 0.29.5 + '@cosmjs/utils': 0.29.5 + cosmjs-types: 0.5.2 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.30.1: + resolution: {integrity: sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stream': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.31.0: + resolution: {integrity: sha512-GYhk9lzZPj/QmYHC0VV/4AMoRzVcOP+EnB1YZCoWlBdLuVmpBYKRagJqWIrIwdk1E0gF2ZoESd2TYfdh1fqIpg==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/proto-signing': 0.31.0 + '@cosmjs/stream': 0.31.0 + '@cosmjs/tendermint-rpc': 0.31.0 + '@cosmjs/utils': 0.31.0 + cosmjs-types: 0.8.0 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stream@0.29.5: + resolution: {integrity: sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/stream@0.30.1: + resolution: {integrity: sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/stream@0.31.0: + resolution: {integrity: sha512-Y+aSHwhHkLGIaQOdqRob+yga2zr9ifl9gZDKD+B7+R5pdWN5f2TTDhYWxA6YZcZ6xRmfr7u8a7tDh7iYLC/zKA==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/tendermint-rpc@0.29.5: + resolution: {integrity: sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w==} + dependencies: + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/json-rpc': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/socket': 0.29.5 + '@cosmjs/stream': 0.29.5 + '@cosmjs/utils': 0.29.5 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/tendermint-rpc@0.30.1: + resolution: {integrity: sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ==} + dependencies: + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/json-rpc': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/socket': 0.30.1 + '@cosmjs/stream': 0.30.1 + '@cosmjs/utils': 0.30.1 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/tendermint-rpc@0.31.0: + resolution: {integrity: sha512-yo9xbeuI6UoEKIhFZ9g0dvUKLqnBzwdpEc/uldQygQc51j38gQVwFko+6sjmhieJqRYYvrYumcbJMiV6GFM9aA==} + dependencies: + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/json-rpc': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/socket': 0.31.0 + '@cosmjs/stream': 0.31.0 + '@cosmjs/utils': 0.31.0 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/utils@0.27.1: + resolution: {integrity: sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==} + dev: false + + /@cosmjs/utils@0.29.5: + resolution: {integrity: sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ==} + dev: false + + /@cosmjs/utils@0.30.1: + resolution: {integrity: sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==} + dev: false + + /@cosmjs/utils@0.31.0: + resolution: {integrity: sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A==} + dev: false + + /@cush/relative@1.0.0: + resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} + dev: true + + /@dydxprotocol/abacus@0.4.16: + resolution: {integrity: sha512-FTvzgVZ0xjMRmfHwlyoluUSG4Uu4FUHPnaTvLLPl0ER0junmaVDrmBydAUMWMEYGiLyx/k0ln1cLUDrYF2aX6A==} + dev: false + + /@dydxprotocol/dydxjs@0.3.0: + resolution: {integrity: sha512-ygNeBs0f3H7sJk1qLUjfNwaXgc5TmjD+qZf7BFDbi7+boHJI9xuOWrGpjfBo7OTUZxS6O5jZG323CgU5XqMSPw==} + dependencies: + '@babel/runtime': 7.22.10 + '@bufbuild/buf': 1.19.0-1 + '@cosmjs/amino': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + osmojs: 15.5.0 + protobufjs: 6.11.4 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@dydxprotocol/v4-client-js@0.32.0: + resolution: {integrity: sha512-KvKActMgWLcsRQ7RQhpi/F8xeQ7MWUp3G5+4IPNZ4wyRwAxDSbcrfYbTetI/IesHyelRPSeYxam9eYq3wXwZ1A==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@dydxprotocol/dydxjs': 0.3.0 + '@osmonauts/lcd': 0.6.0 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + axios: 1.1.3 + bech32: 1.1.4 + bignumber.js: 9.1.1 + ethereum-cryptography: 2.1.2 + long: 4.0.0 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@dydxprotocol/v4-localization@0.0.25: + resolution: {integrity: sha512-Rp6VHA8z+nwgvTjjB3fvL8gY7bd4DYDHV+NPoL0MFuRm39vhFxGlBVAGDkXPkQTh6YU5BlZV2yXLkDeSfFqEBQ==} + dev: false + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.43.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.43.0: + resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: false + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: false + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: false + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: false + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: false + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@floating-ui/core@1.4.1: + resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==} + dependencies: + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/dom@1.5.1: + resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==} + dependencies: + '@floating-ui/core': 1.4.1 + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.1.1: + resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} + dev: false + + /@formatjs/ecma402-abstract@1.17.0: + resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==} + dependencies: + '@formatjs/intl-localematcher': 0.4.0 + tslib: 2.6.1 + dev: false + + /@formatjs/fast-memoize@2.2.0: + resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + dependencies: + tslib: 2.6.1 + dev: false + + /@formatjs/icu-messageformat-parser@2.6.0: + resolution: {integrity: sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/icu-skeleton-parser': 1.6.0 + tslib: 2.6.1 + dev: false + + /@formatjs/icu-skeleton-parser@1.6.0: + resolution: {integrity: sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + tslib: 2.6.1 + dev: false + + /@formatjs/intl-localematcher@0.4.0: + resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==} + dependencies: + tslib: 2.6.1 + dev: false + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@internationalized/date@3.4.0: + resolution: {integrity: sha512-QUDSGCsvrEVITVf+kv9VSAraAmCgjQmU5CiXtesUBBhBe374NmnEIIaOFBZ72t29dfGMBP0zF+v6toVnbcc6jg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/message@3.1.1: + resolution: {integrity: sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==} + dependencies: + '@swc/helpers': 0.5.1 + intl-messageformat: 10.5.0 + dev: false + + /@internationalized/number@3.2.1: + resolution: {integrity: sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/string@3.1.1: + resolution: {integrity: sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@ipld/car@3.2.4: + resolution: {integrity: sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw==} + dependencies: + '@ipld/dag-cbor': 7.0.3 + multiformats: 9.9.0 + varint: 6.0.0 + dev: true + + /@ipld/dag-cbor@6.0.15: + resolution: {integrity: sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==} + dependencies: + cborg: 1.10.2 + multiformats: 9.9.0 + dev: true + + /@ipld/dag-cbor@7.0.3: + resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} + dependencies: + cborg: 1.10.2 + multiformats: 9.9.0 + dev: true + + /@ipld/dag-pb@2.1.18: + resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} + dependencies: + multiformats: 9.9.0 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@js-joda/core@5.5.3: + resolution: {integrity: sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==} + dev: false + + /@keplr-wallet/common@0.11.64: + resolution: {integrity: sha512-kEnv6K+TxH+BBwwqUgiTcIXuRLBn6PaZMO4jwJbE1O8C8Qh/2j1QtkMLAMgl3Nj9qQkHgJ/dvA5oIqOIdLVMwg==} + dependencies: + '@keplr-wallet/crypto': 0.11.64 + buffer: 6.0.3 + delay: 4.4.1 + dev: false + + /@keplr-wallet/cosmos@0.11.64: + resolution: {integrity: sha512-S6pLRaDKOyOFPfry7Km+Bgwr087gwHI4n3fp8NLGHtL75mLnOdeGvSEVW5LXJEWc5EyYgngM2CeS7xNHz+vjHg==} + dependencies: + '@ethersproject/address': 5.7.0 + '@keplr-wallet/common': 0.11.64 + '@keplr-wallet/crypto': 0.11.64 + '@keplr-wallet/proto-types': 0.11.64 + '@keplr-wallet/types': 0.11.64 + '@keplr-wallet/unit': 0.11.64 + axios: 0.27.2 + bech32: 1.1.4 + buffer: 6.0.3 + long: 4.0.0 + protobufjs: 6.11.4 + transitivePeerDependencies: + - debug + dev: false + + /@keplr-wallet/crypto@0.11.64: + resolution: {integrity: sha512-DMeGhs+UUBpvefYa/0pF8h8D0lVS1T/eTGNKrn7SIO5CBMp1qfght+k1Se0pHGLr4CAtxFSXTDvYm3mr+ovKhg==} + dependencies: + '@ethersproject/keccak256': 5.7.0 + bip32: 2.0.6 + bip39: 3.1.0 + bs58check: 2.1.2 + buffer: 6.0.3 + crypto-js: 4.1.1 + elliptic: 6.5.4 + sha.js: 2.4.11 + dev: false + + /@keplr-wallet/proto-types@0.11.64: + resolution: {integrity: sha512-3oxfD1+zHPPuyKz41wt5A/gVhf2FQbA/L2u/4TxnmnITkY3IENirvMDrZUDJF0pWyGgZuXjhoVVFN2hMWI++PQ==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /@keplr-wallet/types@0.11.64: + resolution: {integrity: sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==} + dependencies: + axios: 0.27.2 + long: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /@keplr-wallet/unit@0.11.64: + resolution: {integrity: sha512-BKTaDYI17QgEcBBCP5ZqsHsfNH29P6VMRxjR4nOXcJfhsuwvdJxa/p88VwQYbpVBw0oXcDOwudNiu7Bgf8w6QQ==} + dependencies: + '@keplr-wallet/types': 0.11.64 + big-integer: 1.6.51 + utility-types: 3.10.0 + transitivePeerDependencies: + - debug + dev: false + + /@ladle/react-context@1.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xVQ8siyOEQG6e4Knibes1uA3PTyXnqiMmfSmd5pIbkzeDty8NCBtYHhTXSlfmcDNEsw/G8OzNWo4VbyQAVDl2A==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@ladle/react@2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rEl5WU1f0YQO+oXFV9fh2FQUHdXR/k4waLxHBnVyJoQvNvZKZJiKSXkzi7kNIxQazK5iVla12pbhlvDe2jR/Yw==} + engines: {node: '>=16.0.0'} + hasBin: true + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/core': 7.22.5 + '@babel/generator': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + '@ladle/react-context': 1.0.1(react-dom@18.2.0)(react@18.2.0) + '@mdx-js/mdx': 2.3.0 + '@mdx-js/react': 2.3.0(react@18.2.0) + '@vitejs/plugin-react': 3.1.0(vite@4.3.9) + '@vitejs/plugin-react-swc': 3.1.0(vite@4.3.9) + axe-core: 4.7.2 + boxen: 7.1.1 + chokidar: 3.5.3 + classnames: 2.3.2 + commander: 10.0.1 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + get-port: 6.1.2 + globby: 13.2.2 + history: 5.3.0 + koa: 2.14.2 + koa-connect: 2.1.0 + lodash.merge: 4.6.2 + open: 9.1.0 + prism-react-renderer: 1.3.5(react@18.2.0) + prop-types: 15.8.1 + query-string: 8.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-frame-component: 5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-inspector: 6.0.2(react@18.2.0) + rehype-raw: 6.1.1 + remark-gfm: 3.0.1 + source-map: 0.7.4 + vfile: 5.3.7 + vite: 4.3.9(@types/node@20.3.1) + vite-tsconfig-paths: 3.6.0(vite@4.3.9) + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /@ledgerhq/connect-kit-loader@1.1.2: + resolution: {integrity: sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A==} + dev: false + + /@lit-labs/ssr-dom-shim@1.1.1: + resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + dev: false + + /@lit/reactive-element@1.6.3: + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + dev: false + + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.6 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.6 + '@types/react': 18.2.14 + react: 18.2.0 + dev: true + + /@metamask/safe-event-emitter@2.0.0: + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + dev: false + + /@metamask/utils@3.6.0: + resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@5.5.0) + semver: 7.5.4 + superstruct: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@motionone/animation@10.15.1: + resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + dependencies: + '@motionone/easing': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/dom@10.16.2: + resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/generators': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.1 + dev: false + + /@motionone/easing@10.15.1: + resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + dependencies: + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/generators@10.15.1: + resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + dependencies: + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/svelte@10.16.2: + resolution: {integrity: sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==} + dependencies: + '@motionone/dom': 10.16.2 + tslib: 2.6.1 + dev: false + + /@motionone/types@10.15.1: + resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + dev: false + + /@motionone/utils@10.15.1: + resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + dependencies: + '@motionone/types': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.1 + dev: false + + /@motionone/vue@10.16.2: + resolution: {integrity: sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==} + dependencies: + '@motionone/dom': 10.16.2 + tslib: 2.6.1 + dev: false + + /@multiformats/murmur3@1.1.3: + resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} + dependencies: + multiformats: 9.9.0 + murmurhash3js-revisited: 3.0.0 + dev: true + + /@noble/curves@1.0.0: + resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} + dependencies: + '@noble/hashes': 1.3.0 + dev: false + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /@noble/ed25519@1.7.3: + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + dev: true + + /@noble/hashes@1.1.2: + resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + dev: false + + /@noble/hashes@1.3.0: + resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + dev: false + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@osmonauts/lcd@0.10.0: + resolution: {integrity: sha512-PzmXk9x9MHyLn2fUztpAqWqvDmMiEJaQv/JcAoAOE8VdHrD9Hf/KWnE1RZtamuS2ngQRqvQPD0xotCGXW7eTxA==} + dependencies: + '@babel/runtime': 7.22.10 + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + + /@osmonauts/lcd@0.6.0: + resolution: {integrity: sha512-vz9VavXrEfxZoXbSAfNfk90MLpn34XtBYPV3L9YilE+s56AhqYxUh83nne9J5somnTRfGnyR3oeV8C+lHkqiuA==} + dependencies: + '@babel/runtime': 7.22.10 + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.1 + dev: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-dialog@1.0.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.0(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.4(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.0(react@18.2.0): + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-navigation-menu@1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x4Uv0N47ABx3/frJazYXxvMpZeKJe0qmRIgQ2o3lhTqnTVg+CaZfVVO4nQLn3QJcDkTz8icElKffhFng47XIBA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-slot': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slider@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.0(react@18.2.0): + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0): + resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@react-aria/breadcrumbs@3.5.4(react@18.2.0): + resolution: {integrity: sha512-CtBAL7xDDHXpZvmglhEYbNAXeoXNl4Ke+Rwn2WTHVr9blry3P17IL4Elou5QAkyzI2GNHnXUs9K6lzX/uLv+kQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/link': 3.5.3(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/breadcrumbs': 3.6.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/button@3.8.1(react@18.2.0): + resolution: {integrity: sha512-igxZ871An3Clpmpw+beN8F792NfEnEaLRAZ4jITtC/FdzwQwRM7eCu/ZEaqpNtbUtruAmYhafnG/2uCkKhTpTw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/calendar@3.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mXz4v0iSPtPX9SR6LaIzSAE5n2blCujaQ+EiM6G91TM3S7BsHqyELiJcV/ucDD7ncr6ovJpm1JsLFOOAn44YTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/calendar': 3.3.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/checkbox@3.10.0(react@18.2.0): + resolution: {integrity: sha512-1s5jkmag+41Fa2BwoOoM5cRRadDh3N8khgsziuGzD0NqvZLRCtHgDetNlileezFHwOeOWK6zCqDOrYLJhcMi8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/combobox@3.6.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zry8Jh//BrGZ7+qJP3iiFZeb3+EuOjjy6MTmDT3zg60YwGgDArsaSA5s0gopF0fuiOKqlDRCDZ+T3CLyoeOomA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/combobox': 3.6.0(react@18.2.0) + '@react-stately/layout': 3.13.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/combobox': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/datepicker@3.6.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b6LThZJSF9mboFeATUMboTIxSGgW7MjH2vnDZ7UdRQ/ZHZVNX+fjzQ5uOQQ30wJRP44t273jfvxc9OXEMD9CPQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/number': 3.2.1 + '@internationalized/string': 3.1.1 + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/spinbutton': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/datepicker': 3.6.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/dialog': 3.5.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/dialog@3.5.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+YGjX5ygYvFvnRGDy7LVTL2uRCH5VYosMNKn0vyel99SiwHH9d8fdnnJjVvSJ3u8kvoXk22+OnRE2/vEX+G1EA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/dialog': 3.5.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/dnd@3.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4KxdC2FXPL/+ZAsv7RVrZ+kC35dxU4yBowdtmZuagTasLSgfuS3SSyY/VRVgQ+Uq8lUgb55u62+km6xc47n7zA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/string': 3.1.1 + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/dnd': 3.2.3(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/focus@3.14.0(react@18.2.0): + resolution: {integrity: sha512-Xw7PxLT0Cqcz22OVtTZ8+HvurDogn9/xntzoIbVjpRFWzhlYe5WHnZL+2+gIiKf7EZ18Ma9/QsCnrVnvrky/Kw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/grid@3.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J/k7i2ZnMgTv3csMIQrIanbb0mWzlokT86QfKDgQpKxIvrPGbdrVJTx99tzJxEzYeXN9w11Jjwjal65rZCs4rQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/gridlist@3.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VEyEgOKov3lKizoqHpEUIZD+JzyyH8TK0WzWFo/f6lNvmzbYhnW2ciFmqD5DS3bHxLkoXMFdaiA0/MLofRYbHQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/i18n@3.8.1(react@18.2.0): + resolution: {integrity: sha512-ftH3saJlhWaHoHEDb/YjYqP8I4/9t4Ksf0D0kvPDRfRcL98DKUSHZD77+EmbjsmzJInzm76qDeEV0FYl4oj7gg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/message': 3.1.1 + '@internationalized/number': 3.2.1 + '@internationalized/string': 3.1.1 + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/interactions@3.17.0(react@18.2.0): + resolution: {integrity: sha512-v4BI5Nd8gi8s297fHpgjDDXOyufX+FPHJ31rkMwY6X1nR5gtI0+2jNOL4lh7s+cWzszpA0wpwIrKUPGhhLyUjQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/label@3.6.1(react@18.2.0): + resolution: {integrity: sha512-hR7Qx6q0BjOJi/YG5pI13QTQA/2oaXMYdzDCx4Faz8qaY9CCsLjFpo5pUUwRhNieGmf/nHJq6jiYbJqfaONuTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/label': 3.7.5(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/link@3.5.3(react@18.2.0): + resolution: {integrity: sha512-WGz/s/czlb/+wJUnBfnfaRuvOSiNTaQDTk9QsEEwrTkkYbWo7fMlH5Tc7c0Uxem4UuUblYXKth5SskiKQNWc0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/listbox@3.10.1(react@18.2.0): + resolution: {integrity: sha512-hG+f7URcVk7saRG6bemCRaZSNMCg5U51ol/EuoKyHyvd0Vfq/AcsLYrg8vOyRWTsPwjxFtMLItNOZo36KIDs5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/listbox': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/live-announcer@3.3.1: + resolution: {integrity: sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@react-aria/menu@3.10.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FOb16XVejZgl4sFpclLvGd2RCvUBwl2bzFdAnss8Nd6Mx+h4m0bPeDT102k9v1Vjo7OGeqzvMyNU/KM4FwUGGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/meter@3.4.4(react@18.2.0): + resolution: {integrity: sha512-dbn4Ur/w2PzqO8ChrVfkr+GHqaqbMElQlx0HVVbrHhOS1fCx1CC86bn8h767lhFMvh54Kv9MY2cYuygmVBxP1w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/progress': 3.4.4(react@18.2.0) + '@react-types/meter': 3.3.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/numberfield@3.7.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vXerG2mCdAM82AHc7ZiMhKxpWHgjnG+YXkBu5wGRYunmg5exj4n5QVFFIAQgCiToCoJp7nhY9d34BclJbmHwrQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/spinbutton': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/numberfield': 3.6.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/numberfield': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/overlays@3.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jclyCqs1U4XqDA1DAdZaiijKtHLVZ78FV0+IzL4QQfrvzCPC+ba+MC8pe/tw8dMQzXBSnTx/IEqOHu07IwrESQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/progress@3.4.4(react@18.2.0): + resolution: {integrity: sha512-k4EBtYcmqw3j/JYJtn+xKPM8/P1uPcFGSBqvwmVdwDknuT/hR1os3wIKm712N/Ubde8hTeeLcaa38HYezSF8BA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/progress': 3.4.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/radio@3.7.0(react@18.2.0): + resolution: {integrity: sha512-ygSr3ow9avO5BNNwm4aL70EwvLHrBbhSVfG1lmP2k5u/2dxn+Pnm3BGMaEriOFiAyAV4nLGUZAjER6GWXfu5cA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/searchfield@3.5.4(react@18.2.0): + resolution: {integrity: sha512-0jHQYoqT4OutAXNAsWjVJPwzTgZg5wAXIEuQlJuhdfBrjisbgGrYlSHN3Si7x2quXzvdExVL7e0aWRuu6bjjYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/searchfield': 3.4.4(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/searchfield': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/select@3.12.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2n7NezoR6xfrcfCAmg8hz8+4i4Sci/F5LGoqa6/KlESrMSIRI7FLHNsZV+4qE4dWLvDwtnxG2itIfQad1iAqUQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/select': 3.8.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/selection@3.16.1(react@18.2.0): + resolution: {integrity: sha512-mOoAeNjq23H5p6IaeoyLHavYHRXOuNUlv8xO4OzYxIEnxmAvk4PCgidGLFYrr4sloftUMgTTL3LpCj21ylBS9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/separator@3.3.4(react@18.2.0): + resolution: {integrity: sha512-Wb4TJ/PF6Q1yMIKfPM5z+SYwvNRW4RKBzB4oTNAWpSnj8pFimRNXYtyqIowZa67HOPgqzLptqxx6+mAsffCiuQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/slider@3.6.0(react@18.2.0): + resolution: {integrity: sha512-jfFv5q8wX4aAPxoxLcMmBFBUnAdjsryMNLgwN0fosKBLZzshyH9d4WT+Vc4TfVjs5+HHPbGQXeRLo3pgvIJkGQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-stately/slider': 3.4.1(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/slider': 3.6.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/spinbutton@3.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VUMPxjt7TEw38kSyqE3A20UlQ5/0GvkeV/Q61tcjdef9vcf9Z+EJ7AKCcqbVLd9wIKYlPaJQ0JMHJrFJ9Mc91g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/ssr@3.7.1(react@18.2.0): + resolution: {integrity: sha512-ovVPSD1WlRpZHt7GI9DqJrWG3OIYS+NXQ9y5HIewMJpSe+jPQmMQfyRmgX4EnvmxSlp0u04Wg/7oItcoSIb/RA==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/switch@3.5.3(react@18.2.0): + resolution: {integrity: sha512-3sV78Oa12/aU+M9P7BqUDdp/zm2zZA2QvtLLdxykrH04AJp0hLNBnmaTDXJVaGPPiU0umOB0LWDquA3apkBiBA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/table@3.11.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kPIQWh1dIHFAzl+rzfUGgbpAZGerMwwW0zNvRwcLpBOl/nrOwV5Zg/wuCC5cSdkwgo3SghYbcUaM19teve0UcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/tabs@3.6.2(react@18.2.0): + resolution: {integrity: sha512-FjI0h1Z4TsLOvIODhdDrVLz0O8RAqxDi58DO88CwkdUrWwZspNEpSpHhDarzUT7MlX3X72lsAUwvQLqY1OmaBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/tag@3.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k7UCmPOWKbE5Vw2Ok2+OcjhISeadXOagGD0mN7rx/25zPLd2KcEnaHhkjnkH7dfLg1356IvzwvMt70Jp28M5kA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/gridlist': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/textfield@3.11.0(react@18.2.0): + resolution: {integrity: sha512-07pHRuWeLmsmciWL8y9azUwcBYi1IBmOT9KxBgLdLK5NLejd7q2uqd0WEEgZkOc48i2KEtMDgBslc4hA+cmHow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/toggle@3.7.0(react@18.2.0): + resolution: {integrity: sha512-8Rpqolm8dxesyHi03RSmX2MjfHO/YwdhyEpAMMO0nsajjdtZneGzIOXzyjdWCPWwwzahcpwRHOA4qfMiRz+axA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/tooltip@3.6.1(react@18.2.0): + resolution: {integrity: sha512-CVSmndGXhC5EkkGrKcC8EVdAKCbSLTyJibpojC/8uOCbGIQglq3xCAr68PElNNO8+sFDJ4fp9ZzEeDi0Qyxf0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/utils@3.19.0(react@18.2.0): + resolution: {integrity: sha512-5GXqTCrUQtr78aiLVHZoeeGPuAxO4lCM+udWbKpSCh5xLfCZ7zFlZV9Q9FS0ea+IQypUcY8ngXCLsf22nSu/yg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/visually-hidden@3.8.3(react@18.2.0): + resolution: {integrity: sha512-Ln3rqUnPF/UiiPjj8Xjc5FIagwNvG16qtAR2Diwnsju+X9o2xeDEZhN/5fg98PxH2JBS3IvtsmMZRzPT9mhpmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-spring/animated@9.7.3(react@18.2.0): + resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/core@9.7.3(react@18.2.0): + resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/shared@9.7.3(react@18.2.0): + resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/types@9.7.3: + resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + dev: false + + /@react-spring/web@9.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7qNc7/5KShu2D05x7o2Ols2nUE7mCKfKLaY2Ix70xPMfTle1sZisoQMBFgV9w/fSLZlHZHV9P0uWJqEXQnbV4Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/core': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-stately/calendar@3.3.1(react@18.2.0): + resolution: {integrity: sha512-wD5hvdL6Bs8fL2oYkGB/7jGR5Z4ARrrd5uK7T2RwthYguvw95og99A6uUti8ssPGzEkPmJvokds59ov6UmBDdA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/checkbox@3.4.4(react@18.2.0): + resolution: {integrity: sha512-TYNod4+4TmS73F+sbKXAMoBH810ZEBdpMfXlNttUCXfVkDXc38W7ucvpQxXPwF+d+ZhGk4DJZsUYqfVPyXXSGg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/collections@3.10.0(react@18.2.0): + resolution: {integrity: sha512-PyJEFmt9X0kDMF7D4StGnTdXX1hgyUcTXvvXU2fEw6OyXLtmfWFHmFARRtYbuelGKk6clmJojYmIEds0k8jdww==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/combobox@3.6.0(react@18.2.0): + resolution: {integrity: sha512-TguTMh9hr5GjtT4sKragsiKqer2PXSa2cA/8bPGCox0E9VGNPnYWOYMZ5FXS3FO2OotHxOlbH1LNNKwiE255KQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/combobox': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/data@3.10.1(react@18.2.0): + resolution: {integrity: sha512-7RBVr5NMGwruZkxuWZtGrZydPlfoZ2VNxzUkc9VXF1gAWbGP7l0t2MoxDgigznUHNS/iYBJ4Y/iYWx3GXtDsrQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/datepicker@3.6.0(react@18.2.0): + resolution: {integrity: sha512-NlaZNknzIXj8zjmwtyMaXIWAyCRIk2g6xQVqHuxZKjx8ZA44IEXiHqhqCmJH3KNjhrP1hvNPsE2Jl+kSbYZj/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/string': 3.1.1 + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/dnd@3.2.3(react@18.2.0): + resolution: {integrity: sha512-gE0bfKr2CY2LIWpVSee/+Xq74gaquQ5WIhMNDPPjRDuWiIvhAd1vCwqfqVKXGZbn3G97Ak/BIpwhvBvVQVD/8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/flags@3.0.0: + resolution: {integrity: sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==} + dependencies: + '@swc/helpers': 0.4.36 + dev: false + + /@react-stately/grid@3.8.0(react@18.2.0): + resolution: {integrity: sha512-+3Q6D3W5FTc9/t1Gz35sH0NRiJ2u95aDls9ogBNulC/kQvYaF31NT34QdvpstcfrcCFtF+D49+TkesklZRHJlw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/layout@3.13.0(react@18.2.0): + resolution: {integrity: sha512-ktTbD4IP82+4JilJ2iua3qmAeLDhsGUlY8fdYCEvs2BIhr87Hyalk7kMegPoU7bgo9kV9NS4BEf3ZH7DoaxLoQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/list@3.9.1(react@18.2.0): + resolution: {integrity: sha512-GiKrxGakzMTZKe3mp410l4xKiHbZplJCGrtqlxq/+YRD0uCQwWGYpRG+z9A7tTCusruRD3m91/OjWsbfbGdiEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/menu@3.5.4(react@18.2.0): + resolution: {integrity: sha512-+Q71fMDhMM1iARPFtwqpXY/8qkb0dN4PBJbcjwjGCumGs+ja2YbZxLBHCP0DYBElS9l6m3ssF47RKNMtF/Oi5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/numberfield@3.6.0(react@18.2.0): + resolution: {integrity: sha512-4spLEPuYeYQrzs/r13tv/ti4szkJz+6VfVhFNdYwNiW41flUPDpFtGziIqbe2myoEudC+P5WWzryfHkl79tIbQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/number': 3.2.1 + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/numberfield': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/overlays@3.6.1(react@18.2.0): + resolution: {integrity: sha512-c/Mda4ZZmFO4e3XZFd7kqt5wuh6Q/7wYJ+0oG59MfDoQstFwGcJTUnx7S8EUMujbocIOCeOmVPA1eE3DNPC2/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/radio@3.8.3(react@18.2.0): + resolution: {integrity: sha512-3ovJ6tDWzl/Qap8065GZS9mQM7LbQwLc7EhhmQ3dn5+pH4pUCHo8Gb0TIcYFsvFMyHrNMg/r8+N3ICq/WDj5NQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/searchfield@3.4.4(react@18.2.0): + resolution: {integrity: sha512-GhgisSXbz18MjGrvLpXXBkb8HeYPCxlrAGp+tq1dCMhAkmgZI9ZqQZB8EFzS7EoXQ/gCb87sIT0vhiy257lxSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/searchfield': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/select@3.5.3(react@18.2.0): + resolution: {integrity: sha512-bzHcCyp2nka6+Gy/YIDM2eWhk+Dz6KP+l2XnGeM62LhbQ7OWdZW/cEjqhCw0MXZFIC+TDMQcLsX4GRkiRDmL7g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/select': 3.8.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/selection@3.13.3(react@18.2.0): + resolution: {integrity: sha512-+CmpZpyIXfbxEwd9eBvo5Jatc2MNX7HinBcW3X8GfvqNzkbgOXETsmXaW6jlKJekvLLE13Is78Ob8NNzZVxQYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/slider@3.4.1(react@18.2.0): + resolution: {integrity: sha512-mWnOMTRWO2QHSoH2plQe0yDmjqOHAqHkdGKwPI/vTXiqFVLlFhy5RNz8OkB91PBljIzbHh752W+9Cbi6u2K0yA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/slider': 3.6.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/table@3.11.0(react@18.2.0): + resolution: {integrity: sha512-mHv8KgNHm6scO0gntQc1ZVbQaAqLiNzYi4hxksz2lY+HN2CJbJkYGl/aRt4jmnfpi1xWpwYP5najXdncMAKpGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/table@3.9.1(react@18.2.0): + resolution: {integrity: sha512-/YWpV88RH4ElCiwNm/Ys+A5nyWhy+BwEsGTVatbjwZFmHwHxv1FeMrTiYZ9vXR7V7SMCvA8Pd9OJ9NmRkd2klg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/grid': 3.1.8(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@react-types/table': 3.6.1(react@18.2.0) + '@swc/helpers': 0.4.36 + react: 18.2.0 + dev: false + + /@react-stately/tabs@3.5.1(react@18.2.0): + resolution: {integrity: sha512-p1vZOuIS98GMF9jfEHQA6Pir1wYY6j+Gni6DcluNnWj90rLEubuwARNw7uscoOaXKlK/DiZIhkLKSDsA5tbadQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/toggle@3.6.1(react@18.2.0): + resolution: {integrity: sha512-UUWtuI6gZlX6wpF9/bxBikjyAW1yQojRPCJ4MPkjMMBQL0iveAm3WEQkXRLNycEiOCeoaVFBwAd1L9h9+fuCFg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-IX/XlLdwSQWy75TAOARm6hxajRWV0x/C7vGA54O+JNvvfZ212+nxVyTSduM+zjULzhOPICSSUFKmX4ZCV/aHSg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tree@3.7.1(react@18.2.0): + resolution: {integrity: sha512-D0BWcLTRx7EOTdAJCgYV6zm18xpNDxmv4meKJ/WmYSFq1bkHPN75NLv7VPf5Uvsm66xshbO/B3A4HB2/ag1yPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/utils@3.7.0(react@18.2.0): + resolution: {integrity: sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/virtualizer@3.6.1(react@18.2.0): + resolution: {integrity: sha512-Gq5gQ1YPgTakPCkWnmp9P6p5uGoVS+phm6Ie34lmZQ+E62lrkHK0XG0bkOuvMSdWwzql0oLg03E/SMOahI9vNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-types/breadcrumbs@3.6.1(react@18.2.0): + resolution: {integrity: sha512-O4Jeh2DdYqqbG9tFDkcMEBZ+MId/vouy0gSuRf7Q9HWnT3E68GE1LM8yj2z58XIYOecDeWhlbzvPMfXztouYzg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/button@3.7.4(react@18.2.0): + resolution: {integrity: sha512-y1JOnJ3pqg2ezZz/fdwMMToPj+8fgj/He7z1NRWtIy1/I7HP+ilSK6S/MLO2jRsM2QfCq8KSw5MQEZBPiPWsjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/calendar@3.3.1(react@18.2.0): + resolution: {integrity: sha512-9pn4M8GK6dCMyCN5oilsGYnphe+tSU5zfHucdiVCOyss3HrOBVxLQnr9eZfDxN/nEqz7fCu8QPIIMFFgOi/YCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/checkbox@3.5.0(react@18.2.0): + resolution: {integrity: sha512-fCisTdqFKkz7FvxNoexXIiVsTBt0ZwIyeIZz/S41M6hzIZM38nKbh6yS/lveQ+/877Dn7+ngvbpJ8QYnXYVrIQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/combobox@3.7.0(react@18.2.0): + resolution: {integrity: sha512-w9LSAq/DR1mM8lwHk7cGbIGGm75yg+A2pdnLaViFNEVqv7nBUuhHUBzIihnCQ2k/4piWxa5Ih5gcggDFv2yE4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/datepicker@3.5.0(react@18.2.0): + resolution: {integrity: sha512-PQSfLR0CgSaD3T70enZQZH/L4s1+KPAJLRxwtyy8toDekKfrkoIjrnUOP91e0rkajeHCSG9T1kL6w8FtaUvbmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/dialog@3.5.4(react@18.2.0): + resolution: {integrity: sha512-WCEkUf93XauGaPaF1efTJ8u04Z5iUgmmzRbFnGLrske7rQJYfryP3+26zCxtKKlOTgeFORq5AHeH6vqaMKOhhg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/grid@3.1.8(react@18.2.0): + resolution: {integrity: sha512-NKk4pDbW2QXJOYnDSAYhta81CGwXOc/9tVw2WFs+1wacvxeKmh1Q+n36uAFcIdQOvVRqeGTJaYiqLFmF3fC3tA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/grid@3.2.0(react@18.2.0): + resolution: {integrity: sha512-ZIzFDbuBgqaPNvZ18/fOdm9Ol0m5rFPlhSxQfyAgUOXFaQhl/1+BsG8FsHla/Y6tTmxDt5cVrF5PX2CWzZmtOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/label@3.7.5(react@18.2.0): + resolution: {integrity: sha512-iNO5T1UYK7FPF23cwRLQJ4zth2rqoJWbz27Wikwt8Cw8VbVVzfLBPUBZoUyeBVZ0/zzTvEgZUW75OrmKb4gqhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/link@3.4.4(react@18.2.0): + resolution: {integrity: sha512-/FnKf7W6nCNZ2E96Yo1gaX63eSxERmtovQbkRRdsgPLfgRcqzQIVzQtNJThIbVNncOnAw3qvIyhrS0weUTFacQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/listbox@3.4.3(react@18.2.0): + resolution: {integrity: sha512-AHOnx5z+q/uIsBnGqrNJ25OSTbOe2/kWXWUcPDdfZ29OBqoDZu86psAOA97glYod97w/KzU5xq8EaxDrWupKuQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/menu@3.9.3(react@18.2.0): + resolution: {integrity: sha512-0dgIIM9z3hzjFltT+1/L8Hj3oDEcdYkexQhaA+jv6xBHUI5Bqs4SaJAeSGrGz5u6tsrHBPEgf/TLk9Dg9c7XMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/meter@3.3.3(react@18.2.0): + resolution: {integrity: sha512-cuNMHAG9SF/QjM0bjukC1ezjWxp0KRInmEQN3kQuQt+eAVC2GLCJjDRfRSLgf5jld8S68xOVw8fEAWY+VK/NHg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/progress': 3.4.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/numberfield@3.5.0(react@18.2.0): + resolution: {integrity: sha512-uKN6uJCJICIvngk3d2AzD/XU+LZHSriALpsM58l6Zy7xmVu3Wdb11WeWL9z/cwJ+KAdt4tcD+rCE/Y2rcfjWDA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/overlays@3.8.1(react@18.2.0): + resolution: {integrity: sha512-aDI/K3E2XACkey8SCBmAerLhYSUFa8g8tML4SoQbfEJPRj+jJztbHbg9F7b3HKDUk4ZOjcUdQRfz1nFHORdbtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/progress@3.4.2(react@18.2.0): + resolution: {integrity: sha512-UvnBt1OtjgQgOM3556KpuAXSdvSIVGSeD4+otTfkl05ieTcy6Lx7ef3TFI2KfQP45a9JeRBstTNpThBmuRe03A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/radio@3.5.0(react@18.2.0): + resolution: {integrity: sha512-jpAG03eYxLvD1+zLoHXVUR7BCXfzbaQnOv5vu2R4EXhBA7t1/HBOAY/WHbUEgrnyDYa2na7dr/RbY81H9JqR0g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/searchfield@3.4.3(react@18.2.0): + resolution: {integrity: sha512-gnOKM2r5GuRspe+8gmKZxuiPYUlzxge9r1SADWgCCrF9091Aq6uEL+oXT4nAIMlRCwxxKXjAa8KlGeqz3dEgxw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/select@3.8.2(react@18.2.0): + resolution: {integrity: sha512-m11J/xBR8yFwPLuueoFHzr4DiLyY7nKLCbZCz1W2lwIyd8Tl2iJwcLcuJiyUTJwdSTcCDgvbkY4vdTfLOIktYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/shared@3.18.1(react@18.2.0): + resolution: {integrity: sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-types/shared@3.19.0(react@18.2.0): + resolution: {integrity: sha512-h852l8bWhqUxbXIG8vH3ab7gE19nnP3U1kuWf6SNSMvgmqjiRN9jXKPIFxF/PbfdvnXXm0yZSgSMWfUCARF0Cg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-types/slider@3.6.0(react@18.2.0): + resolution: {integrity: sha512-X9h7g1eoYx5+Xts0qCfLd7Qje8NknK3AWq9BZKul2KSZ/5VJeFhIsRjN5MzaUNngO1aYOvSPlPn1oaAWx/ZXHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/switch@3.4.0(react@18.2.0): + resolution: {integrity: sha512-vUA4Etm7ZiThYN3IotPXl99gHYZNJlc/f9o/SgAUSxtk5pBv5unOSmXLdrvk01Kd6TJ/MjL42IxRShygyr8mTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/table@3.6.1(react@18.2.0): + resolution: {integrity: sha512-DeiiBZPZUO2kH40P10Bn9Y4SvDobUlH7Flgx2afL3tJirKMkS1SNDU/B+X9B5Duyd1D0okf1+PLVmi0NBqM4vg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/grid': 3.1.8(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/table@3.8.0(react@18.2.0): + resolution: {integrity: sha512-/7IBG4ZlJHvEPQwND/q6ZFzfXq0Bc1ohaocDFzEOeNtVUrgQ2rFS64EY2p8G7BL9XDJFTY2R5dLYqjyGFojUvQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/tabs@3.3.1(react@18.2.0): + resolution: {integrity: sha512-vPxSbLCU7RT+Rupvu/1uOAesxlR/53GD5ZbgLuQRr/oEZRbsjY8Cs3CE3LGv49VdvBWivXUvHiF5wSE7CdWs1w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/textfield@3.7.3(react@18.2.0): + resolution: {integrity: sha512-M2u9NK3iqQEmTp4G1Dk36pCleyH/w1n+N52u5n0fRlxvucY/Od8W1zvk3w9uqJLFHSlzleHsfSvkaETDJn7FYw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-ne1SVhgofHRZNhoQM4iMCSjCstpdPBpM81B4KDJ7XmWax0+dP4qmdxMc7qvEm7GjuZLfYx5f44fWytKm1BkZmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@reduxjs/toolkit@1.9.5(react-redux@8.1.1)(react@18.2.0): + resolution: {integrity: sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 18.2.0 + react-redux: 8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + dev: false + + /@remix-run/router@1.7.0: + resolution: {integrity: sha512-Eu1V3kz3mV0wUpVTiFHuaT8UD1gj/0VnoFHQYX35xlslQUpe8CuYoKFn9d4WZFHm3yDywz6ALZuGdnUPKrNeAw==} + engines: {node: '>=14'} + dev: false + + /@rollup/pluginutils@5.0.3: + resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@safe-global/safe-apps-provider@0.17.1(typescript@5.1.3): + resolution: {integrity: sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ==} + dependencies: + '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.1.3) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-apps-sdk@8.0.0(typescript@5.1.3): + resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.9.0 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.1.3): + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.9.0 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-gateway-typescript-sdk@3.9.0: + resolution: {integrity: sha512-DxRM/sBBQhv955dPtdo0z2Bf2fXxrzoRUnGyTa3+4Z0RAhcyiqnffRP1Bt3tyuvlyfZnFL0RsvkqDcAIKzq3RQ==} + dependencies: + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + dev: false + + /@scure/base@1.1.1: + resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + dev: false + + /@scure/bip32@1.3.0: + resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} + dependencies: + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip39@1.2.0: + resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@solana/buffer-layout@4.0.1: + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + dependencies: + buffer: 6.0.3 + dev: false + + /@solana/web3.js@1.78.4: + resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==} + dependencies: + '@babel/runtime': 7.22.10 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.0 + node-fetch: 2.6.12 + rpc-websockets: 7.6.0 + superstruct: 0.14.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@stablelib/aead@1.0.1: + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + dev: false + + /@stablelib/binary@1.0.1: + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + dependencies: + '@stablelib/int': 1.0.1 + dev: false + + /@stablelib/bytes@1.0.1: + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + dev: false + + /@stablelib/chacha20poly1305@1.0.1: + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/chacha@1.0.1: + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/constant-time@1.0.1: + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + dev: false + + /@stablelib/ed25519@1.0.3: + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/hash@1.0.1: + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + dev: false + + /@stablelib/hkdf@1.0.1: + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/hmac@1.0.1: + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/int@1.0.1: + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + dev: false + + /@stablelib/keyagreement@1.0.1: + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + dependencies: + '@stablelib/bytes': 1.0.1 + dev: false + + /@stablelib/poly1305@1.0.1: + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/random@1.0.2: + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/sha256@1.0.1: + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/sha512@1.0.1: + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/wipe@1.0.1: + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + dev: false + + /@stablelib/x25519@1.0.3: + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-transform-svg-component@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-preset@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-plugin-add-jsx-attribute': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-replace-jsx-attribute-value': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-svg-dynamic-title': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-svg-em-dimensions': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-transform-react-native-svg': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-transform-svg-component': 7.0.0(@babel/core@7.22.5) + dev: true + + /@svgr/core@7.0.0: + resolution: {integrity: sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-preset': 7.0.0(@babel/core@7.22.5) + camelcase: 6.3.0 + cosmiconfig: 8.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/hast-util-to-babel-ast@7.0.0: + resolution: {integrity: sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.22.10 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@7.0.0: + resolution: {integrity: sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-preset': 7.0.0(@babel/core@7.22.5) + '@svgr/hast-util-to-babel-ast': 7.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@swc/core-darwin-arm64@1.3.77: + resolution: {integrity: sha512-l4KGQAGB4Ih1Al2tWoUBrtVJCF/xZRjH3jCMCRD52KZDRAnRVDq42JKek7+aHjjH8juzTISaqzsI8Ipv6zvKhA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.77: + resolution: {integrity: sha512-eFCkZg/BzObOn5IWn7t/Ywz+jlZKff/1XBymT7Arh/UkO39Agh+rYdBqjbylp4JQMl0qGRBfxD3wPgDRoViNVQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.77: + resolution: {integrity: sha512-+1BueyGcCQAtxSORJml0CU8aKQNssQ5E3ABMFJwCbcec+lUCiGYK1fBfqj4FmWQMbXuQ+mn1SMeXSZAtaXoQ3w==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.77: + resolution: {integrity: sha512-3smbzVcuuCiWWPFeUIp1c0aAXd+fGsc8x8rUcYvoJAWBgLJ45JymOI5WSUjIybl3rk0prdkbFylZuR0t1Rue3A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.77: + resolution: {integrity: sha512-e81+i4ef5vDeu9AkMY2AamPcmtPVPUqeqq3aNWM1tcHCaUej1DwY4xhRxrd1OvEoYyVBLtiMb5nenF3V9OzXIQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.77: + resolution: {integrity: sha512-gl3+9VESckZ/GYCmGClGgXqB2tAA2MivEV/51Wde+2alo2lPSSujEhxE6Q3TNYkXOLAHSupYyDZ0ou9RfXufOw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.77: + resolution: {integrity: sha512-AqQLZAMYTaNrA4i/Nv/GhXdildDZyRv6xsK8u2actevv5PPjD/69yYB3Z4uaptwh/4ys4W/Y2vnt+OPCNH4OQg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.77: + resolution: {integrity: sha512-Wdw++6w7WyavxZ3WruElCrRJ6EO0iHS0Mts4qHnbKgD08GJqIMTZPtZ5qhRe9zCf6sj2rQqhAMf/HKhYrHoF+w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.77: + resolution: {integrity: sha512-ObNVpdtLdXDpmVKuMZh87yBYL4ti64WX95o2j5Oq3r0e0RqwIGqGvPDxvJVEiyCnaXHfl8eSNKWuiOxPHPkMNQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.77: + resolution: {integrity: sha512-Ew6jg/qr0v/2ixeJXvIUBuAPMKTz8HRoDBO/nHkvlnDFmkhsyH7h5YwJS1rLBwAEhWuJaVYjYi7cibZTI/QRYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.77: + resolution: {integrity: sha512-CiLD2NGTdhE8JnWFHeRAglaCAcvwOxvpeWNtCIT261GrxTKCXHPAn4eqIWiBzXnwWDmZ6XdyrCL4/GmPESNnrg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.77 + '@swc/core-darwin-x64': 1.3.77 + '@swc/core-linux-arm-gnueabihf': 1.3.77 + '@swc/core-linux-arm64-gnu': 1.3.77 + '@swc/core-linux-arm64-musl': 1.3.77 + '@swc/core-linux-x64-gnu': 1.3.77 + '@swc/core-linux-x64-musl': 1.3.77 + '@swc/core-win32-arm64-msvc': 1.3.77 + '@swc/core-win32-ia32-msvc': 1.3.77 + '@swc/core-win32-x64-msvc': 1.3.77 + dev: true + + /@swc/helpers@0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.6.1 + dev: false + + /@swc/helpers@0.4.36: + resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + dependencies: + legacy-swc-helpers: /@swc/helpers@0.4.14 + tslib: 2.6.1 + dev: false + + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.1 + dev: false + + /@tanstack/match-sorter-utils@8.8.4: + resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} + engines: {node: '>=12'} + dependencies: + remove-accents: 0.4.2 + dev: false + + /@tanstack/query-core@4.32.6: + resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + dev: false + + /@tanstack/query-persist-client-core@4.32.6: + resolution: {integrity: sha512-MJJ7CldvT5HOel50h/3wOZZwVlIcroFD5Vxn8vPsfo2C0qQ208ilmN/81JWutm/lWy4n2BjnCrrWv6HvVI7S0w==} + dependencies: + '@tanstack/query-core': 4.32.6 + dev: false + + /@tanstack/query-sync-storage-persister@4.32.6: + resolution: {integrity: sha512-hTwNo5O5EvydbfdVvwnwY0nIrNg1BxKEV4WAA8A+0NP9yc/9xoWy8RxbIkcz1p4JN2JhagaTKek8Fa5h5KitsA==} + dependencies: + '@tanstack/query-persist-client-core': 4.32.6 + dev: false + + /@tanstack/react-query-devtools@4.32.6(@tanstack/react-query@4.32.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gd9pBkm2sbeze9P5Yp8R7y0rZVUdoIOhduomDjz138WdJuVbRS4Y8p6gX2uMJFsUFVe7jA6fX/D6NfQ9o5OS/A==} + peerDependencies: + '@tanstack/react-query': ^4.32.6 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.8.4 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + superjson: 1.13.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@tanstack/react-query-persist-client@4.32.6(@tanstack/react-query@4.32.6): + resolution: {integrity: sha512-EmNnYpvFYpxS4j5WFeNmfVVBxqq4RDnEFDBZwNKRfb4pzukcx/hcWtwqFk7Qj0EI4Dk8QGl239MEYwJbAc83tQ==} + peerDependencies: + '@tanstack/react-query': ^4.32.6 + dependencies: + '@tanstack/query-persist-client-core': 4.32.6 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@tanstack/react-query@4.32.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.32.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/color-convert@2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 + dev: true + + /@types/color-name@1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + dev: true + + /@types/color@3.0.3: + resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==} + dependencies: + '@types/color-convert': 2.0.0 + dev: true + + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 20.3.1 + dev: false + + /@types/crypto-js@4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: true + + /@types/d3-color@3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-interpolate@3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path@1.0.9: + resolution: {integrity: sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 2.1.1 + dev: false + + /@types/d3-shape@1.3.8: + resolution: {integrity: sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==} + dependencies: + '@types/d3-path': 1.0.9 + dev: false + + /@types/d3-time@2.1.1: + resolution: {integrity: sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==} + dev: false + + /@types/d3-voronoi@1.1.9: + resolution: {integrity: sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==} + dev: false + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.2 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /@types/hoist-non-react-statics@3.3.1: + resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} + dependencies: + '@types/react': 18.2.14 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + /@types/luxon@3.3.0: + resolution: {integrity: sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==} + dev: true + + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /@types/mdx@2.0.6: + resolution: {integrity: sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + + /@types/node@10.12.18: + resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} + dev: false + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + dev: false + + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-dom@18.2.6: + resolution: {integrity: sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==} + dependencies: + '@types/react': 18.2.14 + + /@types/react@18.2.14: + resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/styled-components@5.1.26: + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + dependencies: + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.14 + csstype: 3.1.2 + dev: false + + /@types/trusted-types@2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + dev: false + + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + dev: true + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 20.3.1 + dev: false + + /@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/type-utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.60.0: + resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/visitor-keys': 5.60.0 + dev: true + + /@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + '@typescript-eslint/utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.60.0: + resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.3): + resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/visitor-keys': 5.60.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + eslint: 8.43.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.60.0: + resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@visx/annotation@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-otf2AZDlt/XCpOBG0gkPowXVerLJW5yXPFis94Km0bj629htyKOsY5GeJKlBeB89ddxdi4zWHkaFxGFJ79Pqog==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/drag': 3.0.1(react@18.2.0) + '@visx/group': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react-dom + dev: false + + /@visx/axis@3.1.0(react@18.2.0): + resolution: {integrity: sha512-JDj/1VYx0JO0pHFtwoFtYcnqdoZFh/dpHImEl169S5nTslSFlIoNTXA/ekpBP6ELkEZ59gmF1X5k29x6MFBwCA==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/point': 3.0.1 + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/bounds@3.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YQaSSER9erxlhppzRms6cvYdKqcIwk6eksrGdbJkBoHobhPo1JCIUXlmrA4qgrEnXInPJpueGE+PE5F+Dk12DA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@visx/clip-path@3.0.0(react@18.2.0): + resolution: {integrity: sha512-Kvoi2qDVNrB4PoSaOUhw7SKEVSXrSyz8oZggoIb5OoA6feeG7CQQEbNQyOS2wW2zmOuxnwkg3EB7sOBxC6c7WA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/curve@3.0.0: + resolution: {integrity: sha512-kvHJDLBeczTQ87ZExSTfRxej06l6o6UiQ0NHf9+xpAin06y6Qk1ThOHHWJTGM6KGzwlu7jEauJGHwZs6nMhDvA==} + dependencies: + '@types/d3-shape': 1.3.8 + d3-shape: 1.3.7 + dev: false + + /@visx/drag@3.0.1(react@18.2.0): + resolution: {integrity: sha512-yi2AB/unUfNYBRKS4pmUOuz8MjaAAYjsQGYcD/s4LqeQjd+lBZF7CuNcYZ/maGNQAEUfgLr2czIzADanOMtMaw==} + peerDependencies: + react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/event': 3.0.1 + '@visx/point': 3.0.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/event@3.0.1: + resolution: {integrity: sha512-tK1EUYQLLStBuoCMbm8LJ3VbDyCVI8HjT0pMRQxm+C75FSIVWvrThgrfrC9sWOFnEMEYWspZO7hI5zjsPKjLQA==} + dependencies: + '@types/react': 18.2.14 + '@visx/point': 3.0.1 + dev: false + + /@visx/glyph@3.0.0(react@18.2.0): + resolution: {integrity: sha512-r1B0IocfWfhTABKjam0qqsWKjxLxZfGwefnwn8IcfELSd9iAUtLbI/46nP4roQRHhB/Wl3RBbgA97fZw8f1MxA==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-shape': 1.3.8 + '@types/react': 18.2.14 + '@visx/group': 3.0.0(react@18.2.0) + classnames: 2.3.2 + d3-shape: 1.3.7 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/gradient@3.0.0(react@18.2.0): + resolution: {integrity: sha512-UoM9R9PIPLO/w7hCW9gFncrLdpKNqh13sLS9/0Iy6b75uP2l05FLG2HX4kXljeyOrj4/XyzRCMYm0HHk/p5iMA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/grid@3.0.1(react@18.2.0): + resolution: {integrity: sha512-cln5CVvFG58C5Uz1Uf0KRBFmGmgD1NALOQdYDu5yPsTuY2yLzVYPvCIlYBMdUtE0uzfNq972SmkZHfZYs03jxQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/curve': 3.0.0 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/point': 3.0.1 + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/group@3.0.0(react@18.2.0): + resolution: {integrity: sha512-SFjXhTMcsaVAb1/TVL1KM5vn8gQTIVgSx0ATdDl4BJSFp2ym1lO8LY4jpV4SFweaHnWxVwrrfGLTn5QsYnvmjQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/point@3.0.1: + resolution: {integrity: sha512-S5WOBMgEP2xHcgs3A2BFB2vwzrk0tMmn3PGZAbQJ+lu4HlnalDP72klUnxLTH8xclNNvpUHtHM5eLIJXyHx6Pw==} + dev: false + + /@visx/react-spring@3.1.0(@react-spring/web@9.7.2)(react@18.2.0): + resolution: {integrity: sha512-8GHfXvJwnscGgf5UVCMeKw8Genq+cllcQJ8T6aAe1uC2ttYa2InmRIPsJEoA7VDLcxNIJgvw1bRd22QrgT9LtA==} + peerDependencies: + '@react-spring/web': ^9.4.5 + react: ^16.3.0-0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/web': 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@visx/axis': 3.1.0(react@18.2.0) + '@visx/grid': 3.0.1(react@18.2.0) + '@visx/scale': 3.0.0 + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/responsive@3.0.0(react@18.2.0): + resolution: {integrity: sha512-immnxQwOWlrxbnlCIqJWuDpPfrM6tglgMTN1WsyXyGluLMJqhuuxqxllfXaRPkQFS4fcvs66KCEELdazh96U2w==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/scale@3.0.0: + resolution: {integrity: sha512-WSf+wrxZEvu5TPGfGTafzzX1MbogbIxfD9ZKM9p7xfw65v23G0dNMy4bqVBUbOJigONoQkIZyqQ+gz5AJ/ioIg==} + dependencies: + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.3 + '@types/d3-time': 2.1.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-time: 2.1.1 + dev: false + + /@visx/shape@3.0.0(react@18.2.0): + resolution: {integrity: sha512-t6lpP9bIA1vwChDwiOUWl92ro29XF/M8IVNWRA0pm4LGxGGTACvxG3Agfcdi3JprahUVqPpnRCwuR36PDanq3Q==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-path': 1.0.9 + '@types/d3-shape': 1.3.8 + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + '@visx/curve': 3.0.0 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/scale': 3.0.0 + classnames: 2.3.2 + d3-path: 1.0.9 + d3-shape: 1.3.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/text@3.0.0(react@18.2.0): + resolution: {integrity: sha512-LW6v5T/gpd9RGw83/ScXncYc6IlcfzXTpaN8WbbxLRI65gdvSqrykwAMR0cbpQmzoVFuZXljqOf0QslHGnBg1w==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + classnames: 2.3.2 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + reduce-css-calc: 1.3.0 + dev: false + + /@visx/threshold@3.0.0(react@18.2.0): + resolution: {integrity: sha512-fEvn0kTjV9+GVOan+a9zodNjCuJggGiQtujcYEGb0ozjpKGI5peMye19JBAAChFukQ5smiW3L5a3mLJW3wUvoQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/clip-path': 3.0.0(react@18.2.0) + '@visx/shape': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/tooltip@3.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p46qztGRNkEDbxzc3V1virahvz3UQ29TzddUjA0oaTIBCrOd9UJuLvv1Tq9OpeUYPdbrO/ZRwaEeri2pbwv04Q==} + peerDependencies: + react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/bounds': 3.0.0(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@visx/voronoi@3.0.0(react@18.2.0): + resolution: {integrity: sha512-ySX7+Ic+irfgZQMij/0RJnryETonuKDWA3Upw3V6YtIiodPOEQ5w8FW8TvEbhaBlAUfSwQtHJ5ECvv3ZDrJa2A==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-voronoi': 1.1.9 + '@types/react': 18.2.14 + classnames: 2.3.2 + d3-voronoi: 1.1.4 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/xychart@3.1.2(@react-spring/web@9.7.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ra8BAPzchVgvVDEJSBKYd5Hi2xXZ+m8gnQxJlrDBUg/LnCMRXebQWIjjhDBfumOjXT255IELB/vPrUfeMZD9jA==} + peerDependencies: + '@react-spring/web': ^9.4.5 + react: ^16.8.0 || ^17.0.0 || ^ 18.0.0 + dependencies: + '@react-spring/web': 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + '@visx/annotation': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@visx/axis': 3.1.0(react@18.2.0) + '@visx/event': 3.0.1 + '@visx/glyph': 3.0.0(react@18.2.0) + '@visx/grid': 3.0.1(react@18.2.0) + '@visx/react-spring': 3.1.0(@react-spring/web@9.7.2)(react@18.2.0) + '@visx/responsive': 3.0.0(react@18.2.0) + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + '@visx/tooltip': 3.1.2(react-dom@18.2.0)(react@18.2.0) + '@visx/voronoi': 3.0.0(react@18.2.0) + classnames: 2.3.2 + d3-array: 2.12.1 + d3-interpolate-path: 2.2.1 + d3-shape: 2.1.0 + lodash: 4.17.21 + mitt: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@vitejs/plugin-react-swc@3.1.0(vite@4.3.9): + resolution: {integrity: sha512-xnDULNrkEbtTtRNnMPp+RsuIuIbk1JJV0xY7irchYyv9JJS4uvmc1EYip+qyrnkcX7TQ9c8vCS3AmkQqADI0Fw==} + peerDependencies: + vite: ^4 + dependencies: + '@swc/core': 1.3.77 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@vitejs/plugin-react@3.1.0(vite@4.3.9): + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + magic-string: 0.27.0 + react-refresh: 0.14.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-react@4.0.1(vite@4.3.9): + resolution: {integrity: sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + react-refresh: 0.14.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.32.2: + resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} + dependencies: + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.32.2: + resolution: {integrity: sha512-06vEL0C1pomOEktGoLjzZw+1Fb+7RBRhmw/06WkDrd1akkT9i12su0ku+R/0QM69dfkIL/rAIDTG+CSuQVDcKw==} + dependencies: + '@vitest/utils': 0.32.2 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.32.2: + resolution: {integrity: sha512-JwhpeH/PPc7GJX38vEfCy9LtRzf9F4er7i4OsAJyV7sjPwjj+AIR8cUgpMTWK4S3TiamzopcTyLsZDMuldoi5A==} + dependencies: + magic-string: 0.30.2 + pathe: 1.1.1 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.32.2: + resolution: {integrity: sha512-Q/ZNILJ4ca/VzQbRM8ur3Si5Sardsh1HofatG9wsJY1RfEaw0XKP8IVax2lI1qnrk9YPuG9LA2LkZ0EI/3d4ug==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.32.2: + resolution: {integrity: sha512-lnJ0T5i03j0IJaeW73hxe2AuVnZ/y1BhhCOuIcl9LIzXnbpXJT9Lrt6brwKHXLOiA7MZ6N5hSJjt0xE1dGNCzQ==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /@wagmi/chains@1.2.0(typescript@5.1.3): + resolution: {integrity: sha512-dmDRipsE54JfyudOBkuhEexqQWcrZqxn/qiujG8SBzMh/az/AH5xlJSA+j1CPWTx9+QofSMF3B7A4gb6XRmSaQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /@wagmi/chains@1.4.0(typescript@5.1.3): + resolution: {integrity: sha512-9HwJrhcZ1TxyrCbE10y7s1eSiSiyfGam7AHIOLYExaOX+vpOZ+MNTt4orFEDbEpz1fxwJDPPI38lanAUix1OSA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /@wagmi/connectors@2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-klF31togMDd0qQqEcLl5cCGxjMbL0RRXQ8I1vxmEa3KdGzw6Z3ICVzX7/bDfnNEZcOW7BKyAnZDq7rCt5jTOiw==} + peerDependencies: + '@wagmi/chains': '>=1.3.0' + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + '@wagmi/chains': + optional: true + typescript: + optional: true + dependencies: + '@coinbase/wallet-sdk': 3.7.1 + '@ledgerhq/connect-kit-loader': 1.1.2 + '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.3) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.3) + '@wagmi/chains': 1.4.0(typescript@5.1.3) + '@walletconnect/ethereum-provider': 2.8.6(@walletconnect/modal@2.5.9) + '@walletconnect/legacy-provider': 2.0.0 + '@walletconnect/modal': 2.5.9(react@18.2.0) + '@walletconnect/utils': 2.8.6 + abitype: 0.8.7(typescript@5.1.3) + eventemitter3: 4.0.7 + typescript: 5.1.3 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - react + - supports-color + - utf-8-validate + - zod + dev: false + + /@wagmi/core@1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-TXv9ZlRR5aySfERFuWMuo+lKXC/CoqtxVJZVHPqhK1jY+nldMx3AvrWzzF4CccRaMYcVdvPFepvmxzq2A2VvWg==} + peerDependencies: + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@wagmi/chains': 1.4.0(typescript@5.1.3) + '@wagmi/connectors': 2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + abitype: 0.8.7(typescript@5.1.3) + eventemitter3: 4.0.7 + typescript: 5.1.3 + viem: 1.1.6(typescript@5.1.3) + zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react + - supports-color + - utf-8-validate + - zod + dev: false + + /@walletconnect/core@2.10.0: + resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/core@2.8.6: + resolution: {integrity: sha512-rnSqm1KJLcww/v6+UH8JeibQkJ3EKgyUDPfEK0stSEkrIUIcXaFlq3Et8S+vgV8bPhI0MVUhAhFL5OJZ3t2ryg==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/crypto@1.0.3: + resolution: {integrity: sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + '@walletconnect/randombytes': 1.0.3 + aes-js: 3.1.2 + hash.js: 1.1.7 + tslib: 1.14.1 + dev: false + + /@walletconnect/encoding@1.0.2: + resolution: {integrity: sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==} + dependencies: + is-typedarray: 1.0.0 + tslib: 1.14.1 + typedarray-to-buffer: 3.1.5 + dev: false + + /@walletconnect/environment@1.0.1: + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/ethereum-provider@2.8.6(@walletconnect/modal@2.5.9): + resolution: {integrity: sha512-wUvJEsXTLmMihrOhQxAs1k9hrWEOT03QBn54P9r9GpJbJ1zEfIjQaXFfi8uup6gldhH+vN38PsbOiLyv/6d3qQ==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.5.9(react@18.2.0) + '@walletconnect/sign-client': 2.8.6 + '@walletconnect/types': 2.8.6 + '@walletconnect/universal-provider': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/events@1.0.1: + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/heartbeat@1.2.1: + resolution: {integrity: sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-http-connection@1.0.7: + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + dev: false + + /@walletconnect/jsonrpc-provider@1.0.13: + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-types@1.0.3: + resolution: {integrity: sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-utils@1.0.8: + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-ws-connection@1.0.13: + resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + tslib: 1.14.1 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@walletconnect/keyvaluestorage@1.0.2: + resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + lokijs: 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + lokijs: + optional: true + dependencies: + safe-json-utils: 1.1.1 + tslib: 1.14.1 + dev: false + + /@walletconnect/legacy-client@2.0.0: + resolution: {integrity: sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA==} + dependencies: + '@walletconnect/crypto': 1.0.3 + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + dev: false + + /@walletconnect/legacy-modal@2.0.0: + resolution: {integrity: sha512-jckNd8lMhm4X7dX9TDdxM3bXKJnaqkRs6K2Mo5j6GmbIF9Eyx40jZ5+q457RVxvM6ciZEDT5s1wBHWdWoOo+9Q==} + dependencies: + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + copy-to-clipboard: 3.3.3 + preact: 10.17.0 + qrcode: 1.5.3 + dev: false + + /@walletconnect/legacy-provider@2.0.0: + resolution: {integrity: sha512-A8xPebMI1A+50HbWwTpFCbwP7G+1NGKdTKyg8BUUg3h3Y9JucpC1W6w/x0v1Xw7qFEqQnz74LoIN/A3ytH9xrQ==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/legacy-client': 2.0.0 + '@walletconnect/legacy-modal': 2.0.0 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@walletconnect/legacy-types@2.0.0: + resolution: {integrity: sha512-sOVrA7HUdbI1OwKyPOQU0/DdvTSVFlsXWpAk2K2WvP2erTkBWPMTJq6cv2BmKdoJ3p6gLApT7sd+jHi3OF71uw==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + dev: false + + /@walletconnect/legacy-utils@2.0.0: + resolution: {integrity: sha512-CPWxSVVXw0kgNCxvU126g4GiV3mzXmC8IPJ15twE46aJ1FX+RHEIfAzFMFz2F2+fEhBxL63A7dwNQKDXorRPcQ==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + dev: false + + /@walletconnect/logger@2.0.1: + resolution: {integrity: sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==} + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/modal-core@2.5.9(react@18.2.0): + resolution: {integrity: sha512-isIebwF9hOknGouhS/Ob4YJ9Sa/tqNYG2v6Ua9EkCqIoLimepkG5eC53tslUWW29SLSfQ9qqBNG2+iE7yQXqgw==} + dependencies: + buffer: 6.0.3 + valtio: 1.10.6(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/modal-ui@2.5.9(react@18.2.0): + resolution: {integrity: sha512-nfBaAT9Ls7RZTBBgAq+Nt/3AoUcinIJ9bcq5UHXTV3lOPu/qCKmUC/0HY3GvUK8ykabUAsjr0OAGmcqkB91qug==} + dependencies: + '@walletconnect/modal-core': 2.5.9(react@18.2.0) + lit: 2.7.5 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/modal@2.5.9(react@18.2.0): + resolution: {integrity: sha512-Zs2RvPwbBNRdBhb50FuJCxi3FJltt1KSpI7odjU/x9GTpTOcSOkmR66PBCy2JvNA0+ztnS1Xs0LVEr3lu7/Jzw==} + dependencies: + '@walletconnect/modal-core': 2.5.9(react@18.2.0) + '@walletconnect/modal-ui': 2.5.9(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/randombytes@1.0.3: + resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + randombytes: 2.1.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/relay-api@1.0.9: + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + dev: false + + /@walletconnect/relay-auth@1.0.4: + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + dev: false + + /@walletconnect/safe-json@1.0.2: + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/sign-client@2.10.0: + resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} + dependencies: + '@walletconnect/core': 2.10.0 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/sign-client@2.8.6: + resolution: {integrity: sha512-rOFTKTHP7oJfXgYHX7+SdB8VbcsEE3ZFG/bMdmZboWaBim1mrY3vUyDdKrNr0VgI3AwBiEQezQDfKxBX0pMSQQ==} + dependencies: + '@walletconnect/core': 2.8.6 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/time@1.0.2: + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/types@2.10.0: + resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/types@2.8.6: + resolution: {integrity: sha512-Z/PFa3W1XdxeTcCtdR6lUsFgZfU/69wWJBPyclPwn7cu1+eriuCr6XZXQpJjib3flU+HnwHiXeUuqZaheehPxw==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/universal-provider@2.8.6: + resolution: {integrity: sha512-ln1RVv8+oHu9enOJ/oVkjiarneB+4vJCk16znOklIN2JtDHwB8iObDHlQH3UE6ynNTw1iRvaGuPR4g+YdIfB6w==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.8.6 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/utils@2.10.0: + resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/utils@2.8.6: + resolution: {integrity: sha512-wcy6e5+COYo7tfNnW8YqidnATdJDIW6vDiWWE7A1F78Sl/VflkaevB9cIgyn8eLdxC1SxXgGoeC2oLP90nnHJg==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/window-getters@1.0.1: + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/window-metadata@1.0.1: + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + dev: false + + /@web-std/blob@3.0.4: + resolution: {integrity: sha512-+dibyiw+uHYK4dX5cJ7HA+gtDAaUUe6JsOryp2ZpAC7h4ICsh49E34JwHoEKPlPvP0llCrNzz45vvD+xX5QDBg==} + dependencies: + '@web-std/stream': 1.0.0 + web-encoding: 1.1.5 + dev: true + + /@web-std/fetch@3.0.3: + resolution: {integrity: sha512-PtaKr6qvw2AmKChugzhQWuTa12dpbogHRBxwcleAZ35UhWucnfD4N+g3f7qYK2OeioSWTK3yMf6n/kOOfqxHaQ==} + engines: {node: ^10.17 || >=12.3} + dependencies: + '@web-std/blob': 3.0.4 + '@web-std/form-data': 3.0.2 + '@web3-storage/multipart-parser': 1.0.0 + data-uri-to-buffer: 3.0.1 + dev: true + + /@web-std/fetch@4.1.2: + resolution: {integrity: sha512-NUX+nnCTjC6URLtFC2O9dX9FtzCS5nlbF/vZwkPlheq5h6+rQxluH/aO+ORbLjGY4z4iQOulfEGoHcXwx5GFUQ==} + engines: {node: ^10.17 || >=12.3} + dependencies: + '@web-std/blob': 3.0.4 + '@web-std/form-data': 3.0.2 + '@web-std/stream': 1.0.1 + '@web3-storage/multipart-parser': 1.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + dev: true + + /@web-std/file@3.0.2: + resolution: {integrity: sha512-pIH0uuZsmY8YFvSHP1NsBIiMT/1ce0suPrX74fEeO3Wbr1+rW0fUGEe4d0R99iLwXtyCwyserqCFI4BJkJlkRA==} + dependencies: + '@web-std/blob': 3.0.4 + dev: true + + /@web-std/form-data@3.0.2: + resolution: {integrity: sha512-rhc8IRw66sJ0FHcnC84kT3mTN6eACTuNftkt1XSl1Ef6WRKq4Pz65xixxqZymAZl1K3USpwhLci4SKNn4PYxWQ==} + dependencies: + web-encoding: 1.1.5 + dev: true + + /@web-std/stream@1.0.0: + resolution: {integrity: sha512-jyIbdVl+0ZJyKGTV0Ohb9E6UnxP+t7ZzX4Do3AHjZKxUXKMs9EmqnBDQgHF7bEw0EzbQygOjtt/7gvtmi//iCQ==} + dependencies: + web-streams-polyfill: 3.2.1 + dev: true + + /@web-std/stream@1.0.1: + resolution: {integrity: sha512-tsz4Y0WNDgFA5jwLSeV7/UV5rfMIlj0cPsSLVfTihjaVW0OJPd5NxJ3le1B3yLyqqzRpeG5OAfJAADLc4VoGTA==} + dependencies: + web-streams-polyfill: 3.2.1 + dev: true + + /@web3-storage/multipart-parser@1.0.0: + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + dev: true + + /@web3-storage/parse-link-header@3.1.0: + resolution: {integrity: sha512-K1undnK70vLLauqdE8bq/l98isTF2FDhcP0UPpXVSjkSWe3xhAn5eRXk5jfA1E5ycNm84Ws/rQFUD7ue11nciw==} + dev: true + + /@web3modal/core@2.4.3(react@18.2.0): + resolution: {integrity: sha512-7Z/sDe9RIYQ2k9ITcxgEa/u7FvlI76vcVVZn9UY4ISivefqrH4JAS3GX4JmVNUUlovwuiZdyqBv4llAQOMK6Rg==} + dependencies: + buffer: 6.0.3 + valtio: 1.10.5(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@web3modal/standalone@2.4.3(react@18.2.0): + resolution: {integrity: sha512-5ATXBoa4GGm+TIUSsKWsfWCJunv1XevOizpgTFhqyeGgRDmWhqsz9UIPzH/1mk+g0iJ/xqMKs5F6v9D2QeKxag==} + deprecated: This package has been deprecated in favor of @walletconnect/modal. Please read more at https://docs.walletconnect.com + dependencies: + '@web3modal/core': 2.4.3(react@18.2.0) + '@web3modal/ui': 2.4.3(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@web3modal/ui@2.4.3(react@18.2.0): + resolution: {integrity: sha512-J989p8CdtEhI9gZHf/rZ/WFqYlrAHWw9GmAhFoiNODwjAp0BoG/uoaPiijJMchXdngihZOjLGCQwDXU16DHiKg==} + dependencies: + '@web3modal/core': 2.4.3(react@18.2.0) + lit: 2.7.5 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - react + dev: false + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@zxing/text-encoding@0.9.0: + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + requiresBuild: true + dev: true + optional: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: false + + /abitype@0.8.7(typescript@5.1.3): + resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: false + + /aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + dev: false + + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + dev: false + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /any-signal@2.1.2: + resolution: {integrity: sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==} + dependencies: + abort-controller: 3.0.0 + native-abort-controller: 1.0.4(abort-controller@3.0.0) + dev: true + + /any-signal@3.0.1: + resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.1 + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.5 + util: 0.12.5 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: true + + /async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + dependencies: + tslib: 2.6.1 + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axe-core@4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + dev: true + + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.1.3: + resolution: {integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + + /babel-loader@9.1.2(@babel/core@7.22.5)(webpack@5.88.2): + resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.22.5 + find-cache-dir: 3.3.2 + schema-utils: 4.2.0 + webpack: 5.88.2 + dev: true + + /babel-plugin-styled-components@2.1.4(@babel/core@7.22.5)(styled-components@5.3.11): + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: true + + /balanced-match@0.4.2: + resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: false + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + /bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bind-decorator@1.0.11: + resolution: {integrity: sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg==} + dev: false + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bip32@2.0.6: + resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} + engines: {node: '>=6.0.0'} + dependencies: + '@types/node': 10.12.18 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + tiny-secp256k1: 1.1.6 + typeforce: 1.18.0 + wif: 2.0.6 + dev: false + + /bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /blob-to-it@1.0.4: + resolution: {integrity: sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==} + dependencies: + browser-readablestream-to-it: 1.0.3 + dev: true + + /blockstore-core@1.0.5: + resolution: {integrity: sha512-i/9CUMMvBALVbtSqUIuiWB3tk//a4Q2I2CEWiBuYNnhJvk/DWplXjLt8Sqc5VGkRVXVPSsEuH8fUtqJt5UFYcA==} + dependencies: + err-code: 3.0.1 + interface-blockstore: 2.0.3 + interface-store: 2.0.2 + it-all: 1.0.6 + it-drain: 1.0.5 + it-filter: 1.0.3 + it-take: 1.0.2 + multiformats: 9.9.0 + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: false + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + + /borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + dependencies: + '@babel/runtime': 7.22.10 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + dev: false + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: false + + /browser-readablestream-to-it@1.0.3: + resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001521 + electron-to-chromium: 1.4.495 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: false + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /bufferutil@4.0.7: + resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + dev: false + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + /caniuse-lite@1.0.30001521: + resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} + + /carbites@1.0.6: + resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} + dependencies: + '@ipld/car': 3.2.4 + '@ipld/dag-cbor': 6.0.15 + '@ipld/dag-pb': 2.1.18 + multiformats: 9.9.0 + dev: true + + /cborg@1.10.2: + resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} + hasBin: true + dev: true + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: true + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + dev: true + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /cmdk@0.2.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + command-score: 0.1.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: true + + /command-score@0.1.2: + resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.4 + well-known-symbols: 2.0.0 + dev: true + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.15 + dev: false + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /cosmjs-types@0.5.2: + resolution: {integrity: sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmjs-types@0.7.2: + resolution: {integrity: sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmjs-types@0.8.0: + resolution: {integrity: sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmos-directory-client@0.0.6: + resolution: {integrity: sha512-WIdaQ8uW1vIbYvNnAVunkC6yxTrneJC7VQ5UUQ0kuw8b0C0A39KTIpoQHCfc8tV7o9vF4niwRhdXEdfAgQEsQQ==} + dependencies: + cosmos-directory-types: 0.0.6 + node-fetch-native: 1.4.0 + dev: false + + /cosmos-directory-types@0.0.6: + resolution: {integrity: sha512-9qlQ3kTNTHvhYglTXSnllGqKhrtGB08Weatw56ZqV5OqcmjuZdlY9iMtD00odgQLTEpTSQQL3gFGuqTkGdIDPA==} + dev: false + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js@4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate-path@2.2.1: + resolution: {integrity: sha512-6qLLh/KJVzls0XtMsMpcxhqMhgVEN7VIbR/6YGZe2qlS8KDgyyVB20XcmGnDyB051HcefQXM/Tppa9vcANEA4Q==} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + + /d3-path@2.0.0: + resolution: {integrity: sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 2.1.1 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + + /d3-shape@2.1.0: + resolution: {integrity: sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==} + dependencies: + d3-path: 2.0.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 2.1.1 + dev: false + + /d3-time@2.1.1: + resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + dependencies: + d3-array: 2.12.1 + dev: false + + /d3-voronoi@1.1.4: + resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + dev: true + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false + + /decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /delay@4.4.1: + resolution: {integrity: sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==} + engines: {node: '>=6'} + dev: false + + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dns-over-http-resolver@1.2.3(node-fetch@3.3.1): + resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + native-fetch: 3.0.0(node-fetch@3.3.1) + receptacle: 1.3.2 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.1 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-fetch@1.9.1: + resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} + engines: {node: '>=6'} + dependencies: + encoding: 0.1.13 + dev: true + + /electron-to-chromium@1.4.495: + resolution: {integrity: sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: true + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.43.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + object.assign: 4.1.4 + object.entries: 1.1.6 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb-typescript@17.0.0(@typescript-eslint/eslint-plugin@5.60.0)(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.13.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + dependencies: + '@typescript-eslint/eslint-plugin': 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + eslint: 8.43.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + dev: true + + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.27.5)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.2)(eslint@8.43.0): + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + dependencies: + eslint: 8.43.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.43.0) + eslint-plugin-react: 7.32.2(eslint@8.43.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.43.0) + object.assign: 4.1.4 + object.entries: 1.1.6 + dev: true + + /eslint-config-prettier@8.8.0(eslint@8.43.0): + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-config-standard-with-typescript@35.0.0(@typescript-eslint/eslint-plugin@5.60.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-Xa7DY9GgduZyp0qmXxBF0/dB+Vm4/DgWu1lGpNLJV2d46aCaUxTKDEnkzjUWX/1O9S0a+Dhnw7A4oI0JpYzwtw==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.50.0 + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + typescript: '*' + dependencies: + '@typescript-eslint/eslint-plugin': 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + eslint: 8.43.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-n: 16.0.0(eslint@8.43.0) + eslint-plugin-promise: 6.1.1(eslint@8.43.0) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0): + resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.43.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-n: 16.0.0(eslint@8.43.0) + eslint-plugin-promise: 6.1.1(eslint@8.43.0) + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + enhanced-resolve: 5.15.0 + eslint: 8.43.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + get-tsconfig: 4.7.0 + globby: 13.2.2 + is-core-module: 2.13.0 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 3.2.7 + eslint: 8.43.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es-x@6.2.1(eslint@8.43.0): + resolution: {integrity: sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/regexpp': 4.6.2 + eslint: 8.43.0 + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.43.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.4 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.22.10 + aria-query: 5.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.7.2 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.43.0 + has: 1.0.3 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.1 + dev: true + + /eslint-plugin-n@16.0.0(eslint@8.43.0): + resolution: {integrity: sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + builtins: 5.0.1 + eslint: 8.43.0 + eslint-plugin-es-x: 6.2.1(eslint@8.43.0) + ignore: 5.2.4 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.43.0 + eslint-config-prettier: 8.8.0(eslint@8.43.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.43.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.43.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-plugin-react@7.32.2(eslint@8.43.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.43.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.43.0: + resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.43.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + dev: true + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: true + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + dev: true + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.7 + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eth-block-tracker@6.1.0: + resolution: {integrity: sha512-K9SY8+/xMBi4M5HHTDdxnpEqEEGjbNpzHFqvxyjMZej8InV/B+CkFRKM6W+uvrFJ7m8Zd1E0qUkseU3vdIDFYQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@metamask/utils': 3.6.0 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /eth-json-rpc-filters@5.1.0: + resolution: {integrity: sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + dev: false + + /eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + dev: false + + /eth-rpc-errors@4.0.2: + resolution: {integrity: sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: false + + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + dev: false + + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /ethers@6.6.1: + resolution: {integrity: sha512-bjNPf/EU4l1jQlAslOmOlyHqjOnM0W7LRPuSf0Kt0tYV4RpUEZsdGWDhvFXfogIhfzXJ/v2tPz4HqXwBt5T8mA==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.9.2 + '@noble/hashes': 1.1.2 + '@noble/secp256k1': 1.7.1 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-fifo@1.3.0: + resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /files-from-path@0.2.6: + resolution: {integrity: sha512-Mz4UNkv+WcRLxcCXAORbfpwYiXI60SN9C1ZfeyGFv0xQUmblgbOkSWwFwX+Ov/TaR3FEyzwDyPnCQjpPRGSxKA==} + dependencies: + err-code: 3.0.1 + graceful-fs: 4.2.11 + ipfs-unixfs: 6.0.9 + it-glob: 0.0.13 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /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.*} + dev: false + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-iterator@1.0.2: + resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-port@6.1.2: + resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-regex@0.3.2: + resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==} + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /graz@0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cLHdOeYxwyvU8c/9eByK5m23XJH4L3mwZU58OIehNwnBGGF2kQQ0TyAviZ8XH+EPhgp/bzVOvgX+e/8FvwzxHg==} + hasBin: true + peerDependencies: + react: '>=17' + dependencies: + '@cosmjs/cosmwasm-stargate': 0.30.1 + '@cosmjs/launchpad': 0.27.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@keplr-wallet/cosmos': 0.11.64 + '@keplr-wallet/types': 0.11.64 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.32.6(@tanstack/react-query@4.32.6)(react-dom@18.2.0)(react@18.2.0) + '@walletconnect/sign-client': 2.10.0 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + '@web3modal/standalone': 2.4.3(react@18.2.0) + arg: 5.0.2 + cosmos-directory-client: 0.0.6 + react: 18.2.0 + zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - debug + - immer + - lokijs + - react-dom + - react-native + - utf-8-validate + dev: false + + /hamt-sharding@2.0.1: + resolution: {integrity: sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + dependencies: + sparse-array: 1.3.2 + uint8arrays: 3.1.1 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: false + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: true + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.5 + dev: true + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.5 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: true + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: true + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: true + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: true + + /hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.22.10 + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + + /interface-blockstore@2.0.3: + resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} + dependencies: + interface-store: 2.0.2 + multiformats: 9.9.0 + dev: true + + /interface-datastore@6.1.1: + resolution: {integrity: sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==} + dependencies: + interface-store: 2.0.2 + nanoid: 3.3.6 + uint8arrays: 3.1.1 + dev: true + + /interface-store@2.0.2: + resolution: {integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /intl-messageformat@10.5.0: + resolution: {integrity: sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/fast-memoize': 2.2.0 + '@formatjs/icu-messageformat-parser': 2.6.0 + tslib: 2.6.1 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /ipfs-car@0.7.0(node-fetch@3.3.1): + resolution: {integrity: sha512-9ser6WWZ1ZMTCGbcVkRXUzOrpQ4SIiLfzIEnk+3LQsXbV09yeZg3ijhRuEXozEIYE68Go9JmOFshamsK9iKlNQ==} + hasBin: true + dependencies: + '@ipld/car': 3.2.4 + '@web-std/blob': 3.0.4 + bl: 5.1.0 + blockstore-core: 1.0.5 + browser-readablestream-to-it: 1.0.3 + idb-keyval: 6.2.1 + interface-blockstore: 2.0.3 + ipfs-core-types: 0.8.4(node-fetch@3.3.1) + ipfs-core-utils: 0.12.2(node-fetch@3.3.1) + ipfs-unixfs-exporter: 7.0.11 + ipfs-unixfs-importer: 9.0.10 + ipfs-utils: 9.0.14 + it-all: 1.0.6 + it-last: 1.0.6 + it-pipe: 1.1.0 + meow: 9.0.0 + move-file: 2.1.0 + multiformats: 9.9.0 + stream-to-it: 0.2.4 + streaming-iterables: 6.2.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /ipfs-core-types@0.8.4(node-fetch@3.3.1): + resolution: {integrity: sha512-sbRZA1QX3xJ6ywTiVQZMOxhlhp4osAZX2SXx3azOLxAtxmGWDMkHYt722VV4nZ2GyJy8qyk5GHQIZ0uvQnpaTg==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + interface-datastore: 6.1.1 + multiaddr: 10.0.1(node-fetch@3.3.1) + multiformats: 9.9.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /ipfs-core-utils@0.12.2(node-fetch@3.3.1): + resolution: {integrity: sha512-RfxP3rPhXuqKIUmTAUhmee6fmaV3A7LMnjOUikRKpSyqESz/DR7aGK7tbttMxkZdkSEr0rFXlqbyb0vVwmn0wQ==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + any-signal: 2.1.2 + blob-to-it: 1.0.4 + browser-readablestream-to-it: 1.0.3 + debug: 4.3.4(supports-color@5.5.0) + err-code: 3.0.1 + ipfs-core-types: 0.8.4(node-fetch@3.3.1) + ipfs-unixfs: 6.0.9 + ipfs-utils: 9.0.14 + it-all: 1.0.6 + it-map: 1.0.6 + it-peekable: 1.0.3 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiaddr: 10.0.1(node-fetch@3.3.1) + multiaddr-to-uri: 8.0.0(node-fetch@3.3.1) + multiformats: 9.9.0 + nanoid: 3.3.6 + parse-duration: 1.1.0 + timeout-abort-controller: 1.1.1 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /ipfs-unixfs-exporter@7.0.11: + resolution: {integrity: sha512-qTYa69J7HbI2EIYNUddKPg9Y3rHkYZV0bNdmzZKA5+ZbwRVoUEuBW/cguEqTp22zHygh3sMnzYZFm0naVIdMgQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-cbor': 7.0.3 + '@ipld/dag-pb': 2.1.18 + '@multiformats/murmur3': 1.1.3 + err-code: 3.0.1 + hamt-sharding: 2.0.1 + interface-blockstore: 2.0.3 + ipfs-unixfs: 6.0.9 + it-last: 1.0.6 + multiformats: 9.9.0 + uint8arrays: 3.1.1 + dev: true + + /ipfs-unixfs-importer@9.0.10: + resolution: {integrity: sha512-W+tQTVcSmXtFh7FWYWwPBGXJ1xDgREbIyI1E5JzDcimZLIyT5gGMfxR3oKPxxWj+GKMpP5ilvMQrbsPzWcm3Fw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-pb': 2.1.18 + '@multiformats/murmur3': 1.1.3 + bl: 5.1.0 + err-code: 3.0.1 + hamt-sharding: 2.0.1 + interface-blockstore: 2.0.3 + ipfs-unixfs: 6.0.9 + it-all: 1.0.6 + it-batch: 1.0.9 + it-first: 1.0.7 + it-parallel-batch: 1.0.11 + merge-options: 3.0.4 + multiformats: 9.9.0 + rabin-wasm: 0.1.5 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /ipfs-unixfs@6.0.9: + resolution: {integrity: sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + protobufjs: 6.11.4 + dev: true + + /ipfs-utils@9.0.14: + resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + any-signal: 3.0.1 + browser-readablestream-to-it: 1.0.3 + buffer: 6.0.3 + electron-fetch: 1.9.1 + err-code: 3.0.1 + is-electron: 2.2.2 + iso-url: 1.2.1 + it-all: 1.0.6 + it-glob: 1.0.2 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + nanoid: 3.3.6 + native-fetch: 3.0.0(node-fetch@2.6.12) + node-fetch: 2.6.12 + react-native-fetch-api: 3.0.0 + stream-to-it: 0.2.4 + transitivePeerDependencies: + - encoding + dev: true + + /ipns@0.16.0: + resolution: {integrity: sha512-fBYkRjN3/fc6IQujUF4WBEyOXegK715w+wx9IErV6H2B5JXsMnHOBceUKn3L90dj+wJfHs6T+hM/OZiTT6mQCw==} + dependencies: + cborg: 1.10.2 + debug: 4.3.4(supports-color@5.5.0) + err-code: 3.0.1 + interface-datastore: 6.1.1 + libp2p-crypto: 0.21.2 + long: 4.0.0 + multiformats: 9.9.0 + peer-id: 0.16.0 + protobufjs: 6.11.4 + timestamp-nano: 1.0.1 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: true + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + dependencies: + ip-regex: 4.3.0 + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-what@4.1.15: + resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} + engines: {node: '>=12.13'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /iso-random-stream@2.0.2: + resolution: {integrity: sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==} + engines: {node: '>=10'} + dependencies: + events: 3.3.0 + readable-stream: 3.6.2 + dev: true + + /iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + dev: true + + /isomorphic-ws@4.0.1(ws@7.5.9): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.9 + dev: false + + /isomorphic-ws@5.0.0(ws@8.12.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.12.0 + dev: false + + /it-all@1.0.6: + resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} + dev: true + + /it-batch@1.0.9: + resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} + dev: true + + /it-drain@1.0.5: + resolution: {integrity: sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg==} + dev: true + + /it-filter@1.0.3: + resolution: {integrity: sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w==} + dev: true + + /it-first@1.0.7: + resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} + dev: true + + /it-glob@0.0.13: + resolution: {integrity: sha512-0Hcd5BraJUPzL28NWiFbdNrcdyNxNTKKdU3sjdFiYynNTQpwlG2UKW31X7bp+XhJwux/oPzIquo5ioztVmc2RQ==} + dependencies: + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + dev: true + + /it-glob@1.0.2: + resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==} + dependencies: + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + dev: true + + /it-last@1.0.6: + resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} + dev: true + + /it-map@1.0.6: + resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} + dev: true + + /it-parallel-batch@1.0.11: + resolution: {integrity: sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==} + dependencies: + it-batch: 1.0.9 + dev: true + + /it-peekable@1.0.3: + resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} + dev: true + + /it-pipe@1.1.0: + resolution: {integrity: sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==} + dev: true + + /it-take@1.0.2: + resolution: {integrity: sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==} + dev: true + + /it-to-stream@1.0.0: + resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} + dependencies: + buffer: 6.0.3 + fast-fifo: 1.3.0 + get-iterator: 1.0.2 + p-defer: 3.0.0 + p-fifo: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /jayson@4.1.0: + resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.35 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.9) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.2 + dev: false + + /json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.6 + dev: true + + /keccak@3.0.3: + resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + readable-stream: 3.6.2 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: true + + /keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: true + + /koa-connect@2.1.0: + resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} + dev: true + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: true + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4(supports-color@5.5.0) + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libp2p-crypto@0.21.2: + resolution: {integrity: sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==} + engines: {node: '>=12.0.0'} + dependencies: + '@noble/ed25519': 1.7.3 + '@noble/secp256k1': 1.7.1 + err-code: 3.0.1 + iso-random-stream: 2.0.2 + multiformats: 9.9.0 + node-forge: 1.3.1 + protobufjs: 6.11.4 + uint8arrays: 3.1.1 + dev: true + + /libsodium-sumo@0.7.11: + resolution: {integrity: sha512-bY+7ph7xpk51Ez2GbE10lXAQ5sJma6NghcIDaSPbM/G9elfrjLa0COHl/7P6Wb/JizQzl5UQontOOP1z0VwbLA==} + dev: false + + /libsodium-wrappers-sumo@0.7.11: + resolution: {integrity: sha512-DGypHOmJbB1nZn89KIfGOAkDgfv5N6SBGC3Qvmy/On0P0WD1JQvNRS/e3UL3aFF+xC0m+MYz5M+MnRnK2HMrKQ==} + dependencies: + libsodium-sumo: 0.7.11 + dev: false + + /libsodium-wrappers@0.7.11: + resolution: {integrity: sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==} + dependencies: + libsodium: 0.7.11 + dev: false + + /libsodium@0.7.11: + resolution: {integrity: sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A==} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + dev: false + + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + dependencies: + '@types/trusted-types': 2.0.3 + dev: false + + /lit@2.7.5: + resolution: {integrity: sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==} + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + dev: false + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /luxon@3.3.0: + resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} + engines: {node: '>=12'} + dev: false + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true + + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.22.10 + remove-accents: 0.4.2 + dev: false + + /math-expression-evaluator@1.4.0: + resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + dev: false + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: true + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.12 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.12 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: true + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: true + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.12 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: true + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: true + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: true + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: true + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + '@types/unist': 2.0.7 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: true + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: true + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: true + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mitt@2.1.0: + resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} + dev: false + + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + + /motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/dom': 10.16.2 + '@motionone/svelte': 10.16.2 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + '@motionone/vue': 10.16.2 + dev: false + + /move-file@2.1.0: + resolution: {integrity: sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==} + engines: {node: '>=10.17'} + dependencies: + path-exists: 4.0.0 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multiaddr-to-uri@8.0.0(node-fetch@3.3.1): + resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} + deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri + dependencies: + multiaddr: 10.0.1(node-fetch@3.3.1) + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /multiaddr@10.0.1(node-fetch@3.3.1): + resolution: {integrity: sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==} + deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr + dependencies: + dns-over-http-resolver: 1.2.3(node-fetch@3.3.1) + err-code: 3.0.1 + is-ip: 3.1.0 + multiformats: 9.9.0 + uint8arrays: 3.1.1 + varint: 6.0.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + /murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: false + + /nano-time@1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + dependencies: + big-integer: 1.6.51 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /native-abort-controller@1.0.4(abort-controller@3.0.0): + resolution: {integrity: sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ==} + peerDependencies: + abort-controller: '*' + dependencies: + abort-controller: 3.0.0 + dev: true + + /native-fetch@3.0.0(node-fetch@2.6.12): + resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} + peerDependencies: + node-fetch: '*' + dependencies: + node-fetch: 2.6.12 + dev: true + + /native-fetch@3.0.0(node-fetch@3.3.1): + resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} + peerDependencies: + node-fetch: '*' + dependencies: + node-fetch: 3.3.1 + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-fetch-native@1.4.0: + resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} + dev: false + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.0 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + dev: false + + /on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /osmojs@15.5.0: + resolution: {integrity: sha512-7wy3QEYu+R+c8imfLEPS1PliYA8uw0qdFYjc2PToHteYG4hzYt4Noa7X0lM9O59s7nxo9ozT1N9z7uwB/1qHkA==} + dependencies: + '@babel/runtime': 7.22.10 + '@cosmjs/amino': 0.29.3 + '@cosmjs/proto-signing': 0.29.3 + '@cosmjs/stargate': 0.29.3 + '@cosmjs/tendermint-rpc': 0.29.5 + '@osmonauts/lcd': 0.10.0 + long: 5.2.3 + protobufjs: 6.11.4 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /p-defer@3.0.0: + resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} + engines: {node: '>=8'} + dev: true + + /p-fifo@1.0.0: + resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + dependencies: + fast-fifo: 1.3.0 + p-defer: 3.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-duration@1.1.0: + resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + dev: true + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.7 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /peer-id@0.16.0: + resolution: {integrity: sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==} + engines: {node: '>=15.0.0'} + dependencies: + class-is: 1.1.0 + libp2p-crypto: 0.21.2 + multiformats: 9.9.0 + protobufjs: 6.11.4 + uint8arrays: 3.1.1 + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: false + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: false + + /pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + dependencies: + duplexify: 4.1.2 + split2: 4.2.0 + dev: false + + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + dev: false + + /pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /pnpm@8.6.6: + resolution: {integrity: sha512-a51bIJyCmvstgCvsWf6SgZnsXfWmwAW1pHWEaH2gN3vqQGC58yLFL/oKBwcZWH0mjpMzBWRXdS9dLdN6GAK2Rw==} + engines: {node: '>=16.14'} + hasBin: true + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /preact@10.17.0: + resolution: {integrity: sha512-SNsI8cbaCcUS5tbv9nlXuCfIXnJ9ysBMWk0WnB6UWwcVA3qZ2O6FxqDFECMAMttvLQcW/HaNZUe2BLidyvrVYw==} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prism-react-renderer@1.3.5(react@18.2.0): + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + dependencies: + react: 18.2.0 + dev: true + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: true + + /protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 20.3.1 + long: 4.0.0 + + /proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /qr-code-styling@1.6.0-rc.1: + resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} + dependencies: + qrcode-generator: 1.4.4 + dev: false + + /qrcode-generator@1.4.4: + resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + dev: false + + /qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /query-string@6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /query-string@8.1.0: + resolution: {integrity: sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==} + engines: {node: '>=14.16'} + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /rabin-wasm@0.1.5: + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + hasBin: true + dependencies: + '@assemblyscript/loader': 0.9.4 + bl: 5.1.0 + debug: 4.3.4(supports-color@5.5.0) + minimist: 1.2.8 + node-fetch: 2.6.12 + readable-stream: 3.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /react-aria@3.25.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nvahN6tUCnES9CXCKEzEHkWy7mH39KsQoCk6eehIT3eG1pw/eYUqXFAmmWIL3g2VDCiGavpSf1/BUTnAXE2VsQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/breadcrumbs': 3.5.4(react@18.2.0) + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/calendar': 3.4.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/checkbox': 3.10.0(react@18.2.0) + '@react-aria/combobox': 3.6.3(react-dom@18.2.0)(react@18.2.0) + '@react-aria/datepicker': 3.6.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) + '@react-aria/dnd': 3.4.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/gridlist': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/link': 3.5.3(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/meter': 3.4.4(react@18.2.0) + '@react-aria/numberfield': 3.7.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/progress': 3.4.4(react@18.2.0) + '@react-aria/radio': 3.7.0(react@18.2.0) + '@react-aria/searchfield': 3.5.4(react@18.2.0) + '@react-aria/select': 3.12.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/separator': 3.3.4(react@18.2.0) + '@react-aria/slider': 3.6.0(react@18.2.0) + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/switch': 3.5.3(react@18.2.0) + '@react-aria/table': 3.11.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/tabs': 3.6.2(react@18.2.0) + '@react-aria/tag': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/tooltip': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-frame-component@5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4xpZFcLNS6LCEYSlWgsUy81v7LjdgbvB0VHIq7sNSD25PK+e5YYCrdy5557ebGwNLKNLEpYVfAkT3pVzFLPb1g==} + peerDependencies: + prop-types: ^15.5.9 + react: '>= 16.3' + react-dom: '>= 16.3' + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /react-inspector@6.0.2(react@18.2.0): + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-native-fetch-api@3.0.0: + resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} + dependencies: + p-defer: 3.0.0 + dev: true + + /react-number-format@5.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wCh64Z1HCwXcO2dbgkeYIaB+Rmp/fcsH8kAeRtUkc46dv1pIrgDjie2WkOqKBw8YqyqhwNdYgNFNQuuY+iGJ/g==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-query@3.39.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.22.10 + broadcast-channel: 3.7.0 + match-sorter: 6.3.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-redux@8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1): + resolution: {integrity: sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + dev: false + + /react-remove-scroll@2.5.4(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /react-router-dom@6.14.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.7.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.14.0(react@18.2.0) + dev: false + + /react-router@6.14.0(react@18.2.0): + resolution: {integrity: sha512-OD+vkrcGbvlwkspUFDgMzsu1RXwdjNh83YgG/28lBnDzgslhCgxIqoExLlxsfTpIygp7fc+Hd3esloNwzkm2xA==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.7.0 + react: 18.2.0 + dev: false + + /react-stately@3.23.0(react@18.2.0): + resolution: {integrity: sha512-nk2ihInebz5s+eDcXeEL+e2AbP9g0Mp9Gx5GEgqfICc8CKoYWERQsukXphGc6WEvFpAjVde7Q33hqusIqAO5gA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/calendar': 3.3.1(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/combobox': 3.6.0(react@18.2.0) + '@react-stately/data': 3.10.1(react@18.2.0) + '@react-stately/datepicker': 3.6.0(react@18.2.0) + '@react-stately/dnd': 3.2.3(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/numberfield': 3.6.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-stately/searchfield': 3.4.4(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/slider': 3.4.1(react@18.2.0) + '@react-stately/table': 3.9.1(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + dependencies: + debounce: 1.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /readonly-date@1.0.0: + resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + dev: false + + /real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + dev: false + + /receptacle@1.3.2: + resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} + dependencies: + ms: 2.1.3 + dev: true + + /recrawl-sync@2.2.3: + resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} + dependencies: + '@cush/relative': 1.0.0 + glob-regex: 0.3.2 + slash: 3.0.0 + sucrase: 3.34.0 + tslib: 1.14.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /reduce-css-calc@1.3.0: + resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==} + dependencies: + balanced-match: 0.4.2 + math-expression-evaluator: 1.4.0 + reduce-function-call: 1.0.3 + dev: false + + /reduce-function-call@1.0.3: + resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /redux-thunk@2.4.2(redux@4.2.1): + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: true + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: true + + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retimer@2.0.0: + resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: false + + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /rpc-websockets@7.6.0: + resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==} + dependencies: + '@babel/runtime': 7.22.10 + eventemitter3: 4.0.7 + uuid: 8.3.2 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.7 + utf-8-validate: 5.0.10 + dev: false + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-json-utils@1.1.1: + resolution: {integrity: sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==} + dev: false + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: true + + /sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: false + + /split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false + + /stream-to-it@0.2.4: + resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} + dependencies: + get-iterator: 1.0.2 + dev: true + + /streaming-iterables@6.2.0: + resolution: {integrity: sha512-3AYC8oB60WyD1ic7uHmN/vm2oRGzRnQ3XFBl/bFMDi1q1+nc5/vjMmiE4vroIya3jG59t87VpyAj/iXYxyw9AA==} + engines: {node: '>=10'} + dev: true + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + + /styled-components@5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.22.5)(styled-components@5.3.11) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /superjson@1.13.1: + resolution: {integrity: sha512-AVH2eknm9DEd3qvxM4Sq+LTCkSXE2ssfh1t11MHMXyYXFQyQ1HLgVvV+guLTsaQnJU3gnaVo34TohHPulY/wLg==} + engines: {node: '>=10'} + dependencies: + copy-anything: 3.0.5 + dev: false + + /superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + dev: false + + /superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /symbol-observable@2.0.3: + resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} + engines: {node: '>=0.10'} + dev: false + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.1 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + dependencies: + real-require: 0.1.0 + dev: false + + /throttled-queue@2.1.4: + resolution: {integrity: sha512-YGdk8sdmr4ge3g+doFj/7RLF5kLM+Mi7DEciu9PHxnMJZMeVuZeTj31g4VE7ekUffx/IdbvrtOCiz62afg0mkg==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /timeout-abort-controller@1.1.1: + resolution: {integrity: sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==} + dependencies: + abort-controller: 3.0.0 + retimer: 2.0.0 + dev: true + + /timestamp-nano@1.0.1: + resolution: {integrity: sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==} + engines: {node: '>= 4.5.0'} + dev: true + + /tiny-secp256k1@1.1.6: + resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} + engines: {node: '>=6.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + bn.js: 4.12.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + nan: 2.17.0 + dev: false + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: true + + /tsutils@3.21.0(typescript@5.1.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.1.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + dev: false + + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.7 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: true + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: true + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: true + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: true + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + + /unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + dependencies: + '@babel/runtime': 7.22.10 + detect-node: 2.1.0 + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /url-polyfill@1.1.12: + resolution: {integrity: sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==} + dev: true + + /use-callback-ref@1.3.0(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /valtio@1.10.5(react@18.2.0): + resolution: {integrity: sha512-jTp0k63VXf4r5hPoaC6a6LCG4POkVSh629WLi1+d5PlajLsbynTMd7qAgEiOSPxzoX5iNvbN7iZ/k/g29wrNiQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /valtio@1.10.6(react@18.2.0): + resolution: {integrity: sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.7 + vfile: 5.3.7 + dev: true + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-stringify-position: 3.0.3 + dev: true + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.7 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: true + + /viem@1.1.6(typescript@5.1.3): + resolution: {integrity: sha512-7nK3HMucLr1Yz0QnDXiD6viigKS6QeYD/YhRHpi3Bby/g0hCyZqK8+YJNtp3/Ri64tpl4kaTIeCScJWV2jqXHQ==} + peerDependencies: + typescript: '>=5.0.4' + dependencies: + '@adraffy/ens-normalize': 1.9.0 + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.0 + '@scure/bip32': 1.3.0 + '@scure/bip39': 1.2.0 + '@wagmi/chains': 1.2.0(typescript@5.1.3) + abitype: 0.8.7(typescript@5.1.3) + isomorphic-ws: 5.0.0(ws@8.12.0) + typescript: 5.1.3 + ws: 8.12.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /vite-node@0.32.2(@types/node@20.3.1): + resolution: {integrity: sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@5.5.0) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-svgr@3.2.0(vite@4.3.9): + resolution: {integrity: sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 + dependencies: + '@rollup/pluginutils': 5.0.3 + '@svgr/core': 7.0.0 + '@svgr/plugin-jsx': 7.0.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /vite-tsconfig-paths@3.6.0(vite@4.3.9): + resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} + peerDependencies: + vite: '>2.0.0-0' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + globrex: 0.1.2 + recrawl-sync: 2.2.3 + tsconfig-paths: 4.2.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@4.3.9(@types/node@20.3.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.17.19 + postcss: 8.4.28 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.32.2: + resolution: {integrity: sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.3.1 + '@vitest/expect': 0.32.2 + '@vitest/runner': 0.32.2 + '@vitest/snapshot': 0.32.2 + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4(supports-color@5.5.0) + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.5.0 + vite: 4.3.9(@types/node@20.3.1) + vite-node: 0.32.2(@types/node@20.3.1) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /w3name@1.0.8: + resolution: {integrity: sha512-MjCUGATeNm70YE1Zro4mykaoRI9dTTlr44AB83Qt6OaRlcLvH9g0gyLwAMd3gBm8oDVU/RrDAxsDGcO8r+RIuQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@web-std/fetch': 4.1.2 + cborg: 1.10.2 + ipns: 0.16.0 + libp2p-crypto: 0.21.2 + throttled-queue: 2.1.4 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /wagmi@1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-n4Qwby0QB8/JSGjc0gGn4MWZ0BT229agEg6saPGS6VswmPjJLdkLq9qxKn1JptXxPREmb/ZvwHxU++3Z+gQJVA==} + peerDependencies: + react: '>=17.0.0' + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@tanstack/query-sync-storage-persister': 4.32.6 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': 4.32.6(@tanstack/react-query@4.32.6) + '@wagmi/core': 1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + abitype: 0.8.7(typescript@5.1.3) + react: 18.2.0 + typescript: 5.1.3 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react-dom + - react-native + - supports-color + - utf-8-validate + - zod + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + dev: true + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: true + + /web3.storage@4.5.4(node-fetch@3.3.1): + resolution: {integrity: sha512-QSdiPEMgXCkk9Y0y3U1pyTu8n1TOOctwq7h9Loz7NYPla9QZesbg4lSxe0XWPltzyJEkI43yC1hy8gNxNEiizA==} + dependencies: + '@ipld/car': 3.2.4 + '@web-std/blob': 3.0.4 + '@web-std/fetch': 3.0.3 + '@web-std/file': 3.0.2 + '@web3-storage/parse-link-header': 3.1.0 + browser-readablestream-to-it: 1.0.3 + carbites: 1.0.6 + cborg: 1.10.2 + files-from-path: 0.2.6 + ipfs-car: 0.7.0(node-fetch@3.3.1) + libp2p-crypto: 0.21.2 + p-retry: 4.6.2 + streaming-iterables: 6.2.0 + throttled-queue: 2.1.4 + uint8arrays: 3.1.1 + w3name: 1.0.8 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: true + + /wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + dependencies: + bs58check: 2.1.2 + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.12.0: + resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + bufferutil: 4.0.7 + utf-8-validate: 5.0.10 + dev: false + + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xstream@11.14.0: + resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + dependencies: + globalthis: 1.0.3 + symbol-observable: 2.0.3 + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zustand@4.4.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true diff --git a/public/.well-known/apple-app-site-association b/public/.well-known/apple-app-site-association new file mode 100644 index 0000000..5327918 --- /dev/null +++ b/public/.well-known/apple-app-site-association @@ -0,0 +1,81 @@ +{ + "applinks": { + "apps": [], + "details": [ + { + "appIDs": [ + "75C6UARB5H.exchangeV4.dydx.trading" + ], + "components": [ + { + "/": "/trade/*" + }, + { + "/": "/r/*" + }, + { + "/": "/portfolio/overview" + }, + { + "/": "/portfolio/positions" + }, + { + "/": "/portfolio/orders" + }, + { + "/": "/portfolio/fees" + }, + { + "/": "/portfolio/history" + }, + { + "/": "/portfolio/history/trades" + }, + { + "/": "/portfolio/history/transfers" + }, + { + "/": "/portfolio/history/funding" + }, + { + "/": "/rewards" + }, + { + "/": "/my-profile" + }, + { + "/": "/rankings/hedgies" + }, + { + "/": "/rankings/competition" + }, + { + "/": "/rankings/diamond" + }, + { + "/": "/rankings/platinum" + }, + { + "/": "/rankings/gold" + }, + { + "/": "/rankings/silver" + }, + { + "/": "/rankings/bronze" + }, + { + "/": "/rankings/pnl-absolute" + }, + { + "/": "/rankings/pnl-percent" + }, + { + "/": "/walletsegue", + "comment": "Callback link for WalletSegue/Coinbase SDK" + } + ] + } + ] + } +} diff --git a/public/chart-background.png b/public/chart-background.png new file mode 100644 index 0000000..b432435 Binary files /dev/null and b/public/chart-background.png differ diff --git a/public/currencies/1inch.png b/public/currencies/1inch.png new file mode 100644 index 0000000..a0df4c1 Binary files /dev/null and b/public/currencies/1inch.png differ diff --git a/public/currencies/aave.png b/public/currencies/aave.png new file mode 100644 index 0000000..4f4eb96 Binary files /dev/null and b/public/currencies/aave.png differ diff --git a/public/currencies/ada.png b/public/currencies/ada.png new file mode 100644 index 0000000..8cec7d1 Binary files /dev/null and b/public/currencies/ada.png differ diff --git a/public/currencies/algo.png b/public/currencies/algo.png new file mode 100644 index 0000000..3dd42ac Binary files /dev/null and b/public/currencies/algo.png differ diff --git a/public/currencies/ape.png b/public/currencies/ape.png new file mode 100644 index 0000000..51d3f98 Binary files /dev/null and b/public/currencies/ape.png differ diff --git a/public/currencies/apt.png b/public/currencies/apt.png new file mode 100644 index 0000000..552b1db Binary files /dev/null and b/public/currencies/apt.png differ diff --git a/public/currencies/arb.png b/public/currencies/arb.png new file mode 100644 index 0000000..d5a3602 Binary files /dev/null and b/public/currencies/arb.png differ diff --git a/public/currencies/atom.png b/public/currencies/atom.png new file mode 100644 index 0000000..2e64ea6 Binary files /dev/null and b/public/currencies/atom.png differ diff --git a/public/currencies/avax.png b/public/currencies/avax.png new file mode 100644 index 0000000..e8cc21a Binary files /dev/null and b/public/currencies/avax.png differ diff --git a/public/currencies/bch.png b/public/currencies/bch.png new file mode 100644 index 0000000..40e0c99 Binary files /dev/null and b/public/currencies/bch.png differ diff --git a/public/currencies/blur.png b/public/currencies/blur.png new file mode 100644 index 0000000..283d102 Binary files /dev/null and b/public/currencies/blur.png differ diff --git a/public/currencies/btc.png b/public/currencies/btc.png new file mode 100644 index 0000000..2bea4fc Binary files /dev/null and b/public/currencies/btc.png differ diff --git a/public/currencies/celo.png b/public/currencies/celo.png new file mode 100644 index 0000000..31a906e Binary files /dev/null and b/public/currencies/celo.png differ diff --git a/public/currencies/comp.png b/public/currencies/comp.png new file mode 100644 index 0000000..850d596 Binary files /dev/null and b/public/currencies/comp.png differ diff --git a/public/currencies/crv.png b/public/currencies/crv.png new file mode 100644 index 0000000..757e7cf Binary files /dev/null and b/public/currencies/crv.png differ diff --git a/public/currencies/dai.png b/public/currencies/dai.png new file mode 100644 index 0000000..f17f3ca Binary files /dev/null and b/public/currencies/dai.png differ diff --git a/public/currencies/doge.png b/public/currencies/doge.png new file mode 100644 index 0000000..caaaab1 Binary files /dev/null and b/public/currencies/doge.png differ diff --git a/public/currencies/dot.png b/public/currencies/dot.png new file mode 100644 index 0000000..ba5fc19 Binary files /dev/null and b/public/currencies/dot.png differ diff --git a/public/currencies/dydx.png b/public/currencies/dydx.png new file mode 100644 index 0000000..841eba2 Binary files /dev/null and b/public/currencies/dydx.png differ diff --git a/public/currencies/enj.png b/public/currencies/enj.png new file mode 100644 index 0000000..24c80ac Binary files /dev/null and b/public/currencies/enj.png differ diff --git a/public/currencies/eos.png b/public/currencies/eos.png new file mode 100644 index 0000000..34d742a Binary files /dev/null and b/public/currencies/eos.png differ diff --git a/public/currencies/etc.png b/public/currencies/etc.png new file mode 100644 index 0000000..6ec0728 Binary files /dev/null and b/public/currencies/etc.png differ diff --git a/public/currencies/eth.png b/public/currencies/eth.png new file mode 100644 index 0000000..7e5bd0a Binary files /dev/null and b/public/currencies/eth.png differ diff --git a/public/currencies/fil.png b/public/currencies/fil.png new file mode 100644 index 0000000..c0d7089 Binary files /dev/null and b/public/currencies/fil.png differ diff --git a/public/currencies/icp.png b/public/currencies/icp.png new file mode 100644 index 0000000..64d3463 Binary files /dev/null and b/public/currencies/icp.png differ diff --git a/public/currencies/ldo.png b/public/currencies/ldo.png new file mode 100644 index 0000000..37b1a4c Binary files /dev/null and b/public/currencies/ldo.png differ diff --git a/public/currencies/link.png b/public/currencies/link.png new file mode 100644 index 0000000..b734609 Binary files /dev/null and b/public/currencies/link.png differ diff --git a/public/currencies/ltc.png b/public/currencies/ltc.png new file mode 100644 index 0000000..43db7a1 Binary files /dev/null and b/public/currencies/ltc.png differ diff --git a/public/currencies/matic.png b/public/currencies/matic.png new file mode 100644 index 0000000..2604a3d Binary files /dev/null and b/public/currencies/matic.png differ diff --git a/public/currencies/mkr.png b/public/currencies/mkr.png new file mode 100644 index 0000000..f4564cf Binary files /dev/null and b/public/currencies/mkr.png differ diff --git a/public/currencies/near.png b/public/currencies/near.png new file mode 100644 index 0000000..aa86500 Binary files /dev/null and b/public/currencies/near.png differ diff --git a/public/currencies/op.png b/public/currencies/op.png new file mode 100644 index 0000000..ef563b7 Binary files /dev/null and b/public/currencies/op.png differ diff --git a/public/currencies/pepe.png b/public/currencies/pepe.png new file mode 100644 index 0000000..66fe7d0 Binary files /dev/null and b/public/currencies/pepe.png differ diff --git a/public/currencies/rune.png b/public/currencies/rune.png new file mode 100644 index 0000000..2ee1863 Binary files /dev/null and b/public/currencies/rune.png differ diff --git a/public/currencies/sei.png b/public/currencies/sei.png new file mode 100644 index 0000000..1072240 Binary files /dev/null and b/public/currencies/sei.png differ diff --git a/public/currencies/shib.png b/public/currencies/shib.png new file mode 100644 index 0000000..0a44383 Binary files /dev/null and b/public/currencies/shib.png differ diff --git a/public/currencies/snx.png b/public/currencies/snx.png new file mode 100644 index 0000000..a1fcb97 Binary files /dev/null and b/public/currencies/snx.png differ diff --git a/public/currencies/sol.png b/public/currencies/sol.png new file mode 100644 index 0000000..15d04d3 Binary files /dev/null and b/public/currencies/sol.png differ diff --git a/public/currencies/sui.png b/public/currencies/sui.png new file mode 100644 index 0000000..0d17eeb Binary files /dev/null and b/public/currencies/sui.png differ diff --git a/public/currencies/sushi.png b/public/currencies/sushi.png new file mode 100644 index 0000000..986c101 Binary files /dev/null and b/public/currencies/sushi.png differ diff --git a/public/currencies/trx.png b/public/currencies/trx.png new file mode 100644 index 0000000..b87321e Binary files /dev/null and b/public/currencies/trx.png differ diff --git a/public/currencies/uma.png b/public/currencies/uma.png new file mode 100644 index 0000000..17a61a9 Binary files /dev/null and b/public/currencies/uma.png differ diff --git a/public/currencies/uni.png b/public/currencies/uni.png new file mode 100644 index 0000000..7a51c35 Binary files /dev/null and b/public/currencies/uni.png differ diff --git a/public/currencies/usdc.png b/public/currencies/usdc.png new file mode 100644 index 0000000..3de6940 Binary files /dev/null and b/public/currencies/usdc.png differ diff --git a/public/currencies/usdt.png b/public/currencies/usdt.png new file mode 100644 index 0000000..db67216 Binary files /dev/null and b/public/currencies/usdt.png differ diff --git a/public/currencies/wbtc.png b/public/currencies/wbtc.png new file mode 100644 index 0000000..b0ed485 Binary files /dev/null and b/public/currencies/wbtc.png differ diff --git a/public/currencies/weth.png b/public/currencies/weth.png new file mode 100644 index 0000000..54864ae Binary files /dev/null and b/public/currencies/weth.png differ diff --git a/public/currencies/wld.png b/public/currencies/wld.png new file mode 100644 index 0000000..73e2e6f Binary files /dev/null and b/public/currencies/wld.png differ diff --git a/public/currencies/xlm.png b/public/currencies/xlm.png new file mode 100644 index 0000000..d59fd57 Binary files /dev/null and b/public/currencies/xlm.png differ diff --git a/public/currencies/xmr.png b/public/currencies/xmr.png new file mode 100644 index 0000000..223d000 Binary files /dev/null and b/public/currencies/xmr.png differ diff --git a/public/currencies/xrp.png b/public/currencies/xrp.png new file mode 100644 index 0000000..de0fc84 Binary files /dev/null and b/public/currencies/xrp.png differ diff --git a/public/currencies/xtz.png b/public/currencies/xtz.png new file mode 100644 index 0000000..3a2344e Binary files /dev/null and b/public/currencies/xtz.png differ diff --git a/public/currencies/yfi.png b/public/currencies/yfi.png new file mode 100644 index 0000000..2f0f188 Binary files /dev/null and b/public/currencies/yfi.png differ diff --git a/public/currencies/zec.png b/public/currencies/zec.png new file mode 100644 index 0000000..90512d8 Binary files /dev/null and b/public/currencies/zec.png differ diff --git a/public/currencies/zrx.png b/public/currencies/zrx.png new file mode 100644 index 0000000..a512933 Binary files /dev/null and b/public/currencies/zrx.png differ diff --git a/public/dydx-testnet.png b/public/dydx-testnet.png new file mode 100644 index 0000000..ee14ca4 Binary files /dev/null and b/public/dydx-testnet.png differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..cacd0d9 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/grid-loader.svg b/public/grid-loader.svg new file mode 100644 index 0000000..939b972 --- /dev/null +++ b/public/grid-loader.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logos/logo-mark-dark.svg b/public/logos/logo-mark-dark.svg new file mode 100644 index 0000000..2ab74e8 --- /dev/null +++ b/public/logos/logo-mark-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/logos/logo-mark-light.svg b/public/logos/logo-mark-light.svg new file mode 100644 index 0000000..6422cf4 --- /dev/null +++ b/public/logos/logo-mark-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/wallets/1inch.png b/public/wallets/1inch.png new file mode 100644 index 0000000..9be3d51 Binary files /dev/null and b/public/wallets/1inch.png differ diff --git a/public/wallets/bitkeep.png b/public/wallets/bitkeep.png new file mode 100644 index 0000000..975a53f Binary files /dev/null and b/public/wallets/bitkeep.png differ diff --git a/public/wallets/coin98.png b/public/wallets/coin98.png new file mode 100644 index 0000000..04145bb Binary files /dev/null and b/public/wallets/coin98.png differ diff --git a/public/wallets/coinbase-wallet.png b/public/wallets/coinbase-wallet.png new file mode 100644 index 0000000..42ff5cc Binary files /dev/null and b/public/wallets/coinbase-wallet.png differ diff --git a/public/wallets/generic-wallet.png b/public/wallets/generic-wallet.png new file mode 100644 index 0000000..2c48616 Binary files /dev/null and b/public/wallets/generic-wallet.png differ diff --git a/public/wallets/huobi-wallet.png b/public/wallets/huobi-wallet.png new file mode 100644 index 0000000..4572e8f Binary files /dev/null and b/public/wallets/huobi-wallet.png differ diff --git a/public/wallets/imtoken.png b/public/wallets/imtoken.png new file mode 100644 index 0000000..a410615 Binary files /dev/null and b/public/wallets/imtoken.png differ diff --git a/public/wallets/keplr.png b/public/wallets/keplr.png new file mode 100644 index 0000000..4194bd8 Binary files /dev/null and b/public/wallets/keplr.png differ diff --git a/public/wallets/magic.png b/public/wallets/magic.png new file mode 100644 index 0000000..2a0b02c Binary files /dev/null and b/public/wallets/magic.png differ diff --git a/public/wallets/metamask.png b/public/wallets/metamask.png new file mode 100644 index 0000000..5fe7e34 Binary files /dev/null and b/public/wallets/metamask.png differ diff --git a/public/wallets/rainbow-wallet.png b/public/wallets/rainbow-wallet.png new file mode 100644 index 0000000..91c4452 Binary files /dev/null and b/public/wallets/rainbow-wallet.png differ diff --git a/public/wallets/tokenpocket.png b/public/wallets/tokenpocket.png new file mode 100644 index 0000000..0a2f07a Binary files /dev/null and b/public/wallets/tokenpocket.png differ diff --git a/public/wallets/trust-wallet.png b/public/wallets/trust-wallet.png new file mode 100644 index 0000000..cf79d73 Binary files /dev/null and b/public/wallets/trust-wallet.png differ diff --git a/public/wallets/walletconnect.png b/public/wallets/walletconnect.png new file mode 100644 index 0000000..0191a28 Binary files /dev/null and b/public/wallets/walletconnect.png differ diff --git a/public/wallets/zerion.png b/public/wallets/zerion.png new file mode 100644 index 0000000..04d1d0d Binary files /dev/null and b/public/wallets/zerion.png differ diff --git a/scripts/inject-amplitude.js b/scripts/inject-amplitude.js new file mode 100644 index 0000000..6848b45 --- /dev/null +++ b/scripts/inject-amplitude.js @@ -0,0 +1,35 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const AMPLITUDE_API_KEY = process.env.AMPLITUDE_API_KEY; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +if(AMPLITUDE_API_KEY){ + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const amplitudeCdnScript = ` + `; + + const amplitudeListenerScript = ``; + + const injectedHtml = html.replace( + '
', + `
\n${amplitudeCdnScript}\n${amplitudeListenerScript}` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Amplitude scripts successfully injected.'); + } catch (err) { + console.error('Error injecting Amplitude scripts:', err); + } +} diff --git a/scripts/inject-bugsnag.js b/scripts/inject-bugsnag.js new file mode 100644 index 0000000..114ec87 --- /dev/null +++ b/scripts/inject-bugsnag.js @@ -0,0 +1,81 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const BUGSNAG_API_KEY = process.env.BUGSNAG_API_KEY; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const scripts = ` + + + + + `; + + const injectedHtml = html.replace( + '
', + `
\n${scripts}\n` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Bugsnag scripts successfully injected.'); +} catch (err) { + console.error('Error injecting Bugsnag scripts:', err); +} diff --git a/scripts/inject-statuspage.js b/scripts/inject-statuspage.js new file mode 100644 index 0000000..0315cbf --- /dev/null +++ b/scripts/inject-statuspage.js @@ -0,0 +1,28 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const STATUS_PAGE_SCRIPT_URI = process.env.STATUS_PAGE_SCRIPT_URI; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +if (STATUS_PAGE_SCRIPT_URI) { + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const statusPageScript = ``; + + const injectedHtml = html.replace( + '
', + `
\n${statusPageScript}\n` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('StatusPage script successfully injected.'); + } catch (err) { + console.error('Error injecting StatusPage scripts:', err); + } +} diff --git a/scripts/update-ipns.js b/scripts/update-ipns.js new file mode 100644 index 0000000..dc68562 --- /dev/null +++ b/scripts/update-ipns.js @@ -0,0 +1,72 @@ +/** + * Updates an existing IPNS record or creates a new IPNS record using w3name. + * @param {string} cid The CID to publish to IPNS + * @param {string} keyPath The path to the signing key + * @param {boolean} newIpns Whether to create a new IPNS record + * @param {boolean} verbose Whether to print verbose output + */ + +import * as Name from 'w3name'; +import fs from 'fs'; +import minimist from 'minimist'; +import process from 'process'; + +const SIGNING_KEY_PATH = '.web3name.key'; + +async function saveSigningKey(name, outputFilename = SIGNING_KEY_PATH) { + const bytes = name.key.bytes; + await fs.promises.writeFile(outputFilename, bytes); +} + +async function loadSigningKey(filename) { + const bytes = await fs.promises.readFile(filename); + const name = await Name.from(bytes); + return name; +} + +const { + cid, + key: keyPath, + newIpns, + verbose, +} = minimist(process.argv.slice(2), { + string: ['cid', 'key'], + boolean: ['newIpns', 'verbose'], + default: { verbose: false }, + alias: { c: 'cid', k: 'key' }, +}); + +if (!cid) { + console.error('Error: Provide the CID with the --cid flag.'); + process.exit(1); +} + +if (!keyPath && !newIpns) { + console.error( + 'Error: To update an existing IPNS record, provide the path to the key file with the --key flag or create a new IPNS record with the --newIpns flag.' + ); + process.exit(1); +} + +let name; +let newRevision; + +if (newIpns) { + if (verbose) console.log(`Creating new IPNS record with cid ${cid}...`); + name = await Name.create(); + newRevision = await Name.v0(name, `/ipfs/${cid}`); + + await saveSigningKey(name, keyPath); + if (verbose) + console.log(`The associated signing key is saved to ${keyPath ?? SIGNING_KEY_PATH}`); +} else { + if (verbose) console.log(`Updating existing IPNS record with cid ${cid}...`); + name = await loadSigningKey(keyPath); + const latestRevision = await Name.resolve(name); + newRevision = await Name.increment(latestRevision, `/ipfs/${cid}`); +} + +if (verbose) console.log('Publishing...'); +await Name.publish(newRevision, name.key); + +console.log(`ipns://${name.toString()}`); diff --git a/scripts/upload-ipfs.js b/scripts/upload-ipfs.js new file mode 100644 index 0000000..34ce151 --- /dev/null +++ b/scripts/upload-ipfs.js @@ -0,0 +1,48 @@ +/** + * Uploads contents of the build directory to web3.storage, + * and returns the CID, which is available over the IPFS network. + * @param {boolean} rebuild Whether to rebuild the site before uploading, defaults to true + * @param {string} env The environment to build for, defaults to 'staging' + * @param {boolean} verbose Whether to print verbose output + */ + +import fs from 'fs'; +import minimist from 'minimist'; +import process from 'process'; +import { Web3Storage, getFilesFromPath } from 'web3.storage'; +import { execSync } from 'child_process'; + +const BUILD_DIR_PATH = 'dist'; +const API_TOKEN = process.env.WEB3_STORAGE_TOKEN; + +const { rebuild, env, verbose } = minimist(process.argv.slice(2), { + string: ['env'], + boolean: ['rebuild', 'verbose'], + default: { env: 'staging', rebuild: true, verbose: false }, + alias: { e: 'env' }, +}); + +if (!API_TOKEN) { + console.error( + 'Error: An API token is required. Create one at https://web3.storage and set the WEB3_STORAGE_TOKEN environment variable.' + ); + process.exit(1); +} + +if (rebuild || !fs.existsSync(BUILD_DIR_PATH)) { + if (verbose) console.log(`Building ${env}...`); + execSync(`pnpm run build --mode ${env} > /dev/null 2>&1`, { stdio: 'inherit' }); +} + +const client = new Web3Storage({ token: API_TOKEN }); +const files = await getFilesFromPath(BUILD_DIR_PATH); + +if (verbose) console.log(`Uploading ${files.length} files to web3.storage...`); +const cid = await client.put(files, { wrapWithDirectory: false }); + +if (verbose) { + console.log('Content added with CID:', cid); + console.log(`https://dweb.link/ipfs/${cid}`); +} else { + console.log(cid); +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..36bda10 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,206 @@ +import { Suspense } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; +import styled, { AnyStyledComponent, css } from 'styled-components'; +import { WagmiConfig } from 'wagmi'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { GrazProvider } from 'graz'; + +import { AppRoute, DEFAULT_TRADE_ROUTE } from '@/constants/routes'; + +import { useBreakpoints, useInitializePage, useShouldShowFooter, useAnalytics } from '@/hooks'; +import { DydxProvider } from '@/hooks/useDydxClient'; +import { AccountsProvider } from '@/hooks/useAccounts'; +import { DialogAreaProvider, useDialogArea } from './hooks/useDialogArea'; +import { LocaleProvider } from './hooks/useLocaleSeparators'; +import { NotificationsProvider } from './hooks/useNotifications'; +import { LocalNotificationsProvider } from './hooks/useLocalNotifications'; +import { SubaccountProvider } from './hooks/useSubaccount'; +import { SquidProvider } from '@/hooks/useSquid'; + +import { GuardedMobileRoute } from '@/components/GuardedMobileRoute'; + +import MarketsPage from '@/pages/markets/Markets'; +import PortfolioPage from '@/pages/portfolio/Portfolio'; +import { AlertsPage } from '@/pages/AlertsPage'; +import ProfilePage from '@/pages/Profile'; +import { SettingsPage } from '@/pages/settings/Settings'; +import TradePage from '@/pages/trade/Trade'; +import { RewardsPage } from '@/pages/rewards/RewardsPage'; + +import { HeaderDesktop } from '@/layout/Header/HeaderDesktop'; +import { FooterDesktop } from '@/layout/Footer/FooterDesktop'; +import { FooterMobile } from '@/layout/Footer/FooterMobile'; +import { NotificationsToastArea } from '@/layout/NotificationsToastArea'; +import { DialogManager } from '@/layout/DialogManager'; +import { GlobalCommandDialog } from '@/views/dialogs/GlobalCommandDialog'; + +import { config } from '@/lib/wagmi'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import '@/styles/constants.css'; +import '@/styles/fonts.css'; +import '@/styles/web3modal.css'; + +const queryClient = new QueryClient(); + +const Content = () => { + const { setDialogArea } = useDialogArea(); + + useInitializePage(); + useAnalytics(); + + const { isTablet, isNotTablet } = useBreakpoints(); + const isShowingHeader = isNotTablet; + const isShowingFooter = useShouldShowFooter(); + + return ( + + {isNotTablet && } + + + + + + } /> + } /> + + } /> + {import.meta.env.MODE !== 'production' && ( + } /> + )} + {isTablet && ( + <> + } /> + } /> + } /> + + )} + + }> + } /> + + } /> + + + + + {isTablet ? : } + + + + + + + + + + ); +}; + +const wrapProvider = (Component: React.ComponentType, props?: any) => { + return ({ children }: { children: React.ReactNode }) => ( + {children} + ); +}; + +const providers = [ + wrapProvider(QueryClientProvider, { client: queryClient }), + wrapProvider(GrazProvider), + wrapProvider(WagmiConfig, { config }), + wrapProvider(LocaleProvider), + wrapProvider(DydxProvider), + wrapProvider(AccountsProvider), + wrapProvider(SubaccountProvider), + wrapProvider(SquidProvider), + wrapProvider(LocalNotificationsProvider), + wrapProvider(NotificationsProvider), + wrapProvider(DialogAreaProvider), +]; + +const App = () => { + return [...providers].reverse().reduce((children, Provider) => { + return {children}; + }, ); +}; + +const Styled: Record = {}; + +Styled.Content = styled.div<{ isShowingHeader: boolean; isShowingFooter: boolean }>` + /* Computed */ + --page-currentHeaderHeight: 0px; + --page-currentFooterHeight: 0px; + + ${({ isShowingHeader }) => + isShowingHeader && + css` + --page-currentHeaderHeight: var(--page-header-height); + + @media ${breakpoints.tablet} { + --page-currentHeaderHeight: var(--page-header-height-mobile); + } + `} + + ${({ isShowingFooter }) => + isShowingFooter && + css` + --page-currentFooterHeight: var(--page-footer-height); + + @media ${breakpoints.tablet} { + --page-currentFooterHeight: var(--page-footer-height-mobile); + } + `} + + /* Rules */ + ${layoutMixins.contentContainer} + + ${layoutMixins.scrollArea} + --scrollArea-height: 100vh; + + @supports (-webkit-touch-callout: none) { + height: -webkit-fill-available; + } + + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: var(--page-currentHeaderHeight); + --stickyArea0-topGap: var(--border-width); + --stickyArea0-bottomGap: var(--border-width); + --stickyArea0-bottomHeight: var(--page-currentFooterHeight); + + ${layoutMixins.withOuterAndInnerBorders} + display: grid; + grid-template: + 'Header' var(--page-currentHeaderHeight) + 'Main' minmax(min-content, 1fr) + 'Footer' var(--page-currentFooterHeight) + / 100%; + + transition: 0.3s var(--ease-out-expo); +`; + +Styled.Main = styled.main` + ${layoutMixins.contentSectionAttached} + + grid-area: Main; + + isolation: isolate; + + position: relative; +`; + +Styled.NotificationsToastArea = styled(NotificationsToastArea)` + grid-area: Main; + z-index: 2; +`; + +Styled.DialogArea = styled.aside` + position: fixed; + height: 100vh; + z-index: 1; + inset: 0; + overflow: clip; + ${layoutMixins.noPointerEvents} +`; + +export default App; diff --git a/src/abi/erc20.json b/src/abi/erc20.json new file mode 100644 index 0000000..3b0ab2f --- /dev/null +++ b/src/abi/erc20.json @@ -0,0 +1,222 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] \ No newline at end of file diff --git a/src/components/AlertMessage.stories.tsx b/src/components/AlertMessage.stories.tsx new file mode 100644 index 0000000..b876a8e --- /dev/null +++ b/src/components/AlertMessage.stories.tsx @@ -0,0 +1,30 @@ +import type { Story } from '@ladle/react'; + +import { AlertType } from '@/constants/alerts'; + +import { + AlertMessage as AlertMessageComponent, + AlertMessageProps, +} from '@/components/AlertMessage'; + +import { StoryWrapper } from '.ladle/components'; + +export const AlertMessage: Story = (args) => { + return ( + + + + ); +}; + +AlertMessage.args = { + children: 'This is an alert message', +}; + +AlertMessage.argTypes = { + type: { + options: Object.values(AlertType), + control: { type: 'select' }, + defaultValue: AlertType.Success, + }, +}; diff --git a/src/components/AlertMessage.tsx b/src/components/AlertMessage.tsx new file mode 100644 index 0000000..ba30b00 --- /dev/null +++ b/src/components/AlertMessage.tsx @@ -0,0 +1,81 @@ +import styled, { css } from 'styled-components'; + +import { AlertType } from '@/constants/alerts'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type StyleProps = { + className?: string; + type: AlertType; +}; + +type ElementProps = { + children: React.ReactNode; +}; + +export type AlertMessageProps = ElementProps & StyleProps; + +export const AlertMessage: React.FC = ({ className, children, type }) => { + return ( + + {children} + + ); +}; + +const AlertContainer = styled.div` + ${layoutMixins.column} + + --alert-accent-color: transparent; + --alert-default-background-opacity: 0.1; + --alert-background: linear-gradient(transparent, var(--alert-accent-color)) 0 + clamp(0%, var(--alert-default-background-opacity) * 100%, 100%) / auto 10000vmax; + + ${({ type }) => { + switch (type) { + case AlertType.Error: { + return css` + --alert-accent-color: var(--color-error); + `; + } + case AlertType.Info: { + return css` + --alert-accent-color: var(--color-text-1); + + --alert-default-background-opacity: 0.133; // Relative + // --alert-background: var(--color-layer-6); // Absolute + `; + } + case AlertType.Success: { + return css` + --alert-accent-color: var(--color-success); + `; + } + case AlertType.Warning: { + return css` + --alert-accent-color: var(--color-warning); + `; + } + default: + return ''; + } + }} + + overflow: auto; + position: relative; + max-height: 12.5rem; + gap: 0.25em; + + font-size: 0.8125em; + + padding: 0.625em 0.75em; + + color: var(--color-text-2); + + background: var(--alert-background); + border-left: 0.25em solid var(--alert-accent-color); + border-radius: 0.25em; + + white-space: pre-wrap; + + user-select: all; +`; diff --git a/src/components/AssetIcon.stories.tsx b/src/components/AssetIcon.stories.tsx new file mode 100644 index 0000000..00f9445 --- /dev/null +++ b/src/components/AssetIcon.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { AssetIcon as AssetIconComponent } from '@/components/AssetIcon'; + +import { StoryWrapper } from '.ladle/components'; + +export const AssetIcon: Story<{ symbol: string }> = (args) => { + return ( + + + + ); +}; + +AssetIcon.args = { + symbol: 'ETH', +}; diff --git a/src/components/AssetIcon.tsx b/src/components/AssetIcon.tsx new file mode 100644 index 0000000..5ecc426 --- /dev/null +++ b/src/components/AssetIcon.tsx @@ -0,0 +1,82 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Nullable } from '@/constants/abacus'; + +export type AssetSymbol = keyof typeof assetIcons; + +const assetIcons = { + '1INCH': '/currencies/1inch.png', + AAVE: '/currencies/aave.png', + ADA: '/currencies/ada.png', + ALGO: '/currencies/algo.png', + APE: '/currencies/ape.png', + APT: '/currencies/apt.png', + ARB: '/currencies/arb.png', + ATOM: '/currencies/atom.png', + AVAX: '/currencies/avax.png', + BCH: '/currencies/bch.png', + BLUR: '/currencies/blur.png', + BTC: '/currencies/btc.png', + CELO: '/currencies/celo.png', + COMP: '/currencies/comp.png', + CRV: '/currencies/crv.png', + DAI: '/currencies/dai.png', + DOGE: '/currencies/doge.png', + DOT: '/currencies/dot.png', + DYDX: '/currencies/dydx.png', + ENJ: '/currencies/enj.png', + EOS: '/currencies/eos.png', + ETC: '/currencies/etc.png', + ETH: '/currencies/eth.png', + FIL: '/currencies/fil.png', + ICP: '/currencies/icp.png', + LDO: '/currencies/ldo.png', + LINK: '/currencies/link.png', + LTC: '/currencies/ltc.png', + MATIC: '/currencies/matic.png', + MKR: '/currencies/mkr.png', + NEAR: '/currencies/near.png', + OP: '/currencies/op.png', + PEPE: '/currencies/pepe.png', + RUNE: '/currencies/rune.png', + SEI: '/currencies/sei.png', + SHIB: '/currencies/shib.png', + SNX: '/currencies/snx.png', + SOL: '/currencies/sol.png', + SUI: '/currencies/sui.png', + SUSHI: '/currencies/sushi.png', + TRX: '/currencies/trx.png', + UMA: '/currencies/uma.png', + UNI: '/currencies/uni.png', + USDC: '/currencies/usdc.png', + USDT: '/currencies/usdt.png', + WBTC: '/currencies/wbtc.png', + WETH: '/currencies/weth.png', + WLD: '/currencies/wld.png', + XLM: '/currencies/xlm.png', + XMR: '/currencies/xmr.png', + XRP: '/currencies/xrp.png', + XTZ: '/currencies/xtz.png', + YFI: '/currencies/yfi.png', + ZEC: '/currencies/zec.png', + ZRX: '/currencies/zrx.png', +} as const; + +const isAssetSymbol = (symbol: Nullable): symbol is AssetSymbol => + symbol != null && assetIcons.hasOwnProperty(symbol); + +export const AssetIcon = ({ + symbol, + className, +}: { + symbol?: Nullable; + className?: string; +}) => + isAssetSymbol(symbol) ? : null; + +const Styled: Record = {}; + +Styled.Img = styled.img` + width: auto; + height: 1em; +`; diff --git a/src/components/BackButton.stories.tsx b/src/components/BackButton.stories.tsx new file mode 100644 index 0000000..6ec220f --- /dev/null +++ b/src/components/BackButton.stories.tsx @@ -0,0 +1,22 @@ +import type { Story } from '@ladle/react'; +import { MemoryRouter } from 'react-router-dom'; + +import { BackButton } from '@/components/BackButton'; + +import { StoryWrapper } from '.ladle/components'; + +export const BackButtonStory: Story = () => { + return ( + + + + ); +}; + +BackButtonStory.decorators = [ + (Story) => ( + + + + ), +]; diff --git a/src/components/BackButton.tsx b/src/components/BackButton.tsx new file mode 100644 index 0000000..9c40b64 --- /dev/null +++ b/src/components/BackButton.tsx @@ -0,0 +1,31 @@ +import { ButtonAction, ButtonSize } from '@/constants/buttons'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +type ElementProps = { + onClick?: () => void; +}; + +export const BackButton = ({ + onClick = () => { + // @ts-ignore + const navigation = globalThis.navigation; + + if (!navigation) { + globalThis.history?.back(); + // @ts-ignore + } else if (navigation.canGoBack) { + navigation.back(); + } else { + navigation.navigate('/', { replace: true }); + } + }, +}: ElementProps) => ( + +); diff --git a/src/components/BaseButton.tsx b/src/components/BaseButton.tsx new file mode 100644 index 0000000..c8cf630 --- /dev/null +++ b/src/components/BaseButton.tsx @@ -0,0 +1,198 @@ +import { forwardRef } from 'react'; +import styled, { css } from 'styled-components'; + +import { ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons'; + +type ElementProps = { + disabled?: boolean; + type?: ButtonType; + children?: React.ReactNode; + href?: string; + onClick?: React.MouseEventHandler | React.MouseEventHandler; +}; + +type StyleProps = { + size?: ButtonSize; + shape?: ButtonShape; + className?: string; +}; + +export type BaseButtonProps = ElementProps & Omit; + +export const BaseButton = forwardRef( + ( + { + disabled, + type = ButtonType.Button, + size, + shape, + + href, + + onClick, + + children, + className, + + ...otherProps + }, + ref + ) => { + return type === ButtonType.Link ? ( + } + // Native + href={href} + rel={href ? 'noopener noreferrer' : undefined} + target={href ? '_blank' : undefined} + // Style + size={size} + shape={shape} + className={className} + // Events + onClick={onClick as React.MouseEventHandler} + // Other + {...otherProps} + > + {children} + + ) : ( + } + // Native + type={type} + disabled={disabled} + // Style + size={size} + shape={shape} + className={className} + // Events + onClick={onClick as React.MouseEventHandler} + // Other + {...otherProps} + > + {children} + + ); + } +); + +const buttonSizeVariants = { + [ButtonSize.XSmall]: css` + --button-font: var(--font-mini-book); + --button-height: 1.75rem; + `, + [ButtonSize.Small]: css` + --button-font: var(--font-small-book); + --button-height: 2.25rem; + `, + [ButtonSize.Base]: css` + --button-font: var(--font-base-book); + --button-height: 2.75rem; + `, + [ButtonSize.Medium]: css` + --button-font: var(--font-medium-medium); + --button-height: 3.25rem; + `, + [ButtonSize.Large]: css` + --button-font: var(--font-large-book); + --button-height: 3.5rem; + `, + [ButtonSize.XLarge]: css` + --button-font: var(--font-large-medium); + --button-height: 3.75rem; + `, +}; + +const buttonShapeVariants = { + [ButtonShape.Circle]: css` + --button-width: var(--button-height); + --button-radius: 50%; + `, + [ButtonShape.Rectangle]: css` + --button-radius: 0.5em; + `, + [ButtonShape.Square]: css` + --button-width: var(--button-height); + --button-radius: 0.5em; + `, + [ButtonShape.Pill]: css` + --button-radius: 6em; + `, +}; + +const ButtonStyle = css` + // Props/defaults + + --button-font: var(--font-base-book); + + --button-width: auto; + --button-height: 2.75rem; + --button-padding: 0 0.625em; + + --button-textColor: var(--color-text-0); + --button-backgroundColor: transparent; + --button-active-filter: brightness(0.9); + --button-hover-filter: brightness(1.1); + --button-hover-textColor: var(--button-textColor); + + --button-radius: 0.5em; + --button-border: solid var(--border-width) var(--color-layer-6); + + --button-cursor: pointer; + + // Variants + + ${({ size }) => size && buttonSizeVariants[size]} + ${({ shape }) => shape && buttonShapeVariants[shape]} + + // Rules + + font: var(--button-font); + + display: inline-flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: var(--button-width); + height: var(--button-height); + padding: var(--button-padding); + gap: 0.5ch; + + background-color: var(--button-backgroundColor); + border: var(--button-border); + border-radius: var(--button-radius); + + color: var(--button-textColor); + text-align: center; + white-space: nowrap; + + cursor: var(--button-cursor); + + &:hover:not(:disabled) { + color: var(--button-hover-textColor); + filter: var(--button-hover-filter); + } + + &:active:not(:disabled) { + filter: var(--button-active-filter); + } +`; + +const StyledButton = styled.button` + ${ButtonStyle} +`; + +const StyledLinkButton = styled.a` + ${ButtonStyle} + + &:hover { + text-decoration: none; + } + + &:visited { + color: var(--button-textColor); + } +`; diff --git a/src/components/Button.stories.tsx b/src/components/Button.stories.tsx new file mode 100644 index 0000000..6e42d85 --- /dev/null +++ b/src/components/Button.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { ButtonAction, ButtonShape, ButtonSize, ButtonState, ButtonType } from '@/constants/buttons'; + +import { Button, type ButtonProps } from '@/components/Button'; + +import { StoryWrapper } from '.ladle/components'; + +export const ButtonStory: Story = (args) => { + return ( + + + ); +}; + +const Styled: Record = {}; + +Styled.InlineRow = styled.div<{ copied: boolean }>` + ${layoutMixins.inlineRow} + cursor: pointer; + + ${({ copied }) => + copied + ? css` + filter: brightness(0.8); + ` + : css` + &:hover { + filter: brightness(1.1); + text-decoration: underline; + } + `} +`; diff --git a/src/components/Details.stories.tsx b/src/components/Details.stories.tsx new file mode 100644 index 0000000..58707b8 --- /dev/null +++ b/src/components/Details.stories.tsx @@ -0,0 +1,49 @@ +import type { Story } from '@ladle/react'; + +import { Details } from '@/components/Details'; + +import { StoryWrapper } from '.ladle/components'; + +import styled, { type AnyStyledComponent } from 'styled-components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const DetailsStory: Story> = () => ( + + +
+ + +); + +const Styled: Record = {}; + +Styled.Resizable = styled.section` + ${layoutMixins.container} + resize: horizontal; + overflow: hidden; + width: 14rem; + + padding: 1rem; + background-color: var(--color-layer-3); +`; diff --git a/src/components/Details.tsx b/src/components/Details.tsx new file mode 100644 index 0000000..f530765 --- /dev/null +++ b/src/components/Details.tsx @@ -0,0 +1,303 @@ +import { Fragment } from 'react'; + +import styled, { + type AnyStyledComponent, + css, + type FlattenInterpolation, + ThemeProps, +} from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { WithSeparators } from '@/components/Separator'; +import { WithTooltip } from '@/components/WithTooltip'; + +import { LoadingContext } from '@/contexts/LoadingContext'; + +export type DetailsItem = { + key: string; + tooltip?: string; + tooltipParams?: Record; + label: string | JSX.Element; + value?: string | JSX.Element | undefined; + subitems?: DetailsItem[]; + withTooltipIcon?: boolean; +}; + +const DETAIL_LAYOUTS = { + column: 'column', + row: 'row', + rowColumns: 'row', + grid: 'row', + stackColumn: 'column', +} as const; + +const DETAIL_ITEM_TOOLTIP_LAYOUTS = { + column: 'left', + row: 'top', + rowColumns: 'top', + grid: undefined, + stackColumn: 'top', +} as const; + +type ElementProps = { + showSubitems?: boolean; + items: DetailsItem[]; + isLoading?: boolean; +}; + +type StyleProps = { + layout?: 'column' | 'row' | 'rowColumns' | 'grid' | 'stackColumn'; + justifyItems?: 'start' | 'end'; + withSeparators?: boolean; + withOverflow?: boolean; + className?: string; +}; + +const DetailItem = ({ + tooltip, + tooltipParams, + label, + value, + withTooltipIcon, + justifyItems, + layout = 'column', + withOverflow, +}: DetailsItem & StyleProps) => ( + +
+ + {label} + +
+
{value ?? ''}
+
+); + +export const Details = ({ + className, + showSubitems, + items, + isLoading = false, + justifyItems = 'start', + layout = 'column', + withOverflow = true, + withSeparators = false, +}: ElementProps & StyleProps) => ( + + + + {items.map(({ key, tooltip, tooltipParams, label, subitems, value, withTooltipIcon }) => ( + + + {subitems && showSubitems && layout === 'column' && ( + + )} + + ))} + + + +); + +const detailsLayoutVariants = { + column: css` + ${layoutMixins.column} + `, + + stackColumn: css` + ${layoutMixins.flexColumn} + `, + + row: css` + ${layoutMixins.row} + align-self: stretch; + `, + + rowColumns: css` + ${layoutMixins.row} + `, + + grid: css` + display: grid; + grid-template-columns: repeat( + var(--details-grid-numColumns), + calc(100% / var(--details-grid-numColumns)) + ); + `, +}; + +const itemLayoutVariants: Record>> = { + column: css` + isolation: isolate; + + ${layoutMixins.scrollArea} + + ${layoutMixins.stickyArea0} + --stickyArea0-background: var(--details-item-backgroundColor); + + ${layoutMixins.spacedRow} + gap: 0.5rem; + + min-height: var(--details-item-height); + + > :last-child { + align-self: stretch; + + ${layoutMixins.row} + ${layoutMixins.stickyRight} + + background-color: var(--details-item-backgroundColor); + box-shadow: -0.25rem 0 0.25rem var(--details-item-backgroundColor); + } + `, + + stackColumn: css` + ${layoutMixins.column} + padding: 0.75rem 0; + > :first-child { + margin-bottom: 0.5rem; + } + `, + + row: css` + ${layoutMixins.row} + ${layoutMixins.scrollSnapItem} + + gap: 0.1875rem 0.66rem; + padding: 0 1rem; + `, + + rowColumns: css` + ${layoutMixins.rowColumn} + ${layoutMixins.scrollSnapItem} + + gap: 0.1875rem 0.66rem; + padding: 0 1rem; + `, + + grid: css` + display: grid; + align-content: space-evenly; + justify-items: start; + gap: 0.375rem; + `, +}; + +const Styled: Record = {}; + +Styled.Details = styled.dl<{ + layout: 'column' | 'row' | 'rowColumns' | 'grid' | 'stackColumn'; + withSeparators: boolean; +}>` + --details-item-height: 2rem; + --details-item-backgroundColor: transparent; + --details-subitem-borderWidth: 2px; + --details-grid-numColumns: 2; + + ${({ layout }) => layout && detailsLayoutVariants[layout]} + + white-space: nowrap; +`; + +Styled.Item = styled.div<{ + layout: 'column' | 'row' | 'rowColumns' | 'grid' | 'stackColumn'; + justifyItems?: 'start' | 'end'; + withOverflow: boolean; +}>` + ${({ layout }) => layout && itemLayoutVariants[layout]} + + ${({ justifyItems }) => + justifyItems === 'end' && + css` + &:nth-child(even) { + justify-items: end; + text-align: end; + } + `} + + ${({ layout, withOverflow }) => + layout && + withOverflow && + { + column: css` + &:not(:hover) > :first-child { + overflow-x: hidden; + text-overflow: ellipsis; + } + `, + stackColumn: css``, + row: css``, + rowColumns: css``, + grid: css` + &:not(:hover) > :first-child { + overflow-x: hidden; + text-overflow: ellipsis; + } + `, + }[layout]} + + /* > label { */ + /* > dt { */ + > :first-child { + color: var(--color-text-0); + + // Tooltip Icon centering when display: inline + > abbr > svg { + margin-bottom: -0.125rem; + margin-left: 0.25rem; + } + } + + /* > span { */ + /* dd */ + > :last-child { + font: var(--details-value-font, inherit); + gap: 0.25rem; + display: flex; + flex-direction: row; + + &:empty:after { + content: '–'; + color: var(--color-text-0); + opacity: 0.5; + } + } +`; + +Styled.SubDetails = styled(Details)` + padding-left: 1rem; + position: relative; + + &:before { + content: ''; + background-color: var(--color-border); + position: absolute; + bottom: 0.25rem; + top: 0.25rem; + left: 0; + width: var(--details-subitem-borderWidth); + border-radius: 0.25rem; + } +`; diff --git a/src/components/DetailsDialog.tsx b/src/components/DetailsDialog.tsx new file mode 100644 index 0000000..2a55833 --- /dev/null +++ b/src/components/DetailsDialog.tsx @@ -0,0 +1,53 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { useBreakpoints } from '@/hooks'; +import { Details, type DetailsItem } from '@/components/Details'; +import { Dialog, DialogPlacement } from '@/components/Dialog'; + +type ElementProps = { + slotIcon?: React.ReactNode; + title: string | React.ReactNode; + items: DetailsItem[]; + slotFooter?: React.ReactNode; + setIsOpen: (open: boolean) => void; +}; + +export const DetailsDialog = ({ slotIcon, title, items, slotFooter, setIsOpen }: ElementProps) => { + const { isTablet } = useBreakpoints(); + + return ( + + + + + {slotFooter} + + + ); +}; + +const Styled: Record = {}; + +Styled.Content = styled.div` + ${layoutMixins.expandingColumnWithStickyFooter} + --stickyFooterBackdrop-outsetX: var(--dialog-paddingX); + --stickyFooterBackdrop-outsetY: var(--dialog-content-paddingBottom); + gap: 1rem; +`; + +Styled.Details = styled(Details)` + font: var(--font-small-book); +`; + +Styled.Footer = styled.footer` + ${layoutMixins.gridEqualColumns} + gap: 0.66rem; +`; diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx new file mode 100644 index 0000000..32cdf26 --- /dev/null +++ b/src/components/Dialog.tsx @@ -0,0 +1,460 @@ +import { useRef } from 'react'; +import styled, { type AnyStyledComponent, keyframes, css } from 'styled-components'; + +import { + Root, + Trigger, + Overlay, + Content, + Title, + Description, + Close, + Portal, +} from '@radix-ui/react-dialog'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from '@/components/Icon'; +import { BackButton } from '@/components/BackButton'; + +import { useDialogArea } from '@/hooks/useDialogArea'; + +export enum DialogPlacement { + Default = 'Default', + Sidebar = 'Sidebar', + Inline = 'Inline', + FullScreen = 'FullScreen', +} + +type ElementProps = { + isOpen?: boolean; + setIsOpen?: (open: boolean) => void; + slotIcon?: React.ReactNode; + title?: React.ReactNode; + description?: React.ReactNode; + onBack?: () => void; + preventClose?: boolean; + slotTrigger?: React.ReactNode; + slotHeaderInner?: React.ReactNode; + slotFooter?: React.ReactNode; +}; + +type StyleProps = { + placement?: DialogPlacement; + portalContainer?: HTMLElement; + hasHeaderBorder?: boolean; + children?: React.ReactNode; + className?: string; +}; + +const DialogPortal = ({ + withPortal, + container, + children, +}: { + withPortal: boolean; + container?: HTMLElement; + children: React.ReactNode; +}) => { + const { dialogArea } = useDialogArea(); + + return withPortal ? ( + {children} + ) : ( + <>{children} + ); +}; + +export const Dialog = ({ + isOpen = false, + setIsOpen, + slotIcon, + title, + description, + onBack, + preventClose, + slotTrigger, + slotHeaderInner, + slotFooter, + placement = DialogPlacement.Default, + portalContainer, + hasHeaderBorder = false, + children, + className, +}: ElementProps & StyleProps) => { + const closeButtonRef = useRef(); + + const showOverlay = ![DialogPlacement.Inline, DialogPlacement.FullScreen].includes(placement); + + return ( + + {slotTrigger && {slotTrigger}} + + {showOverlay && } + { + closeButtonRef.current?.focus(); + }} + onInteractOutside={(e: Event) => { + if (!showOverlay || preventClose) { + e.preventDefault(); + } + }} + > + + + {onBack && } + + {slotIcon && {slotIcon}} + + {title && {title}} + + {!preventClose && ( + + + + )} + + + {description && {description}} + + {slotHeaderInner} + + + {children} + + {slotFooter && {slotFooter}} + + + + ); +}; + +const Styled: Record = {}; + +Styled.Overlay = styled(Overlay)` + z-index: 1; + + position: fixed; + inset: 0; + + pointer-events: none; + + @media (prefers-reduced-motion: reduce) { + backdrop-filter: blur(8px); + } + + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + animation: ${keyframes` + to { + backdrop-filter: blur(8px); + } + `} 0.15s var(--ease-out-expo) forwards; + } + + &[data-state='closed'] { + animation: ${keyframes` + from { + backdrop-filter: blur(8px); + } + `} 0.15s; + } + } +`; + +Styled.Container = styled(Content)<{ placement: DialogPlacement }>` + /* Params */ + --dialog-inset: 1rem; + --dialog-width: 30rem; + --dialog-backgroundColor: var(--color-layer-3); + --dialog-radius: 1rem; + + --dialog-paddingX: 1.5rem; + + --dialog-header-z: 1; + --dialog-header-height: auto; /* set to fixed value to enable inner sticky areas */ + --dialog-header-paddingTop: 1.5rem; + --dialog-header-paddingBottom: 1rem; + --dialog-header-paddingLeft: var(--dialog-paddingX); + --dialog-header-paddingRight: var(--dialog-paddingX); + + --dialog-content-paddingTop: 0rem; + --dialog-content-paddingBottom: 1.5rem; + --dialog-content-paddingLeft: var(--dialog-paddingX); + --dialog-content-paddingRight: var(--dialog-paddingX); + + --dialog-footer-paddingTop: 0rem; + --dialog-footer-paddingBottom: 1rem; + --dialog-footer-paddingLeft: var(--dialog-paddingX); + --dialog-footer-paddingRight: var(--dialog-paddingX); + + --dialog-title-gap: 0.5rem; + --dialog-icon-size: 1.75em; + + /* Calculated */ + --dialog-height: calc(100% - 2 * var(--dialog-inset)); + + /* Rules */ + ${layoutMixins.scrollArea} + --scrollArea-height: var(--dialog-height); + + ${layoutMixins.withOuterBorder} + --border-width: var(--default-border-width); + --border-color: var(--color-border); + + isolation: isolate; + z-index: 1; + position: absolute; + + inset: 0; + width: 100%; + height: 100%; + + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: var(--dialog-header-height); + --stickyArea0-background: var(--dialog-backgroundColor); + + ${layoutMixins.flexColumn} + + outline: none; + + ${({ placement }) => + ({ + [DialogPlacement.Default]: css` + inset: var(--dialog-inset); + margin: auto; + + max-width: var(--dialog-width); + height: fit-content; + max-height: var(--dialog-height); + + display: flex; + flex-direction: column; + + border-radius: var(--dialog-radius); + /* clip-path: inset( + calc(-1 * var(--border-width)) round calc(var(--dialog-radius) + var(--border-width)) + ); + overflow-clip-margin: var(--border-width); */ + + @media ${breakpoints.mobile} { + top: calc(var(--dialog-inset) * 2); + bottom: 0; + --dialog-width: initial; + width: var(--dialog-width); + + margin-bottom: 0; + + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + /* Hack (uneven border-radius causes overflow issues) */ + /* top: auto; + bottom: calc(-1 * var(--dialog-radius)); + padding-bottom: var(--dialog-radius); */ + } + + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + animation: ${keyframes` + from { + opacity: 0; + } + 0.01% { + max-height: 0; + } + `} 0.15s var(--ease-out-expo); + } + + &[data-state='closed'] { + animation: ${keyframes` + to { + opacity: 0; + scale: 0.9; + max-height: 0; + } + `} 0.15s; + } + } + `, + [DialogPlacement.Sidebar]: css` + --dialog-width: var(--sidebar-width); + + @media ${breakpoints.notMobile} { + max-width: var(--dialog-width); + margin-left: auto; + } + + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + animation: ${keyframes` + from { + translate: 100% 0; + opacity: 0; + } + `} 0.15s var(--ease-out-expo); + } + + &[data-state='closed'] { + animation: ${keyframes` + to { + translate: 100% 0; + opacity: 0; + } + `} 0.15s var(--ease-out-expo); + } + } + `, + [DialogPlacement.Inline]: css` + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + animation: ${keyframes` + from { + scale: 0.99; + opacity: 0; + /* filter: blur(2px); */ + /* backdrop-filter: none; */ + } + `} 0.15s var(--ease-out-expo); + } + + &[data-state='closed'] { + animation: ${keyframes` + to { + scale: 0.99; + opacity: 0; + /* filter: blur(2px); */ + /* backdrop-filter: none; */ + } + `} 0.15s var(--ease-out-expo); + } + } + `, + [DialogPlacement.FullScreen]: css` + --dialog-width: 100vw; + --dialog-height: 100vh; + top: 0; + bottom: 0; + `, + }[placement])} +`; + +Styled.Header = styled.header<{ $withBorder: boolean }>` + ${layoutMixins.stickyHeader} + + z-index: var(--dialog-header-z); + + display: block; + padding: var(--dialog-header-paddingTop) var(--dialog-header-paddingLeft) + var(--dialog-header-paddingBottom) var(--dialog-header-paddingRight); + border-top-left-radius: inherit; + border-top-right-radius: inherit; + + ${({ $withBorder }) => + $withBorder && + css` + ${layoutMixins.withOuterBorder}; + background: var(--dialog-backgroundColor); + `}; +`; + +Styled.HeaderTopRow = styled.div` + ${layoutMixins.row} + gap: var(--dialog-title-gap); +`; + +Styled.HeaderTopRow = styled.div` + ${layoutMixins.row} + gap: var(--dialog-title-gap); +`; + +Styled.Content = styled.div` + flex: 1; + + ${layoutMixins.column} + + ${layoutMixins.stickyArea1} + --stickyArea1-background: var(--dialog-backgroundColor); + --stickyArea1-paddingTop: var(--dialog-content-paddingTop); + --stickyArea1-paddingBottom: var(--dialog-content-paddingBottom); + --stickyArea1-paddingLeft: var(--dialog-content-paddingLeft); + --stickyArea1-paddingRight: var(--dialog-content-paddingRight); + + padding: var(--dialog-content-paddingTop) var(--dialog-content-paddingRight) + var(--dialog-content-paddingBottom) var(--dialog-content-paddingLeft); + + isolation: isolate; +`; + +Styled.Icon = styled.div` + ${layoutMixins.row} + + width: 1em; + height: 1em; + + font-size: var(--dialog-icon-size); /* 1 line-height */ + line-height: 1; +`; + +Styled.Close = styled(Close)` + width: 0.7813rem; + height: 0.7813rem; + + box-sizing: content-box; + padding: 0.5rem; + margin: auto 0; + + display: flex; + justify-content: center; + align-items: center; + + border-radius: 0.25rem; + + color: var(--color-text-0); + + > svg { + height: 100%; + width: 100%; + } + + &:hover, + &:focus-visible { + color: var(--color-text-2); + } + + @media ${breakpoints.tablet} { + width: 1rem; + height: 1rem; + outline: none; + } +`; + +Styled.Title = styled(Title)` + flex: 1; + + font: var(--font-large-medium); + color: var(--color-text-2); + + overflow: hidden; + text-overflow: ellipsis; +`; + +Styled.Description = styled(Description)` + margin-top: 0.5rem; + color: var(--color-text-0); + font: var(--font-base-book); +`; + +Styled.Footer = styled.footer` + display: grid; + ${layoutMixins.stickyFooter} + ${layoutMixins.withStickyFooterBackdrop} + --stickyFooterBackdrop-outsetX: var(--dialog-paddingX); + + padding: var(--dialog-footer-paddingTop) var(--dialog-footer-paddingLeft) + var(--dialog-footer-paddingBottom) var(--dialog-footer-paddingRight); +`; diff --git a/src/components/DiffArrow.stories.tsx b/src/components/DiffArrow.stories.tsx new file mode 100644 index 0000000..c9bbf32 --- /dev/null +++ b/src/components/DiffArrow.stories.tsx @@ -0,0 +1,26 @@ +import type { Story } from '@ladle/react'; + +import { NumberSign } from '@/constants/numbers'; + +import { DiffArrow, type DiffArrowProps } from '@/components/DiffArrow'; + +import { StoryWrapper } from '.ladle/components'; + +export const DiffArrowStory: Story = (args) => ( + + + +); + +DiffArrowStory.argTypes = { + direction: { + options: ['left', 'right'], + control: { type: 'select' }, + defaultValue: 'right', + }, + sign: { + options: Object.values(NumberSign), + control: { type: 'select' }, + defaultValue: NumberSign.Neutral, + }, +}; diff --git a/src/components/DiffArrow.tsx b/src/components/DiffArrow.tsx new file mode 100644 index 0000000..e1fa3c9 --- /dev/null +++ b/src/components/DiffArrow.tsx @@ -0,0 +1,61 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { NumberSign } from '@/constants/numbers'; + +import { Icon, IconName } from './Icon'; + +type ElementProps = { + sign?: NumberSign; +}; + +type StyleProps = { + className?: string; + direction?: 'right' | 'left'; +}; + +export type DiffArrowProps = ElementProps & StyleProps; + +export const DiffArrow = ({ className, direction = 'right', sign }: DiffArrowProps) => ( + + + +); + +const Styled: Record = {}; + +Styled.DiffArrowContainer = styled.span` + --diffArrow-color: inherit; + --diffArrow-color-positive: var(--color-positive); + --diffArrow-color-negative: var(--color-negative); + + display: inline-flex; + position: relative; + color: var(--diffArrow-color); + + svg { + width: 0.5em; + height: 0.5em; + } + + ${({ sign }) => + sign && + { + [NumberSign.Positive]: css` + color: var(--diffArrow-color-positive); + `, + [NumberSign.Negative]: css` + color: var(--diffArrow-color-negative); + `, + [NumberSign.Neutral]: null, + }[sign]} + + ${({ direction }) => + ({ + right: css` + transform: scaleX(1); + `, + left: css` + transform: scaleX(-1); + `, + }[direction || 'right'])} +`; diff --git a/src/components/DiffOutput.stories.tsx b/src/components/DiffOutput.stories.tsx new file mode 100644 index 0000000..6e7137d --- /dev/null +++ b/src/components/DiffOutput.stories.tsx @@ -0,0 +1,45 @@ +import type { Story } from '@ladle/react'; + +import { NumberSign } from '@/constants/numbers'; + +import { DiffOutput, DiffOutputType, type DiffOutputProps } from '@/components/DiffOutput'; + +import { StoryWrapper } from '.ladle/components'; + +export const DiffOutputStory: Story = (args) => ( + + + +); + +DiffOutputStory.args = { + value: 0, + newValue: 0, + fractionDigits: 0, + hasInvalidNewValue: false, + useGrouping: false, + withDiff: true, +}; + +DiffOutputStory.argTypes = { + direction: { + options: ['left', 'right'], + control: { type: 'select' }, + defaultValue: 'right', + }, + layout: { + options: ['row', 'column'], + control: { type: 'select' }, + defaultValue: 'row', + }, + sign: { + options: Object.values(NumberSign), + control: { type: 'select' }, + defaultValue: NumberSign.Neutral, + }, + type: { + options: Object.values(DiffOutputType), + control: { type: 'select' }, + defaultValue: DiffOutputType.Number, + }, +}; diff --git a/src/components/DiffOutput.tsx b/src/components/DiffOutput.tsx new file mode 100644 index 0000000..f6f52e4 --- /dev/null +++ b/src/components/DiffOutput.tsx @@ -0,0 +1,118 @@ +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { DiffArrow, type DiffArrowProps } from '@/components/DiffArrow'; +import { Output, type OutputProps, OutputType } from '@/components/Output'; + +import { BigNumberish } from '@/lib/numbers'; + +export { OutputType as DiffOutputType }; + +type ElementProps = { + hasInvalidNewValue?: boolean; + newValue?: BigNumberish | null; + withDiff?: boolean; +}; + +type StyleProps = { + layout?: 'row' | 'column'; +}; + +export type DiffOutputProps = DiffArrowProps & OutputProps & ElementProps & StyleProps; + +export const DiffOutput = ({ + className, + direction, + fractionDigits, + hasInvalidNewValue, + sign, + tag, + type, + useGrouping, + withDiff, + layout = 'row', + showSign, + withBaseFont, + + value, + newValue, +}: DiffOutputProps) => ( + + + {withDiff && ( + + + + + )} + +); + +const Styled: Record = {}; + +Styled.DiffValue = styled.div<{ hasInvalidNewValue?: boolean }>` + ${layoutMixins.row} + gap: 0.25rem; + color: var(--color-text-2); + + ${({ hasInvalidNewValue }) => + hasInvalidNewValue && + css` + color: var(--color-negative); + `} +`; + +Styled.DiffOutput = styled.div<{ layout: 'row' | 'column'; withDiff?: boolean }>` + --diffOutput-gap: 0.25rem; + --diffOutput-value-color: var(--color-text-1); + --diffOutput-newValue-color: var(--color-text-2); + --diffOutput-valueWithDiff-color: ; + + gap: var(--diffOutput-gap); + + & > :first-child { + font: var(--diffOutput-value-font, inherit); + color: var(--diffOutput-value-color); + } + + ${({ layout }) => + ({ + ['row']: ` + ${layoutMixins.row} + `, + ['column']: ` + ${layoutMixins.column} + `, + }[layout])} + + ${({ withDiff }) => + withDiff && + css` + & > :first-child { + color: var(--diffOutput-valueWithDiff-color, var(--diffOutput-value-color)); + font: var(--diffOutput-valueWithDiff-font); + } + + & > :last-child { + color: var(--diffOutput-newValue-color); + font: var(--diffOutput-newValue-font); + } + `} +`; diff --git a/src/components/DropdownHeaderMenu.stories.tsx b/src/components/DropdownHeaderMenu.stories.tsx new file mode 100644 index 0000000..2534010 --- /dev/null +++ b/src/components/DropdownHeaderMenu.stories.tsx @@ -0,0 +1,59 @@ +import { useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { DropdownHeaderMenu } from '@/components/DropdownHeaderMenu'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const DropdownHeaderMenuStory: Story> = (args) => { + const [view, setView] = useState(); + + const exampleItems = [ + { + value: 'Positions', + label: 'Positions', + description: 'Monitor your exposure & risk', + onSelect: () => setView('Positions'), + }, + { + value: 'Orders', + label: 'Orders', + description: 'Track an order through its lifecycle', + onSelect: () => setView('Orders'), + }, + { + value: 'Fills', + label: 'Fills', + description: 'All fee-generating trading activity', + onSelect: () => setView('Fills'), + }, + { + value: 'Transfers', + label: 'Transfers', + description: 'Movements into & out of your account', + onSelect: () => setView('Transfers'), + }, + { + value: 'Fees', + label: 'Fees', + description: 'See how much you spent trading', + onSelect: () => setView('Fees'), + }, + ]; + + return ( + + + {view ?? 'Overview'} + + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + ${layoutMixins.container} +`; diff --git a/src/components/DropdownHeaderMenu.tsx b/src/components/DropdownHeaderMenu.tsx new file mode 100644 index 0000000..4558d42 --- /dev/null +++ b/src/components/DropdownHeaderMenu.tsx @@ -0,0 +1,134 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root, Trigger, Content, Portal, Item } from '@radix-ui/react-dropdown-menu'; + +import { type MenuItem } from '@/constants/menus'; + +import { popoverMixins } from '@/styles/popoverMixins'; +import { layoutMixins } from '@/styles/layoutMixins'; +import { breakpoints } from '@/styles'; +import { useBreakpoints } from '@/hooks'; + +import { IconButton } from '@/components/IconButton'; +import { IconName } from '@/components/Icon'; + +type ElementProps = { + items: MenuItem[]; + onValueChange?: (value: MenuItemValue) => void; + children?: React.ReactNode; +}; + +type StyleProps = { + sideOffset?: number; + className?: string; +}; + +export const DropdownHeaderMenu = ({ + items, + onValueChange, + children, + sideOffset = 8, + className, +}: ElementProps & StyleProps) => { + const { isMobile } = useBreakpoints(); + + return ( + + + {children} + + + + + {items.map(({ value, label, description, onSelect, disabled }) => ( + (onSelect ?? onValueChange)?.(value)} + disabled={disabled} + > + {label} + {description} + + ))} + + + + ); +}; + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)` + ${popoverMixins.trigger} + ${popoverMixins.backdropOverlay} + + --trigger-padding: 0.33rem 0.5rem; + --trigger-textColor: var(--color-text-2); + --trigger-backgroundColor: none; + --trigger-open-backgroundColor: none; + --trigger-open-textColor: var(--color-text-2); + + &[data-state='open']:after { + backdrop-filter: blur(6px); + height: 100vh; + } + + ${layoutMixins.row} + + width: 100%; + font: var(--font-extra-medium); + outline: none; + + :hover { + filter: brightness(1.1); + } +`; + +Styled.DropdownIconButton = styled(IconButton)` + --button-textColor: var(--color-text-2); + + ${Styled.Trigger}[data-state='open'] & { + rotate: -0.5turn; + } +`; + +Styled.Content = styled(Content)` + ${layoutMixins.withOuterAndInnerBorders} + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} + + --popover-shadow-size: var(--border-width); + + @media ${breakpoints.mobile} { + --popover-width: calc(100vw - 3rem); + --popover-margin: 0 1.5rem; + } + + > * { + background-color: inherit; + } +`; + +Styled.Item = styled(Item)` + ${popoverMixins.item} + + --item-padding: 0.75rem 1rem; + + ${layoutMixins.column} + gap: 0.5rem; +`; + +Styled.ItemLabel = styled.span` + color: var(--color-text-2); + font: var(--font-medium-book); +`; + +Styled.Description = styled.span` + color: var(--color-text-0); + font: var(--font-small-book); +`; diff --git a/src/components/DropdownMenu.stories.tsx b/src/components/DropdownMenu.stories.tsx new file mode 100644 index 0000000..bee3c62 --- /dev/null +++ b/src/components/DropdownMenu.stories.tsx @@ -0,0 +1,46 @@ +import type { Story } from '@ladle/react'; + +import { DropdownMenu } from '@/components/DropdownMenu'; + +import { StoryWrapper } from '.ladle/components'; + +export const DropdownMenuStory: Story> = (args) => { + const exampleItems = [ + { + value: '1', + label: 'Item 1', + onSelect: () => alert('Item 1 action'), + }, + { + value: '2', + label: 'Item 2', + onSelect: () => alert('Item 2 action'), + }, + { + value: '3', + label: 'Item 3', + onSelect: () => alert('Item 3 action'), + }, + ]; + + return ( + + + Menu + + + ); +}; + +DropdownMenuStory.args = {}; + +DropdownMenuStory.argTypes = { + align: { + options: ['start', 'center', 'end'], + control: { type: 'select' }, + defaultValue: 'center', + }, +}; diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx new file mode 100644 index 0000000..6b74602 --- /dev/null +++ b/src/components/DropdownMenu.tsx @@ -0,0 +1,130 @@ +import { type Ref, forwardRef } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root, Trigger, Content, Portal, Item, Separator } from '@radix-ui/react-dropdown-menu'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +import { Icon, IconName } from '@/components/Icon'; +import { Fragment } from 'react'; + +export type DropdownMenuItem = { + value: T; + icon?: React.ReactNode; + label: React.ReactNode; + onSelect?: () => void; + separator?: boolean; + highlightColor?: 'accent' | 'positive' | 'negative'; +}; + +type StyleProps = { + align?: 'center' | 'start' | 'end'; + side?: 'top' | 'bottom'; + sideOffset?: number; + className?: string; +}; + +type ElementProps = { + children: React.ReactNode; + items: DropdownMenuItem[]; + slotTopContent?: React.ReactNode; +}; + +type DropdownMenuProps = StyleProps & ElementProps; + +export const DropdownMenu = forwardRef( + ( + { + align = 'center', + children, + className, + items, + slotTopContent, + side = 'bottom', + sideOffset = 8, + }: DropdownMenuProps, + ref: Ref + ) => { + return ( + + + {children} + + + + + {slotTopContent} + {items.map((item: DropdownMenuItem) => ( + + + {item.icon} + {item.label} + + {item.separator && } + + ))} + + + + ); + } +); + +const Styled: Record = {}; + +Styled.Separator = styled(Separator)` + border-bottom: solid var(--border-width) var(--color-border); + margin: 0.25rem 1rem; +`; + +Styled.Item = styled(Item)<{ $highlightColor: 'accent' | 'positive' | 'negative' }>` + ${popoverMixins.item} + --item-font-size: var(--dropdownMenu-item-font-size); + ${({ $highlightColor }) => + ({ + ['accent']: ` + --item-highlighted-textColor: var(--color-accent); + `, + ['positive']: ` + --item-highlighted-textColor: var(--color-positive); + `, + ['negative']: ` + --item-highlighted-textColor: var(--color-negative); + `, + }[$highlightColor])} + + justify-content: start; + color: var(--color-text-0); + + &[data-disabled] { + cursor: default; + } +`; + +Styled.Trigger = styled(Trigger)` + ${popoverMixins.trigger} + ${popoverMixins.backdropOverlay} +`; + +Styled.DropdownIcon = styled.span` + display: inline-flex; + font-size: 0.375em; + transition: transform 0.3s var(--ease-out-expo); + align-items: center; + + ${Styled.Trigger}[data-state='open'] & { + transform: scaleY(-1); + } +`; + +Styled.Content = styled(Content)` + --dropdownMenu-item-font-size: inherit; + + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} +`; diff --git a/src/components/DropdownSelectMenu.stories.tsx b/src/components/DropdownSelectMenu.stories.tsx new file mode 100644 index 0000000..9108562 --- /dev/null +++ b/src/components/DropdownSelectMenu.stories.tsx @@ -0,0 +1,53 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { DropdownSelectMenu } from '@/components/DropdownSelectMenu'; + +import { StoryWrapper } from '.ladle/components'; + +const exampleItems = [ + { + value: '1', + label: 'Item 1', + slotBefore: '1️⃣', + }, + { + value: '2', + label: 'Item 2', + slotBefore: '2️⃣', + }, + { + value: '3', + label: 'Item 3', + slotBefore: '3️⃣', + }, + { + value: '4', + label: 'Item 4', + slotBefore: '4️⃣', + }, +]; + +export const DropdownSelectMenuStory: Story> = (args) => { + const [item, setItem] = useState(exampleItems[0].value); + return ( + + setItem(value)} + {...args} + /> + + ); +}; + +DropdownSelectMenuStory.args = {}; + +DropdownSelectMenuStory.argTypes = { + align: { + options: ['start', 'center', 'end'], + control: { type: 'select' }, + defaultValue: 'center', + }, +}; diff --git a/src/components/DropdownSelectMenu.tsx b/src/components/DropdownSelectMenu.tsx new file mode 100644 index 0000000..cf527bc --- /dev/null +++ b/src/components/DropdownSelectMenu.tsx @@ -0,0 +1,145 @@ +import { cloneElement } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { + Root, + Trigger, + Content, + ItemIndicator, + RadioGroup, + RadioItem, + Portal, +} from '@radix-ui/react-dropdown-menu'; + +import { type MenuItem } from '@/constants/menus'; + +import { Icon, IconName } from '@/components/Icon'; +import { Tag } from '@/components/Tag'; + +import { popoverMixins } from '@/styles/popoverMixins'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + disabled?: boolean; + items: MenuItem[]; + value: MenuItemValue; + onValueChange: (value: MenuItemValue) => void; + children?: React.ReactNode; + slotTrigger?: JSX.Element; +}; + +type StyleProps = { + align?: 'center' | 'start' | 'end'; + sideOffset?: number; + className?: string; +}; + +export const DropdownSelectMenu = ({ + items, + value, + onValueChange, + slotTrigger, + children = (() => { + const currentItem = items.find((item) => value === item.value); + + return ( + <> + {currentItem?.slotBefore} + {currentItem?.label ?? value} + + ); + })(), + align = 'start', + sideOffset = 1, + className, + + disabled, +}: ElementProps & StyleProps) => { + const triggerContent = ( + <> + {children} + + + ); + + return ( + + + {slotTrigger ? cloneElement(slotTrigger, { children: triggerContent }) : triggerContent} + + + + onValueChange(value as MenuItemValue)} + > + {items.map(({ value, label, slotBefore, slotAfter, tag, disabled }) => ( + + {slotBefore} + + + {label} + {tag && ( + <> + {' '} + {tag} + + )} + + + {slotAfter} + + ✔{/* */} + + ))} + + + + + ); +}; + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)` + ${layoutMixins.row} + gap: 1rem; + + ${popoverMixins.trigger} + ${popoverMixins.backdropOverlay} +`; + +Styled.DropdownIcon = styled.span` + display: inline-flex; + transition: transform 0.3s var(--ease-out-expo); + + font-size: 0.375em; + + ${Styled.Trigger}[data-state='open'] & { + transform: scaleY(-1); + } +`; + +Styled.Content = styled(Content)` + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} +`; + +Styled.RadioItem = styled(RadioItem)` + ${popoverMixins.item} +`; + +Styled.ItemLabel = styled.span` + flex: 1; + + ${layoutMixins.inlineRow} +`; + +Styled.ItemIndicator = styled(ItemIndicator)` + margin-left: auto; + + display: inline-flex; + + transition: transform 0.3s var(--ease-out-expo); +`; diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..28cf98a --- /dev/null +++ b/src/components/ErrorBoundary.tsx @@ -0,0 +1,19 @@ +import React from 'react'; + +import { log } from '@/lib/telemetry'; + +type ErrorBoundaryProps = { children: React.ReactNode }; + +export class ErrorBoundary extends React.Component { + constructor(props: ErrorBoundaryProps) { + super(props); + } + + componentDidCatch(error: Error): void { + log('ErrorBoundary', error); + } + + render() { + return this.props.children; + } +} diff --git a/src/components/FormInput.stories.tsx b/src/components/FormInput.stories.tsx new file mode 100644 index 0000000..0f7baf7 --- /dev/null +++ b/src/components/FormInput.stories.tsx @@ -0,0 +1,78 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { AlertType } from '@/constants/alerts'; + +import { Button } from '@/components/Button'; +import { FormInput, FormInputProps } from '@/components/FormInput'; +import { InputType } from '@/components/Input'; + +import { StoryWrapper } from '.ladle/components'; + +export const FormInputWithValidationStory: Story = (args) => { + const [value, setValue] = useState(''); + + return ( + + ) => setValue(e.target.value)} + value={value} + /> + + ); +}; + +FormInputWithValidationStory.args = { + decimals: 2, + max: '', + min: '', + placeholder: '', + validationConfig: { + attached: false, + type: AlertType.Error, + message: 'Error message', + }, +}; + +FormInputWithValidationStory.argTypes = { + type: { + options: Object.values(InputType), + control: { type: 'select' }, + defaultValue: InputType.Number, + }, +}; + +export const FormInputStoryWithSlotOuterRight: Story = (args) => { + const [value, setValue] = useState(''); + return ( + + ) => setValue(e.target.value)} + slotOuterRight={} + value={value} + /> + + ); +}; + +FormInputStoryWithSlotOuterRight.args = { + decimals: 2, + max: '', + min: '', + placeholder: '', + validationConfig: { + attached: false, + type: AlertType.Error, + message: 'Error message', + }, +}; + +FormInputStoryWithSlotOuterRight.argTypes = { + type: { + options: Object.values(InputType), + control: { type: 'select' }, + defaultValue: InputType.Number, + }, +}; diff --git a/src/components/FormInput.tsx b/src/components/FormInput.tsx new file mode 100644 index 0000000..da0591f --- /dev/null +++ b/src/components/FormInput.tsx @@ -0,0 +1,95 @@ +import { forwardRef } from 'react'; +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { AlertType } from '@/constants/alerts'; +import { layoutMixins } from '@/styles/layoutMixins'; +import { formMixins } from '@/styles/formMixins'; + +import { AlertMessage } from '@/components/AlertMessage'; +import { Input, InputProps } from '@/components/Input'; +import { WithLabel } from '@/components/WithLabel'; + +type StyleProps = { + className?: string; +}; + +type ElementProps = { + label: React.ReactNode; + slotRight?: React.ReactNode; + validationConfig?: { + attached?: boolean; + type: AlertType; + message: string; + }; +}; + +export type FormInputProps = ElementProps & StyleProps & InputProps; + +export const FormInput = forwardRef( + ({ id, label, slotRight, className, validationConfig, ...otherProps }, ref) => ( + + + + + + {slotRight} + + {validationConfig && ( + + {validationConfig.message} + + )} + + ) +); + +const Styled: Record = {}; + +Styled.AlertMessage = styled(AlertMessage)``; + +Styled.FormInputContainer = styled.div<{ isValidationAttached?: boolean }>` + ${layoutMixins.flexColumn} + gap: 0.5rem; + + ${({ isValidationAttached }) => + isValidationAttached && + css` + --input-radius: 0.5em 0.5em 0 0; + + ${Styled.AlertMessage} { + border-left: none; + margin: 0; + border-radius: 0 0 0.5em 0.5em; + } + `} +`; + +Styled.InputContainer = styled.div<{ hasSlotRight?: boolean }>` + ${formMixins.inputContainer} + + input { + padding: var(--form-input-paddingY) var(--form-input-paddingX); + padding-top: 0; + } + + ${({ hasSlotRight }) => + hasSlotRight && + css` + padding-right: var(--form-input-paddingX); + input { + padding-right: 0; + } + `} +`; + +Styled.WithLabel = styled(WithLabel)` + ${formMixins.inputLabel} + + label { + cursor: text; + padding: var(--form-input-paddingY) var(--form-input-paddingX) 0; + } +`; diff --git a/src/components/GreenCheckCircle.tsx b/src/components/GreenCheckCircle.tsx new file mode 100644 index 0000000..c114b3e --- /dev/null +++ b/src/components/GreenCheckCircle.tsx @@ -0,0 +1,43 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from '@/components/Icon'; + +export const GreenCheckCircle = ({ className }: { className?: string }) => ( + + + +); + +const Styled: Record = {}; + +Styled.GreenCheckCircle = styled.div` + ${layoutMixins.stack} + + --icon-size: 1.25rem; + --icon-border-width: 3px; + + width: var(--icon-size); + height: var(--icon-size); + border-radius: 50%; + + align-items: center; + + &:before { + content: ''; + width: calc(var(--icon-size) - var(--icon-border-width) * 2); + height: calc(var(--icon-size) - var(--icon-border-width) * 2); + border: solid var(--icon-border-width) var(--color-positive); + border-radius: 50%; + opacity: 0.6; + } + + svg { + width: calc(var(--icon-size) / 3); + height: calc(var(--icon-size) / 3); + + color: var(--color-positive); + justify-self: center; + } +`; diff --git a/src/components/GuardedMobileRoute.tsx b/src/components/GuardedMobileRoute.tsx new file mode 100644 index 0000000..dec5d75 --- /dev/null +++ b/src/components/GuardedMobileRoute.tsx @@ -0,0 +1,38 @@ +import { useEffect, useRef } from 'react'; +import { Outlet, useNavigate } from 'react-router-dom'; +import { shallowEqual, useDispatch, useSelector } from 'react-redux'; + +import { DialogTypes } from '@/constants/dialogs'; + +import { useBreakpoints } from '@/hooks'; + +import { openDialog } from '@/state/dialogs'; + +import { getActiveDialog } from '@/state/dialogsSelectors'; + +import { calculateCanAccountTrade } from '@/state/accountCalculators'; + +export const GuardedMobileRoute = () => { + const { isTablet } = useBreakpoints(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual); + const activeDialog = useSelector(getActiveDialog, shallowEqual); + const prevActiveDialog = useRef(activeDialog?.type); + + useEffect(() => { + if (isTablet && !canAccountTrade) { + dispatch(openDialog({ type: DialogTypes.Onboarding })); + } + }, []); + + useEffect(() => { + const dialogClosed = !activeDialog && prevActiveDialog.current === DialogTypes.Onboarding; + if (isTablet && !canAccountTrade && dialogClosed) { + navigate('/'); + } + prevActiveDialog.current = activeDialog?.type; + }, [activeDialog, canAccountTrade, isTablet]); + + return ; +}; diff --git a/src/components/Icon.stories.tsx b/src/components/Icon.stories.tsx new file mode 100644 index 0000000..808ef50 --- /dev/null +++ b/src/components/Icon.stories.tsx @@ -0,0 +1,23 @@ +import type { Story } from '@ladle/react'; + +import { Icon, IconName } from '@/components/Icon'; + +import { StoryWrapper } from '.ladle/components'; + +export const IconStory: Story> = (args) => { + return ( + + + + ); +}; + +const iconNames = Object.values(IconName); + +IconStory.argTypes = { + iconName: { + options: iconNames, + control: { type: 'select' }, + defaultValue: iconNames[0], + }, +}; diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx new file mode 100644 index 0000000..935bd3c --- /dev/null +++ b/src/components/Icon.tsx @@ -0,0 +1,220 @@ +import { type ElementType } from 'react'; + +import styled from 'styled-components'; + +import { + AddressConnectorIcon, + ArrowIcon, + Bar3Icon, + BoxCloseIcon, + CalculatorIcon, + CaretIcon, + CautionCircleStrokeIcon, + CautionCircleIcon, + CheckIcon, + ChevronLeftIcon, + ChevronRightIcon, + ClockIcon, + CloseIcon, + CoinMarketCapIcon, + CoinsIcon, + CommentIcon, + CopyIcon, + CubeIcon, + DiscordIcon, + EtherscanIcon, + DepthChartIcon, + ExportKeysIcon, + FeedbackIcon, + FileIcon, + FundingChartIcon, + GearIcon, + GiftboxIcon, + HelpCircleIcon, + HideIcon, + HistoryIcon, + LinkOutIcon, + LockIcon, + LogoShortIcon, + MenuIcon, + MintscanIcon, + OrderbookIcon, + OrderCanceledIcon, + OrderFilledIcon, + OrderOpenIcon, + OrderPartiallyFilledIcon, + OrderPendingIcon, + OrderUntriggeredIcon, + OverviewIcon, + PencilIcon, + PositionsIcon, + PriceChartIcon, + PrivacyIcon, + QrIcon, + SearchIcon, + SendIcon, + ShareIcon, + ShowIcon, + TogglesMenuIcon, + StarIcon, + TerminalIcon, + TradeIcon, + TransferIcon, + TriangleIcon, + TryAgainIcon, + WarningIcon, + WebsiteIcon, + WhitepaperIcon, +} from '@/icons'; + +export enum IconName { + AddressConnector = 'AddressConnector', + Arrow = 'Arrow', + Bar3 = 'Bar3', + BoxClose = 'BoxClose', + Calculator = 'Calculator', + Caret = 'Caret', + CautionCircle = 'CautionCircle', + CautionCircleStroked = 'CautionCircleStroked', + Check = 'Check', + ChevronLeft = 'ChevronLeft', + ChevronRight = 'ChevronRight', + Clock = 'Clock', + Close = 'Close', + CoinMarketCap = 'CoinMarketCap', + Coins = 'Coins', + Comment = 'Comment', + Copy = 'Copy', + Cube = 'Cube', + DepthChart = 'DepthChart', + Discord = 'Discord', + Etherscan = 'Etherscan', + ExportKeys = 'ExportKeys', + Feedback = 'Feedback', + File = 'File', + FundingChart = 'FundingChart', + Gear = 'Gear', + Giftbox = 'Giftbox', + HelpCircle = 'HelpCircle', + Hide = 'Hide', + History = 'History', + LinkOut = 'LinkOut', + Lock = 'Lock', + LogoShort = 'LogoShort', + Menu = 'Menu', + Mintscan = 'Mintscan', + Onboarding = 'Onboarding', + Orderbook = 'OrderbookIcon', + OrderCanceled = 'OrderCanceled', + OrderFilled = 'OrderFilled', + OrderOpen = 'OrderOpen', + OrderPartiallyFilled = 'OrderPartiallyFilled', + OrderPending = 'OrderPending', + OrderUntriggered = 'OrderUntriggered', + Overview = 'Overview', + Pencil = 'Pencil', + Positions = 'Positions', + PriceChart = 'PriceChart', + Privacy = 'Privacy', + Qr = 'Qr', + Search = 'Search', + Send = 'Send', + Share = 'Share', + Show = 'Show', + Star = 'Star', + Terminal = 'Terminal', + TogglesMenu = 'TogglesMenu', + Trade = 'Trade', + Transfer = 'Transfer', + Triangle = 'Triangle', + TryAgain = 'TryAgain', + Warning = 'Warning', + Website = 'Website', + Whitepaper = 'Whitepaper', +} + +const icons = { + [IconName.AddressConnector]: AddressConnectorIcon, + [IconName.Arrow]: ArrowIcon, + [IconName.Bar3]: Bar3Icon, + [IconName.BoxClose]: BoxCloseIcon, + [IconName.Calculator]: CalculatorIcon, + [IconName.Caret]: CaretIcon, + [IconName.CautionCircle]: CautionCircleIcon, + [IconName.CautionCircleStroked]: CautionCircleStrokeIcon, + [IconName.Check]: CheckIcon, + [IconName.ChevronLeft]: ChevronLeftIcon, + [IconName.ChevronRight]: ChevronRightIcon, + [IconName.Clock]: ClockIcon, + [IconName.Close]: CloseIcon, + [IconName.CoinMarketCap]: CoinMarketCapIcon, + [IconName.Coins]: CoinsIcon, + [IconName.Comment]: CommentIcon, + [IconName.Copy]: CopyIcon, + [IconName.Cube]: CubeIcon, + [IconName.DepthChart]: DepthChartIcon, + [IconName.Discord]: DiscordIcon, + [IconName.Etherscan]: EtherscanIcon, + [IconName.ExportKeys]: ExportKeysIcon, + [IconName.Feedback]: FeedbackIcon, + [IconName.File]: FileIcon, + [IconName.FundingChart]: FundingChartIcon, + [IconName.Gear]: GearIcon, + [IconName.Giftbox]: GiftboxIcon, + [IconName.HelpCircle]: HelpCircleIcon, + [IconName.Hide]: HideIcon, + [IconName.History]: HistoryIcon, + [IconName.LinkOut]: LinkOutIcon, + [IconName.Lock]: LockIcon, + [IconName.LogoShort]: LogoShortIcon, + [IconName.Menu]: MenuIcon, + [IconName.Mintscan]: MintscanIcon, + [IconName.Orderbook]: OrderbookIcon, + [IconName.OrderCanceled]: OrderCanceledIcon, + [IconName.OrderFilled]: OrderFilledIcon, + [IconName.OrderOpen]: OrderOpenIcon, + [IconName.OrderPartiallyFilled]: OrderPartiallyFilledIcon, + [IconName.OrderPending]: OrderPendingIcon, + [IconName.OrderUntriggered]: OrderUntriggeredIcon, + [IconName.Overview]: OverviewIcon, + [IconName.Pencil]: PencilIcon, + [IconName.Positions]: PositionsIcon, + [IconName.PriceChart]: PriceChartIcon, + [IconName.Privacy]: PrivacyIcon, + [IconName.Qr]: QrIcon, + [IconName.Search]: SearchIcon, + [IconName.Send]: SendIcon, + [IconName.Share]: ShareIcon, + [IconName.Show]: ShowIcon, + [IconName.Star]: StarIcon, + [IconName.Terminal]: TerminalIcon, + [IconName.TogglesMenu]: TogglesMenuIcon, + [IconName.Trade]: TradeIcon, + [IconName.Transfer]: TransferIcon, + [IconName.Triangle]: TriangleIcon, + [IconName.TryAgain]: TryAgainIcon, + [IconName.Warning]: WarningIcon, + [IconName.Website]: WebsiteIcon, + [IconName.Whitepaper]: WhitepaperIcon, +} as Record; + +type ElementProps = { + iconName?: IconName; + iconComponent?: ElementType; +}; + +type StyleProps = { + className?: string; +}; + +export const Icon = styled( + ({ + iconName, + iconComponent: Component = iconName && icons[iconName], + className, + ...props + }: ElementProps & StyleProps) => (Component ? : null) +)` + width: 1em; + height: 1em; +`; diff --git a/src/components/IconButton.stories.tsx b/src/components/IconButton.stories.tsx new file mode 100644 index 0000000..9f22807 --- /dev/null +++ b/src/components/IconButton.stories.tsx @@ -0,0 +1,58 @@ +import type { Story } from '@ladle/react'; + +import { ButtonAction, ButtonShape, ButtonSize, ButtonState, ButtonType } from '@/constants/buttons'; + +import { IconName } from '@/components/Icon'; +import { IconButton, type IconButtonProps } from '@/components/IconButton'; + +import { StoryWrapper } from '.ladle/components'; + +export const IconButtonStory: Story = (args) => { + return ( + + + + ); +}; + +IconButtonStory.args = { + href: '', +}; + +IconButtonStory.argTypes = { + iconName: { + options: Object.values(IconName), + control: { type: 'select' }, + defaultValue: IconName.Caret, + }, + type: { + options: Object.values(ButtonType), + control: { type: 'select' }, + defaultValue: ButtonType.Button, + }, + action: { + options: Object.values(ButtonAction), + control: { type: 'select' }, + defaultValue: ButtonAction.Primary, + }, + state: { + options: Object.values(ButtonState), + control: { type: 'select' }, + defaultValue: ButtonState.Default, + }, + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.Base, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Circle, + }, + isToggle: { + options: [true, false], + control: { type: 'select' }, + defaultValue: false, + } +}; diff --git a/src/components/IconButton.tsx b/src/components/IconButton.tsx new file mode 100644 index 0000000..cba0570 --- /dev/null +++ b/src/components/IconButton.tsx @@ -0,0 +1,83 @@ +import { forwardRef, type ElementType } from 'react'; +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { Button, type ButtonProps } from '@/components/Button'; +import { Icon, IconName } from '@/components/Icon'; +import { ToggleButton, type ToggleButtonProps } from '@/components/ToggleButton'; + +type ElementProps = { + isToggle?: boolean; + iconName?: IconName; + iconComponent?: ElementType; +}; + +export type IconButtonProps = ElementProps & ButtonProps & ToggleButtonProps; + +export const IconButton = forwardRef( + ( + { + size = ButtonSize.XSmall, + shape = ButtonShape.Circle, + + href, + isToggle, + iconName, + iconComponent, + + onClick, + onPressedChange, + className, + + ...otherProps + }, + ref + ) => { + return isToggle ? ( + + + + ) : ( + + + + ); + } +); + +const Styled: Record = {}; + +const buttonMixin = css` + // Params + --button-icon-size: 1.125em; + + // Rules + > * { + font-size: var(--button-icon-size); + } +`; + +Styled.IconButton = styled(Button)` + ${buttonMixin} +`; + +Styled.IconToggleButton = styled(ToggleButton)` + ${buttonMixin} +`; diff --git a/src/components/Input.stories.tsx b/src/components/Input.stories.tsx new file mode 100644 index 0000000..f6c61f6 --- /dev/null +++ b/src/components/Input.stories.tsx @@ -0,0 +1,34 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { Input, InputType, InputProps } from '@/components/Input'; + +import { StoryWrapper } from '.ladle/components'; + +export const InputStory: Story = (args) => { + const [value, setValue] = useState(''); + return ( + + ) => setValue(e.target.value)} + value={value} + /> + + ); +}; + +InputStory.args = { + decimals: 2, + max: '', + min: '', + placeholder: '', +}; + +InputStory.argTypes = { + type: { + options: Object.values(InputType), + control: { type: 'select' }, + defaultValue: InputType.Number, + }, +}; diff --git a/src/components/Input.tsx b/src/components/Input.tsx new file mode 100644 index 0000000..5184433 --- /dev/null +++ b/src/components/Input.tsx @@ -0,0 +1,219 @@ +import { Dispatch, forwardRef, SetStateAction } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; +import { NumericFormat, type NumberFormatValues, type SourceInfo } from 'react-number-format'; +import type { SyntheticInputEvent } from 'react-number-format/types/types'; + +import { + LEVERAGE_DECIMALS, + PERCENT_DECIMALS, + TOKEN_DECIMALS, + USD_DECIMALS, +} from '@/constants/numbers'; + +import { BIG_NUMBERS, MustBigNumber } from '@/lib/numbers'; +import { useLocaleSeparators } from '@/hooks'; + +export enum InputType { + Currency = 'Currency', + Leverage = 'Leverage', + Number = 'Number', + Percent = 'Percent', + Text = 'Text', + Search = 'Search', +} + +type StyleProps = { + className?: string; +}; + +type ElementProps = { + type?: InputType; + value?: string | number | null; + + allowNegative?: boolean; + decimals?: number; + disabled?: boolean; + id?: string; + max?: number; + onBlur?: () => void; + onChange?: + | Dispatch> + | React.ReactEventHandler + | ((values: NumberFormatValues, e: SourceInfo) => void); + onFocus?: () => void; + onInput?: ({ + value, + floatValue, + formattedValue, + }: { + value: string; + floatValue?: number; + formattedValue: string; + }) => void; + placeholder?: string; +}; + +export type InputProps = ElementProps & StyleProps; + +export const Input = forwardRef( + ( + { + className, + allowNegative = false, + decimals, + disabled, + id, + max, + placeholder, + value, + onBlur, + onChange, + onFocus, + onInput, + type = InputType.Number, + ...otherProps + }, + ref + ) => { + const { decimal: LOCALE_DECIMAL_SEPARATOR } = useLocaleSeparators(); + + const numberFormatConfig = { + [InputType.Currency]: { + defaultDecimals: USD_DECIMALS, + prefix: '$', + }, + [InputType.Leverage]: { + defaultDecimals: LEVERAGE_DECIMALS, + suffix: '×', + }, + [InputType.Number]: { + defaultDecimals: TOKEN_DECIMALS, + }, + [InputType.Percent]: { + defaultDecimals: PERCENT_DECIMALS, + suffix: '%', + }, + [InputType.Text]: null, + [InputType.Search]: null, + }[type]; + + decimals = decimals !== undefined ? decimals : numberFormatConfig?.defaultDecimals; + + const defaultNumberPlaceholder = `${numberFormatConfig?.prefix ?? ''}${BIG_NUMBERS.ZERO.toFixed( + decimals !== undefined ? decimals : USD_DECIMALS + )}${numberFormatConfig?.suffix ?? ''}`; + + const formattedValue = + typeof value === 'string' + ? value + : value != null + ? Intl.NumberFormat(navigator.language || 'en-US', { + maximumFractionDigits: decimals, + }).format(value) + : ''; + + return ( + + {type === InputType.Text || type === InputType.Search ? ( + } + id={id} + // Events + onBlur={onBlur} + onChange={onChange} + onFocus={onFocus} + onInput={onInput} + // Native + disabled={disabled} + placeholder={placeholder} + value={value} + // Other + {...otherProps} + /> + ) : ( + >} + id={id} + // NumericFormat + allowNegative={allowNegative} + decimalScale={decimals} + decimalSeparator={LOCALE_DECIMAL_SEPARATOR} + isAllowed={({ floatValue }: NumberFormatValues) => + floatValue ? floatValue <= (max || Number.MAX_VALUE) : true + } + prefix={numberFormatConfig?.prefix} + suffix={numberFormatConfig?.suffix} + // Events + onBlur={onBlur} + onValueChange={onChange} + onFocus={onFocus} + onInput={(e: SyntheticInputEvent) => { + if (!onInput) return; + const value = e.target.value; + const { prefix = '', suffix = '' } = numberFormatConfig || {}; + // Remove prefix and suffix, replace commas with periods + const formattedValue = value.replace(prefix, '').replace(suffix, ''); + + const floatValue: number | undefined = isNaN(Number(formattedValue.replace(',', '.'))) + ? undefined + : Number(formattedValue.replace(',', '.')); + + onInput?.({ value, floatValue, formattedValue }); + }} + // Native + disabled={disabled} + placeholder={placeholder || defaultNumberPlaceholder} + value={formattedValue} + autoComplete="off" + autoCorrect="off" + {...otherProps} + /> + )} + + ); + } +); + +const Styled: Record = {}; + +Styled.InputContainer = styled.div` + width: 100%; + min-height: 100%; + height: 100%; + overflow: hidden; + + background-color: inherit; + border-radius: inherit; + + input { + user-select: all; + flex: 1; + width: 100%; + } +`; + +const InputStyle = css` + font: var(--font-base-book); + outline: none; + border: none; + background-color: var(--input-backgroundColor); + color: var(--color-text-2); + min-width: 0; + height: 100%; + + ::placeholder { + color: var(--color-text-0); + opacity: 1; + } +`; + +Styled.NumericFormat = styled(NumericFormat)` + ${InputStyle} + font-feature-settings: var(--fontFeature-monoNumbers); +`; + +Styled.Input = styled.input` + ${InputStyle} +`; diff --git a/src/components/Link.stories.tsx b/src/components/Link.stories.tsx new file mode 100644 index 0000000..46721c6 --- /dev/null +++ b/src/components/Link.stories.tsx @@ -0,0 +1,34 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { Link } from '@/components/Link'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const LinkStory: Story> = (args) => { + return ( + + + Trade Now + + + ); +}; + +LinkStory.args = { + href: 'https://trade.dydx.exchange', +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/Link.tsx b/src/components/Link.tsx new file mode 100644 index 0000000..ee5bef0 --- /dev/null +++ b/src/components/Link.tsx @@ -0,0 +1,73 @@ +import { forwardRef } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + analyticsConfig?: { + event: string; + meta?: any; + }; + children: React.ReactNode; + href?: string; + onClick?: () => void; + withIcon?: boolean; +}; + +type StyleProps = { + className?: string; +}; + +export const Link = forwardRef( + ( + { + analyticsConfig, + children, + className, + href, + onClick, + withIcon = false, + ...props + }: ElementProps & StyleProps, + ref + ) => ( + { + if (analyticsConfig) { + console.log(analyticsConfig); + } + + onClick?.(); + }} + rel="noopener noreferrer" + target="_blank" + {...props} + > + {children} + {withIcon && } + + ) +); + +const Styled: Record = {}; + +Styled.A = styled.a` + --link-color: inherit; + color: var(--link-color); + + ${layoutMixins.spacedRow} + gap: 0.25em; + + &:hover { + text-decoration: underline; + } + + &:visited { + color: var(--link-color); + } +`; diff --git a/src/components/Loading/Loading.stories.tsx b/src/components/Loading/Loading.stories.tsx new file mode 100644 index 0000000..c0e5942 --- /dev/null +++ b/src/components/Loading/Loading.stories.tsx @@ -0,0 +1,38 @@ +import type { Story } from '@ladle/react'; + +import { LoadingDots, LoadingDotsProps } from '@/components/Loading/LoadingDots'; +import { LoadingSpinner } from '@/components/Loading/LoadingSpinner'; +import { LoadingOutput } from '@/components/Loading/LoadingOutput'; +import { StoryWrapper } from '.ladle/components'; + +export const Dots: Story = (args) => { + return ( + + + + ); +}; + +Dots.args = { + size: 4, +}; + +export const Spinner: Story = (args) => { + return ( + + + + ); +}; + +Spinner.args = {}; + +export const Output: Story = (args) => { + return ( + + + + ); +}; + +Output.args = {}; diff --git a/src/components/Loading/LoadingDots.tsx b/src/components/Loading/LoadingDots.tsx new file mode 100644 index 0000000..7d8b94a --- /dev/null +++ b/src/components/Loading/LoadingDots.tsx @@ -0,0 +1,63 @@ +import styled, { css } from 'styled-components'; + +// Types/constants +export type LoadingDotsProps = { + size?: number; +}; + +// Component +export const LoadingDots: React.FC = ({ size = 1 }) => ( + + + + + +); + +// Style +const LoadingDotsContainer = styled.div<{ size: number }>` + // Props/defaults + --size: 1; + + // Variants + ${({ size }) => css` + --size: ${size}; + `} + + // Calculations + --dot-size: calc(var(--size) * 0.0875em); + + // Rules + display: inline-grid; + grid-auto-flow: column; + gap: var(--dot-size); + user-select: none; + + > * { + width: var(--dot-size); + height: var(--dot-size); + background-color: currentColor; + border-radius: 50%; + animation: Dot 1.4s infinite both; + + &:nth-child(2) { + animation-delay: 0.2s; + } + + &:nth-child(3) { + animation-delay: 0.4s; + } + } + + @keyframes Dot { + 0% { + opacity: 0.2; + } + 20% { + opacity: 1; + } + 100% { + opacity: 0.2; + } + } +`; diff --git a/src/components/Loading/LoadingOutput.tsx b/src/components/Loading/LoadingOutput.tsx new file mode 100644 index 0000000..9167d0c --- /dev/null +++ b/src/components/Loading/LoadingOutput.tsx @@ -0,0 +1,27 @@ +import styled, { keyframes } from 'styled-components'; + +export const LoadingOutput = styled.div` + --loadingOutput-width: 4em; + --loadingOutput-color: currentColor; + + background: linear-gradient( + 116deg, + hsla(245, 11%, 55%, 0.4) 0%, + var(--loadingOutput-color) 50%, + hsla(245, 11%, 55%, 0.4) 100% + ); + background-size: 200% auto; + border-radius: 0.5em; + height: 1em; + width: var(--loadingOutput-width); + opacity: 0.6; + + animation: ${keyframes` + from { + background-position: 0 0; + } + to { + background-position: -200% 0; + } + `} 1.5s linear infinite; +`; diff --git a/src/components/Loading/LoadingSpinner.tsx b/src/components/Loading/LoadingSpinner.tsx new file mode 100644 index 0000000..d4bb299 --- /dev/null +++ b/src/components/Loading/LoadingSpinner.tsx @@ -0,0 +1,68 @@ +import { layoutMixins } from '@/styles/layoutMixins'; +import styled, { type AnyStyledComponent, keyframes } from 'styled-components'; + +// In some strange cases, hiding a spinner on one part of the page causes the linearGradient to +// be hidden on all other instances of the page. An id can be passed in to prevent this. +export const LoadingSpinner: React.FC<{ + id?: string; + className?: string; + disabled?: boolean; +}> = ({ id, className, disabled = false }) => { + return ( + + + + {!disabled && ( + + )} + + + ); +}; + +export const LoadingSpace: React.FC<{ className?: string; id: string }> = ({ className, id }) => ( + + + +); + +const Styled: Record = {}; + +Styled.LoadingSpaceContainer = styled.div` + ${layoutMixins.centered} +`; + +Styled.Spinner = styled.div` + --spinner-width: auto; + + line-height: 0; + color: var(--color-text-0); +`; + +Styled.LoadingSpinnerSvg = styled.svg` + width: var(--spinner-width); + + animation: ${keyframes` + to { + transform: rotate(1turn); + } + `} 1.5s linear infinite; +`; diff --git a/src/components/MarginUsageRing.stories.tsx b/src/components/MarginUsageRing.stories.tsx new file mode 100644 index 0000000..ae13f99 --- /dev/null +++ b/src/components/MarginUsageRing.stories.tsx @@ -0,0 +1,53 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { MarginUsageRing } from '@/components/MarginUsageRing'; + +import { StoryWrapper } from '.ladle/components'; + +export const MarginUsageRingStory: Story<{ value: number }> = (args) => { + return ( + + + + + + ); +}; + +MarginUsageRingStory.args = { + value: 0, +}; + +export const MarginUsageRingStyled: Story<{ value: number }> = (args) => { + return ( + + + + + + ); +}; + +MarginUsageRingStyled.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.MarginUsageRing = styled(MarginUsageRing)` + color: var(--color-accent); +`; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/MarginUsageRing.tsx b/src/components/MarginUsageRing.tsx new file mode 100644 index 0000000..51483f1 --- /dev/null +++ b/src/components/MarginUsageRing.tsx @@ -0,0 +1,32 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { RiskLevels } from '@/constants/abacus'; +import { UsageColorFromRiskLevel } from '@/styles/colors'; + +import { Ring } from '@/components/Ring'; + +import { abacusHelper } from '@/lib/abacus'; + +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; +}; + +export const MarginUsageRing = ({ className, value }: ElementProps & StyleProps) => ( + +); + +const Styled: Record = {}; + +Styled.MarginUsageRing = styled(Ring)<{ riskLevel: RiskLevels }>` + ${({ riskLevel }) => UsageColorFromRiskLevel(riskLevel)} + width: 1rem; + height: 1rem; +`; diff --git a/src/components/NavigationMenu.stories.tsx b/src/components/NavigationMenu.stories.tsx new file mode 100644 index 0000000..290b0fa --- /dev/null +++ b/src/components/NavigationMenu.stories.tsx @@ -0,0 +1,124 @@ +import type { Story } from '@ladle/react'; + +import { NavigationMenu } from '@/components/NavigationMenu'; +import { HashRouter } from 'react-router-dom'; + +import { StoryWrapper } from '.ladle/components'; + +export const NavigationMenuStory: Story> = (args) => { + const exampleItems = [ + { + group: 'navigation', + groupLabel: 'Views', + items: [ + { + value: 'markets', + label: 'Markets', + href: './markets', + subitems: [ + { + value: 'ETH', + label: 'Ethereum', + href: './markets/ETH', + }, + { + value: 'BTC', + label: 'Bitcoin', + href: './markets/BTC', + }, + ], + }, + { + value: 'trade', + label: 'Trade', + href: './trade', + subitems: [ + { + value: 'ETH-USD', + label: 'ETH', + href: './trade/ETH-USD', + }, + { + value: 'BTC-USD', + label: 'BTC', + href: './trade/BTC-USD', + }, + ], + }, + { + value: 'portfolio', + label: 'Portfolio', + href: './portfolio', + subitems: [ + { + value: 'overview', + label: 'Overview', + href: './portfolio/overview', + }, + { + value: 'positions', + label: 'Positions', + href: './portfolio/positions', + }, + { + value: 'history', + label: 'History', + href: './portfolio/history', + subitems: [ + { + value: 'trades', + label: 'Trades', + href: './portfolio/overview/trades', + subitems: [ + { + value: 'transfers', + label: 'Transfers', + href: './portfolio/positions/transfers', + }, + ], + }, + { + value: 'transfers', + label: 'Transfers', + href: './portfolio/positions/transfers', + }, + { + value: 'payments', + label: 'Payments', + href: './portfolio/history/payments', + }, + ], + }, + ], + }, + ], + }, + ]; + + return ( + + + Menu + + } + /> + + ); +}; + +NavigationMenuStory.args = {}; + +NavigationMenuStory.argTypes = { + orientation: { + options: ['vertical', 'horizontal'], + control: { type: 'select' }, + defaultValue: 'vertical', + }, + submenuPlacement: { + options: ['inline', 'viewport'], + control: { type: 'select' }, + defaultValue: 'inline', + }, +}; diff --git a/src/components/NavigationMenu.tsx b/src/components/NavigationMenu.tsx new file mode 100644 index 0000000..1e2f16e --- /dev/null +++ b/src/components/NavigationMenu.tsx @@ -0,0 +1,531 @@ +import { forwardRef, Ref, useEffect, useRef, useState } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { NavLink, matchPath, useLocation } from 'react-router-dom'; + +import { MenuConfig, MenuItem } from '@/constants/menus'; + +import { isExternalLink } from '@/lib/isExternalLink'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +import { + Root, + List, + Trigger, + Content, + Item, + Link, + Sub, + Viewport, +} from '@radix-ui/react-navigation-menu'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { Tag } from './Tag'; +import { Icon, IconName } from './Icon'; + +type ElementProps = { + items: MenuConfig; + onSelectItem?: (value: MenuItemValue) => void; + onSelectGroup?: (value: MenuGroupValue) => void; +}; + +type StyleProps = { + orientation?: 'vertical' | 'horizontal'; + itemOrientation?: 'vertical' | 'horizontal'; + submenuPlacement?: 'inline' | 'viewport'; + dir?: 'ltr' | 'rtl'; + className?: string; +}; + +const NavItem = forwardRef( + ( + { + value, + slotBefore, + label, + tag, + href, + slotAfter = isExternalLink(href) ? : undefined, + onSelect, + subitems, + ...props + }: MenuItem, + ref: Ref | Ref | Ref + ) => { + const location = useLocation(); + + const children = ( + <> + {slotBefore} + + {/* {`${label}${subitems?.length ? ' ' : ''}`} */} + {label} + {tag && ( + <> + {' '} + {tag} + + )} + + {slotAfter} + {subitems?.length && } + + ); + + return href ? ( + onSelect?.(value)} + asChild + target={isExternalLink(href) ? '_blank' : undefined} + > + } {...props}> + {children} + + + ) : props.onClick ? ( + onSelect?.(value)}> + + + ) : ( +
} {...props}> + {children} +
+ ); + } +); + +type TriggerRef = HTMLAnchorElement | HTMLDivElement | HTMLButtonElement | null; + +export const NavigationMenu = ({ + onSelectItem, + onSelectGroup, + items, + orientation = 'vertical', + itemOrientation = 'horizontal', + submenuPlacement = 'inline', // orientation === 'horizontal' ? 'viewport' : 'inline', + dir = 'ltr', + className, +}: ElementProps & StyleProps) => { + // Disable click (close) in the first 500ms after hover (open) + // https://github.com/radix-ui/primitives/issues/1630#issuecomment-1545995075 + const [clickIsDisabled, setClickIsDisabled] = useState(false); + const triggerRefs = useRef({} as { [value: string]: TriggerRef }); + + useEffect(() => { + const observer = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + if ( + mutation.type === 'attributes' && + mutation.attributeName === 'data-state' && + (mutation.target as unknown as HTMLOrSVGElement).dataset.state === 'open' && + mutation.target !== document.activeElement + ) { + setClickIsDisabled(true); + setTimeout(() => setClickIsDisabled(false), 500); + } + } + }); + + for (const element of Object.values(triggerRefs.current).filter(isTruthy)) { + observer.observe(element, { attributes: true }); + } + + return () => observer.disconnect(); + }, []); + + const renderSubitems = ({ + item, + depth = 0, + }: { + item: MenuItem; + depth: number; + }) => ( + <> + 0} + ref={(ref: TriggerRef) => (triggerRefs.current[item.value] = ref)} + onClick={(e: MouseEvent) => { + if (clickIsDisabled) { + e.preventDefault(); + } + }} + > + + + + + + 0 ? 'menu' : orientation === 'vertical' ? 'vertical' : 'menu'} + > + {item?.subitems?.map((subitem) => ( + + {subitem?.subitems ? ( + renderSubitems({ item: subitem, depth: depth + 1 }) + ) : ( + + )} + + ))} + + + + + ); + + return ( + + {items.map((group) => ( + + {group.groupLabel && ( + +

{group.groupLabel}

+
+ )} + + + {group.items.map((item) => ( + + {item.subitems ? ( + renderSubitems({ item, depth: 0 }) + ) : ( + + )} + + ))} + +
+ ))} + + {submenuPlacement === 'viewport' && } +
+ ); +}; + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + /* Params */ + --navigationMenu-height: auto; + + --navigationMenu-item-height: 2rem; + + --navigationMenu-item-checked-backgroundColor: var(--color-layer-1); + --navigationMenu-item-checked-textColor: var(--color-text-2); + --navigationMenu-item-highlighted-backgroundColor: var(--color-layer-4); + --navigationMenu-item-highlighted-textColor: var(--color-text-2); + --navigationMenu-item-radius: 0.5rem; + --navigationMenu-item-padding: 0.5rem 1rem; + + /* Rules */ + align-self: stretch; + + --submenu-side-offset: 0.75rem; // placement="viewport" + // --submenu-side-offset: 1rem; // placement="inline" + + position: relative; + + &[data-orientation='horizontal'] { + ${layoutMixins.row} + align-items: stretch; + + margin: calc((var(--navigationMenu-height) - var(--navigationMenu-item-height)) / 2) 0; + height: max-content; + } + &[data-orientation='vertical'] { + ${layoutMixins.column} + } + + div[style='position: relative;'] { + display: grid; + } +`; + +Styled.Viewport = styled(Viewport)` + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} + --popover-origin: center top; + + ${layoutMixins.stack} + align-content: start; + justify-items: center; + + width: var(--radix-navigation-menu-viewport-width); + height: var(--radix-navigation-menu-viewport-height); + max-height: var(--radix-navigation-menu-viewport-height); + transition: 0.3s; + box-sizing: content-box; + + position: absolute; + + &[data-orientation='horizontal'] { + top: calc(100% + var(--submenu-side-offset)); + left: 0; + right: 0; + margin: auto; + display: grid; + justify-content: center; + + z-index: 2; + } + + &[data-orientation='vertical'] { + left: 100%; + /* top: 100%; */ + } +`; + +Styled.Content = styled(Content)` + ${popoverMixins.popoverAnimation} + transform-origin: center top; + + &[data-placement='inline'] { + max-height: 100vh; + + ${Styled.List}[data-orientation="horizontal"] & { + /* position: absolute; + top: calc(100% + var(--submenu-side-offset)); + left: 50%; + right: 50%; */ + + position: relative; + width: 0; + left: 50%; + right: 50%; + + display: grid; + justify-content: center; + + z-index: 2; + } + + ${Styled.List}[data-orientation="menu"] & { + position: absolute; + left: 100%; + top: 0; + right: auto; + display: grid; + justify-content: start; + } + } + + &[data-placement='viewport'] { + position: absolute; + + &[data-motion='from-start'] { + animation: ${keyframes` + from { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='from-end'] { + animation: ${keyframes` + from { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='to-start'] { + animation: ${keyframes` + to { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='to-end'] { + animation: ${keyframes` + to { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + } +`; + +Styled.Sub = styled(Sub)` + &[data-placement='inline'] { + ${popoverMixins.popover} + --popover-width: max-content; + overflow: visible; + + ${Styled.List}[data-orientation="vertical"] > & { + margin-top: var(--gap, 0.25rem); + + padding: 0.5rem; + } + + ${Styled.List}[data-orientation="menu"] & { + border-top-left-radius: 0 !important; + } + } +`; + +Styled.Group = styled.section` + ${Styled.Root}[data-orientation="vertical"] & { + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: 3rem; + } + + ${layoutMixins.column} + + color: var(--color-text-0); +`; + +Styled.GroupHeader = styled.header` + ${layoutMixins.stickyHeader} + ${layoutMixins.row} + + padding: 0.5rem 0.75rem 0rem; + font: var(--font-small-medium); +`; + +Styled.List = styled(List)` + align-self: center; + + &[data-orientation='horizontal'] { + ${layoutMixins.row} + gap: 0.5rem; + align-items: start; + } + + &[data-orientation='vertical'] { + ${layoutMixins.flexColumn} + gap: 0.25rem; + } +`; + +Styled.ListItem = styled(Item)` + /* display: contents; */ + display: grid; + position: relative; + + ${Styled.List}[data-orientation="horizontal"] > & { + gap: var(--submenu-side-offset); + } + + /* ${Styled.List}[data-orientation="menu"] > & { + grid-template-columns: 1fr 0; + align-items: start; + gap: 2rem; + } */ + + /* &:has([data-state="open"]) { + position: sticky; + left: 0; + right: 0; + } */ +`; + +Styled.SubMenuTrigger = styled(Trigger)` + border-radius: var(--navigationMenu-item-radius); + outline-offset: -2px; + + &[data-state='open'] { + div { + background-color: var(--navigationMenu-item-checked-backgroundColor); + color: var(--navigationMenu-item-checked-textColor); + } + + svg { + rotate: 0.5turn; + } + } +`; + +Styled.NavItem = styled(NavItem)<{ orientation: 'horizontal' | 'vertical' }>` + ${({ subitems }) => + subitems?.length + ? css` + ${popoverMixins.trigger} + --trigger-backgroundColor: transparent; + --trigger-open-backgroundColor: var(--color-layer-3); + ` + : css` + &:hover:not(.active) { + background-color: var(--navigationMenu-item-highlighted-backgroundColor); + color: var(--navigationMenu-item-highlighted-textColor); + } + `} + + ${popoverMixins.item} + --item-checked-backgroundColor: var(--navigationMenu-item-checked-backgroundColor); + --item-checked-textColor: var(--navigationMenu-item-checked-textColor); + --item-highlighted-backgroundColor: var(--navigationMenu-item-highlighted-backgroundColor); + --item-highlighted-textColor: var(--navigationMenu-item-highlighted-textColor); + --item-radius: var(--navigationMenu-item-radius); + --item-padding: var(--navigationMenu-item-padding); + + /* ${popoverMixins.backdropOverlay} */ + + ${layoutMixins.scrollSnapItem} + + min-height: var(--navigationMenu-item-height); + + ${({ orientation }) => + ({ + horizontal: css` + ${layoutMixins.row} + `, + vertical: css` + ${layoutMixins.column} + justify-items: center; + align-content: center; + `, + }[orientation])} + gap: 0.7rem 0.5rem; + + > span { + flex: 1; + + display: inline-flex; + align-items: center; + gap: 0.5ch; + } + + /* Border-radius! */ + + ${Styled.List}[data-orientation="menu"] & { + --item-radius: 0; + } + + ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:first-child > & { + border-top-left-radius: var(--popover-radius); + + &:not([data-state='open']) { + border-top-right-radius: var(--popover-radius); + } + } + + ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:last-child > & { + border-bottom-left-radius: var(--popover-radius); + + &:not([data-state='open']) { + border-bottom-right-radius: var(--popover-radius); + } + } + + ${Styled.List}[data-orientation="menu"] ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:first-child > & { + border-top-left-radius: 0; + } +`; + +Styled.Icon = styled(Icon)` + ${Styled.List}[data-orientation="menu"] & { + rotate: -0.25turn; + } +`; diff --git a/src/components/OrderSideTag.stories.tsx b/src/components/OrderSideTag.stories.tsx new file mode 100644 index 0000000..088d456 --- /dev/null +++ b/src/components/OrderSideTag.stories.tsx @@ -0,0 +1,30 @@ +import type { Story } from '@ladle/react'; +import { OrderSide } from '@dydxprotocol/v4-client-js'; + +import { OrderSideTag } from '@/components/OrderSideTag'; + +import { StoryWrapper } from '.ladle/components'; + +export const BuyTagStory: Story<{ orderSide: OrderSide }> = (args) => { + return ( + + + + ); +}; + +BuyTagStory.args = { + orderSide: OrderSide.BUY, +}; + +export const SellTagStory: Story<{ orderSide: OrderSide }> = (args) => { + return ( + + + + ); +}; + +SellTagStory.args = { + orderSide: OrderSide.SELL, +}; diff --git a/src/components/OrderSideTag.tsx b/src/components/OrderSideTag.tsx new file mode 100644 index 0000000..430426b --- /dev/null +++ b/src/components/OrderSideTag.tsx @@ -0,0 +1,34 @@ +import { OrderSide } from '@dydxprotocol/v4-client-js'; + +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; + +import { Tag, TagSign, TagSize, TagType } from './Tag'; + +type ElementProps = { + orderSide: OrderSide; +}; + +type StyleProps = { + size?: TagSize; +}; + +export const orderSideTagSign: Record = { + [OrderSide.BUY]: TagSign.Positive, + [OrderSide.SELL]: TagSign.Negative, +}; + +export const OrderSideTag = ({ size, orderSide }: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + return ( + + {stringGetter({ + key: { + [OrderSide.BUY]: STRING_KEYS.BUY, + [OrderSide.SELL]: STRING_KEYS.SELL, + }[orderSide], + })} + + ); +}; diff --git a/src/components/Output.tsx b/src/components/Output.tsx new file mode 100644 index 0000000..f475bc1 --- /dev/null +++ b/src/components/Output.tsx @@ -0,0 +1,365 @@ +import { useContext } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; +import BigNumber from 'bignumber.js'; +import { useSelector } from 'react-redux'; +import { DateTime } from 'luxon'; + +import { + LEVERAGE_DECIMALS, + PERCENT_DECIMALS, + SMALL_PERCENT_DECIMALS, + SMALL_USD_DECIMALS, + TOKEN_DECIMALS, + USD_DECIMALS, +} from '@/constants/numbers'; + +import { UNICODE } from '@/constants/unicode'; +import { useLocaleSeparators, useStringGetter } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { LoadingOutput } from './Loading/LoadingOutput'; +import { RelativeTime } from '@/components/RelativeTime'; +import { Tag } from '@/components/Tag'; + +import { LoadingContext } from '@/contexts/LoadingContext'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; + +import { type BigNumberish, MustBigNumber, isNumber } from '@/lib/numbers'; +import { getStringsForDateTimeDiff, getTimestamp } from '@/lib/timeUtils'; + +export enum OutputType { + Text = 'Text', + CompactNumber = 'CompactNumber', + Number = 'Number', + Fiat = 'Fiat', + SmallFiat = 'SmallFiat', + CompactFiat = 'CompactFiat', + Asset = 'Asset', + Percent = 'Percent', + SmallPercent = 'SmallPercent', + Multiple = 'Multiple', + RelativeTime = 'RelativeTime', + DateTime = 'DateTime', + Date = 'Date', + Time = 'Time', +} + +export enum ShowSign { + Both = 'Both', + Negative = 'Negative', + None = 'None', +} + +type ElementProps = { + type: OutputType; + value?: BigNumberish | null; + isLoading?: boolean; + fractionDigits?: number | null; + showSign?: ShowSign; + slotRight?: React.ReactNode; + useGrouping?: boolean; + roundingMode?: BigNumber.RoundingMode; + relativeTimeFormatOptions?: { + format: 'long' | 'short' | 'narrow' | 'singleCharacter'; + resolution?: number; + stripRelativeWords?: boolean; + }; + tag?: React.ReactNode; + withParentheses?: boolean; + locale?: string; +}; + +type StyleProps = { + className?: string; + withBaseFont?: boolean; +}; + +export type OutputProps = ElementProps & StyleProps; + +export const Output = ({ + type, + value, + isLoading, + fractionDigits, + showSign = ShowSign.Negative, + slotRight, + useGrouping = true, + roundingMode = BigNumber.ROUND_HALF_UP, + relativeTimeFormatOptions = { + format: 'singleCharacter', + }, + tag, + withParentheses, + locale = navigator.language || 'en-US', + className, + withBaseFont, +}: OutputProps) => { + const selectedLocale = useSelector(getSelectedLocale); + const stringGetter = useStringGetter(); + const isDetailsLoading = useContext(LoadingContext); + const { decimal: LOCALE_DECIMAL_SEPARATOR, group: LOCALE_GROUP_SEPARATOR } = + useLocaleSeparators(); + + if (isLoading || isDetailsLoading) { + return ; + } + + switch (type) { + case OutputType.Text: { + return ( + + {value?.toString() ?? null} + + {tag && {tag}} + + ); + } + case OutputType.RelativeTime: { + const timestamp = getTimestamp(value); + if (!timestamp) return null; + + if (relativeTimeFormatOptions.format === 'singleCharacter') { + const { timeString, unitStringKey } = getStringsForDateTimeDiff( + DateTime.fromMillis(timestamp) + ); + + return ( + + + + {tag && {tag}} + + ); + } + + return ( + + + + {tag && {tag}} + + ); + } + case OutputType.Date: + case OutputType.Time: + case OutputType.DateTime: { + if ((typeof value !== 'string' && typeof value !== 'number') || !value) return null; + const date = new Date(value); + const dateString = { + [OutputType.Date]: date.toLocaleString(selectedLocale, { dateStyle: 'medium' }), + [OutputType.DateTime]: date.toLocaleString(selectedLocale, { + dateStyle: 'short', + timeStyle: 'short', + }), + [OutputType.Time]: date.toLocaleString(selectedLocale, { + hour12: false, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }), + }[type]; + + return ( + + {dateString} + + ); + } + case OutputType.CompactNumber: + case OutputType.Number: + case OutputType.Fiat: + case OutputType.SmallFiat: + case OutputType.CompactFiat: + case OutputType.Asset: + case OutputType.Percent: + case OutputType.SmallPercent: + case OutputType.Multiple: { + const hasValue = value !== null && value !== undefined; + const valueBN = MustBigNumber(value).abs(); + const isNegative = MustBigNumber(value).isNegative(); + const isPositive = MustBigNumber(value).isPositive() && !MustBigNumber(value).isZero(); + + const sign: string | undefined = { + [ShowSign.Both]: isNegative ? UNICODE.MINUS : isPositive ? UNICODE.PLUS : undefined, + [ShowSign.Negative]: isNegative ? UNICODE.MINUS : undefined, + [ShowSign.None]: undefined, + }[showSign]; + + const format = { + decimalSeparator: LOCALE_DECIMAL_SEPARATOR, + ...(useGrouping + ? { + groupSeparator: LOCALE_GROUP_SEPARATOR, + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: ' ', + fractionGroupSize: 0, + } + : {}), + }; + + return ( + + )[type] ?? '' + }${tag ? ` ${tag}` : ''}`} + className={className} + withParentheses={withParentheses} + withBaseFont={withBaseFont} + > + {sign && {sign}} + {hasValue && + { + [OutputType.CompactNumber]: () => { + if (!isNumber(value)) { + throw new Error('value must be a number for compact number output'); + } + + return Intl.NumberFormat(locale, { + style: 'decimal', + notation: 'compact', + maximumSignificantDigits: 3, + }) + .format(Math.abs(value)) + .toLowerCase(); + }, + [OutputType.Number]: () => + valueBN.toFormat(fractionDigits ?? 0, roundingMode, { + ...format, + }), + [OutputType.Fiat]: () => + valueBN.toFormat(fractionDigits ?? USD_DECIMALS, roundingMode, { + ...format, + prefix: '$', + }), + [OutputType.SmallFiat]: () => + valueBN.toFormat(fractionDigits ?? SMALL_USD_DECIMALS, roundingMode, { + ...format, + prefix: '$', + }), + [OutputType.CompactFiat]: () => { + if (!isNumber(value)) { + throw new Error('value must be a number for compact fiat output'); + } + return Intl.NumberFormat(locale, { + style: 'currency', + currency: 'USD', + notation: 'compact', + maximumSignificantDigits: 3, + }) + .format(Math.abs(value)) + .toLowerCase(); + }, + [OutputType.Asset]: () => + valueBN.toFormat(fractionDigits ?? TOKEN_DECIMALS, roundingMode, { + ...format, + }), + [OutputType.Percent]: () => + valueBN.times(100).toFormat(fractionDigits ?? PERCENT_DECIMALS, roundingMode, { + ...format, + suffix: '%', + }), + [OutputType.SmallPercent]: () => + valueBN + .times(100) + .toFormat(fractionDigits ?? SMALL_PERCENT_DECIMALS, roundingMode, { + ...format, + suffix: '%', + }), + [OutputType.Multiple]: () => + valueBN.toFormat(fractionDigits ?? LEVERAGE_DECIMALS, roundingMode, { + ...format, + suffix: '×', + }), + }[type]()} + {slotRight} + {tag && {tag}} + + ); + } + default: + return null; + } +}; + +const Styled: Record = {}; + +Styled.Output = styled.output<{ withParentheses?: boolean }>` + --output-beforeString: ''; + --output-afterString: ''; + --output-sign-color: currentColor; + + ${layoutMixins.inlineRow} + gap: 0; + + &:empty { + color: var(--color-text-0); + opacity: 0.5; + + &:after { + content: '-' var(--output-afterString); + } + } + + &:before { + content: var(--output-beforeString); + } + + &:after { + content: var(--output-afterString); + } + + ${({ withParentheses }) => + withParentheses && + css` + --output-beforeString: '('; + --output-afterString: ')'; + `} +`; + +Styled.Tag = styled(Tag)` + margin-left: 0.5ch; +`; + +Styled.Sign = styled.span` + color: var(--output-sign-color); +`; + +Styled.Text = styled(Styled.Output)``; + +Styled.Number = styled(Styled.Output)<{ withBaseFont?: boolean }>` + ${({ withBaseFont }) => + !withBaseFont && + css` + font-feature-settings: var(--fontFeature-monoNumbers); + `} +`; diff --git a/src/components/PageMenu.stories.tsx b/src/components/PageMenu.stories.tsx new file mode 100644 index 0000000..00222d2 --- /dev/null +++ b/src/components/PageMenu.stories.tsx @@ -0,0 +1,65 @@ +import { MemoryRouter } from 'react-router-dom'; +import type { Story } from '@ladle/react'; + +import type { MenuGroup } from '@/constants/menus'; + +import { PageMenu } from '@/components/PageMenu'; +import { PageMenuItemType } from './PageMenu/PageMenuItem'; + +import { StoryWrapper } from '.ladle/components'; + +export const PageMenuStory: Story> = (args) => { + return ( + + + + ); +}; + +PageMenuStory.args = { + group: 'story', + items: [ + { + value: 'language-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Language', + labelRight: 'English', + }, + { + value: 'notification-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Notifications', + }, + { + value: 'network-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Network', + }, + { + type: PageMenuItemType.RadioGroup, + value: 'english', + label: 'Language', + subitems: [ + { + value: 'english', + label: 'English', + }, + { + value: 'spanish', + label: 'Spanish', + }, + ], + }, + ], +}; + +PageMenuStory.decorators = [ + (Story) => ( + + + + ), +]; diff --git a/src/components/PageMenu.tsx b/src/components/PageMenu.tsx new file mode 100644 index 0000000..d505bea --- /dev/null +++ b/src/components/PageMenu.tsx @@ -0,0 +1,26 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import type { MenuGroup } from '@/constants/menus'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { PageMenuItem, type PageMenuItemType } from './PageMenu/PageMenuItem'; + +export const PageMenu = ({ + items, +}: MenuGroup) => ( + + {items.map((item) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.PageMenu = styled.menu` + ${layoutMixins.flexColumn} + ${layoutMixins.withInnerHorizontalBorders} + + font: var(--font-medium-book); +`; diff --git a/src/components/PageMenu/PageMenuItem.tsx b/src/components/PageMenu/PageMenuItem.tsx new file mode 100644 index 0000000..5cafbc6 --- /dev/null +++ b/src/components/PageMenu/PageMenuItem.tsx @@ -0,0 +1,27 @@ +import type { MenuItem } from '@/constants/menus'; + +import { PageMenuNavigationItem } from './PageMenuNavigationItem'; +import { PageMenuRadioGroupItem } from './PageMenuRadioGroup'; + +export enum PageMenuItemType { + Navigation = 'navigation', + Toggle = 'toggle', + RadioGroup = 'radioGroup', +} + +export const PageMenuItem = ({ + type, + ...props +}: MenuItem) => { + switch (type) { + case PageMenuItemType.Navigation: + return ; + case PageMenuItemType.Toggle: + // TODO: implement toggle item component when needed for notifications settings + return null; + case PageMenuItemType.RadioGroup: + return ; + default: + return null; + } +}; diff --git a/src/components/PageMenu/PageMenuNavigationItem.tsx b/src/components/PageMenu/PageMenuNavigationItem.tsx new file mode 100644 index 0000000..0ea4525 --- /dev/null +++ b/src/components/PageMenu/PageMenuNavigationItem.tsx @@ -0,0 +1,51 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { Link } from 'react-router-dom'; + +import type { MenuItem } from '@/constants/menus'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +export const PageMenuNavigationItem = < + MenuItemValue extends string, + PageMenuItemType extends string +>({ + href, + label, + labelRight, +}: MenuItem) => ( + + +
{label}
+ + {labelRight && {labelRight}} + + +
+ +); + +const Styled: Record = {}; + +Styled.MenuItem = styled.ul` + ${popoverMixins.item} + + --item-padding: 1.25rem 1.625rem; + /* --item-border-width: var(--border-width); */ + + ${layoutMixins.spacedRow} +`; + +Styled.RightRow = styled.div` + ${layoutMixins.row} + gap: 1rem; + + font: var(--font-base-book); + color: var(--color-text-0); +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); +`; diff --git a/src/components/PageMenu/PageMenuRadioGroup.tsx b/src/components/PageMenu/PageMenuRadioGroup.tsx new file mode 100644 index 0000000..5df5dea --- /dev/null +++ b/src/components/PageMenu/PageMenuRadioGroup.tsx @@ -0,0 +1,72 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { Root, Item } from '@radix-ui/react-radio-group'; + +import type { MenuItem } from '@/constants/menus'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +export const PageMenuRadioGroupItem = < + MenuItemValue extends string, + PageMenuItemType extends string +>({ + value: curentValue, + onSelect, + subitems, +}: MenuItem) => + subitems?.length ? ( + + {subitems.map(({ disabled, value, label, slotBefore }) => ( + +
+ <>{slotBefore} + {label} +
+ {value === curentValue ? ( + + ) : ( + + )} +
+ ))} +
+ ) : null; + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + ${layoutMixins.flexColumn} + ${layoutMixins.withInnerHorizontalBorders} + + gap: var(--border-width); +`; + +Styled.MenuItem = styled(Item)<{ $selected: boolean }>` + ${layoutMixins.spacedRow} + ${popoverMixins.item} + + --item-padding: 1.25rem 1.625rem; + --item-checked-backgroundColor: var(--color-layer-0); +`; + +Styled.CheckIcon = styled(Icon)` + padding: 4px; + + border-radius: 50%; + + color: var(--color-text-1); + background-color: var(--color-accent); +`; + +Styled.EmptyIcon = styled.div` + width: 0.9em; + height: 0.9em; + + box-shadow: 0 0 0 0.1em var(--color-layer-5); + border-radius: 50%; + + background-color: var(--color-layer-0); +`; + diff --git a/src/components/Panel.stories.tsx b/src/components/Panel.stories.tsx new file mode 100644 index 0000000..ecdb993 --- /dev/null +++ b/src/components/Panel.stories.tsx @@ -0,0 +1,18 @@ +import type { Story } from '@ladle/react'; + +import { Panel } from '@/components/Panel'; + +import { StoryWrapper } from '.ladle/components'; + +export const PanelStory: Story<{ slotHeader: React.ReactNode, children?: React.ReactNode }> = (args) => { + return ( + + + + ); +}; + +PanelStory.args = { + slotHeader: 'Header', + children: 'Content', +}; diff --git a/src/components/Panel.tsx b/src/components/Panel.tsx new file mode 100644 index 0000000..6873f96 --- /dev/null +++ b/src/components/Panel.tsx @@ -0,0 +1,89 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; +import { Link } from 'react-router-dom'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type PanelProps = { + slotHeaderContent?: string; + slotHeader?: React.ReactNode; + children?: React.ReactNode; + href?: string; + onHeaderClick?: () => void; +}; + +type PanelStyleProps = { + className?: string; + hasSeparator?: boolean; +}; + +export const Panel = ({ + slotHeaderContent, + slotHeader, + children, + href, + onHeaderClick, + hasSeparator, + className, +}: PanelProps & PanelStyleProps) => ( + + {href ? ( + + {slotHeader ? ( + slotHeader + ) : ( + + {slotHeaderContent} + + + )} + + ) : slotHeader ? ( + slotHeader + ) : ( + slotHeaderContent && ( + + {slotHeaderContent} + + ) + )} + {children} + +); + +const Styled: Record = {}; + +Styled.Panel = styled.section` + ${layoutMixins.flexColumn} + + background-color: var(--color-layer-3); + border-radius: 0.875rem; +`; + +Styled.Header = styled.header<{ hasSeparator?: boolean }>` + ${layoutMixins.spacedRow} + + padding: 0.875rem 1rem 0.625rem; + font-size: 0.875rem; + + ${({ hasSeparator }) => + hasSeparator && + css` + box-shadow: 0 var(--border-width) var(--border-color); + `} +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); + + font-size: 0.625rem; +`; + +Styled.Content = styled.div` + ${layoutMixins.scrollArea} + ${layoutMixins.stickyArea0} + --stickyArea0-background: transparent; + + padding: 0.5rem 1rem; +`; diff --git a/src/components/Popover.tsx b/src/components/Popover.tsx new file mode 100644 index 0000000..3f07b7d --- /dev/null +++ b/src/components/Popover.tsx @@ -0,0 +1,133 @@ +import { useMemo, useState } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { Root, Trigger, Content, Portal } from '@radix-ui/react-popover'; +import { useRect } from '@radix-ui/react-use-rect'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +export enum TriggerType { + Default = 'Default', + SearchSelect = 'SearchSelect', + MarketDropdown = 'MarketDropdown', +} + +type ElementProps = { + modal?: boolean; + open?: boolean; + onOpenChange?: (open: boolean) => void; + slotTrigger: React.ReactNode; + slotAnchor?: React.ReactNode; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; + fullWidth?: boolean; + noBlur?: boolean; + sideOffset?: number; + triggerType?: TriggerType; + withPortal?: boolean; +}; + +export type PopoverProps = ElementProps & StyleProps; + +export const Popover = ({ + modal = true, + open, + onOpenChange, + slotTrigger, + slotAnchor, + sideOffset, + fullWidth, + noBlur, + triggerType = TriggerType.Default, + withPortal = false, + className, + children, +}: PopoverProps) => { + const [trigger, setTrigger] = useState(null); + const rect = useRect(trigger); + const width = useMemo(() => fullWidth && rect?.width, undefined); + + const content = ( + { + e.preventDefault(); + }} + style={{ width }} + $noBlur={noBlur} + className={className} + sideOffset={sideOffset} + > + {children} + + ); + + return ( + + + {slotTrigger} + + {slotAnchor} + {withPortal ? {content} : content} + + ); +}; + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)<{ $noBlur?: boolean; $triggerType: TriggerType }>` + ${popoverMixins.backdropOverlay} + ${popoverMixins.trigger} + + ${({ $triggerType }) => + ({ + [TriggerType.Default]: css` + ${popoverMixins.triggerWithGrid} + `, + [TriggerType.SearchSelect]: popoverMixins.searchSelectTrigger, + [TriggerType.MarketDropdown]: popoverMixins.marketDropdownTrigger, + }[$triggerType])} + + ${({ $noBlur }) => + $noBlur && + css` + &[data-state='open']:after { + backdrop-filter: none; + } + `} + + --trigger-padding: 0; +`; + +Styled.Content = styled(Content)<{ $noBlur?: boolean }>` + ${({ $noBlur }) => + !$noBlur && + css` + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + @media (prefers-reduced-motion: no-preference) { + transition: var(--ease-in-expo) 0.25s; + + animation: ${keyframes` + from { + opacity: 0; + filter: blur(2px); + } + `} 0.2s; + } + } + + &[data-state='closed'] { + @media (prefers-reduced-motion: no-preference) { + animation: ${keyframes` + to { + opacity: 0; + filter: blur(2px); + } + `} 0.2s; + } + } + } + `} +`; diff --git a/src/components/PositionSideTag.stories.tsx b/src/components/PositionSideTag.stories.tsx new file mode 100644 index 0000000..dcaf1ab --- /dev/null +++ b/src/components/PositionSideTag.stories.tsx @@ -0,0 +1,43 @@ +import type { Story } from '@ladle/react'; + +import { PositionSide } from '@/constants/trade'; + +import { PositionSideTag } from '@/components/PositionSideTag'; + +import { StoryWrapper } from '.ladle/components'; + +export const LongTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +LongTagStory.args = { + positionSide: PositionSide.Long, +}; + +export const ShortTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +ShortTagStory.args = { + positionSide: PositionSide.Short, +}; + +export const NoneTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +NoneTagStory.args = { + positionSide: PositionSide.None, +}; diff --git a/src/components/PositionSideTag.tsx b/src/components/PositionSideTag.tsx new file mode 100644 index 0000000..710672f --- /dev/null +++ b/src/components/PositionSideTag.tsx @@ -0,0 +1,28 @@ +import { POSITION_SIDE_STRINGS, PositionSide } from '@/constants/trade'; +import { useStringGetter } from '@/hooks'; + +import { Tag, TagSign, TagSize, TagType } from '@/components/Tag'; + +type ElementProps = { + positionSide: PositionSide | null; +}; + +type StyleProps = { + size?: TagSize; +}; + +export const positionSideTagSign: Record = { + [PositionSide.Long]: TagSign.Positive, + [PositionSide.Short]: TagSign.Negative, + [PositionSide.None]: TagSign.Neutral, +}; + +export const PositionSideTag = ({ positionSide, size }: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + return ( + + {stringGetter({ key: POSITION_SIDE_STRINGS[positionSide || PositionSide.None] })} + + ); +}; diff --git a/src/components/QrCode.tsx b/src/components/QrCode.tsx new file mode 100644 index 0000000..d5bc6a6 --- /dev/null +++ b/src/components/QrCode.tsx @@ -0,0 +1,93 @@ +import { useEffect, useRef } from 'react'; +import { useSelector } from 'react-redux'; +import styled, { AnyStyledComponent } from 'styled-components'; +import QRCodeStyling from 'qr-code-styling'; + +import { getAppTheme } from '@/state/configsSelectors'; +import { AppTheme } from '@/state/configs'; + +type ElementProps = { + value: string; +}; + +type StyleProps = { + hasLogo?: boolean; + size?: number; +}; + +const DARK_LOGO_MARK_URL = '/logos/logo-mark-dark.svg'; +const LIGHT_LOGO_MARK_URL = '/logos/logo-mark-light.svg'; + +export const QrCode = ({ value, hasLogo, size = 300 }: ElementProps & StyleProps) => { + const ref = useRef(null); + const appTheme: AppTheme = useSelector(getAppTheme); + + const { current: qrCode } = useRef( + new QRCodeStyling({ + type: 'svg', + width: size, + height: size, + data: value, + margin: 8, + backgroundOptions: { + color: 'var(--color-layer-4)', + }, + imageOptions: { + imageSize: 0.4, + margin: 12, + }, + dotsOptions: { + type: 'dots', + color: 'var(--color-text-2)', + }, + cornersDotOptions: { + type: 'square', + }, + image: hasLogo + ? appTheme === AppTheme.Light + ? DARK_LOGO_MARK_URL + : LIGHT_LOGO_MARK_URL + : undefined, + cornersSquareOptions: { + type: 'extra-rounded', + color: 'var(--color-text-2)', + }, + qrOptions: { + errorCorrectionLevel: 'M', + }, + }) + ); + + useEffect(() => { + qrCode.append(ref.current || undefined); + }, []); + + useEffect(() => { + ref.current?.firstElementChild?.setAttribute('viewBox', `0 0 ${size} ${size}`); + }, [ref.current]); + + useEffect(() => { + if (hasLogo) { + qrCode.update({ + image: appTheme === AppTheme.Light ? DARK_LOGO_MARK_URL : LIGHT_LOGO_MARK_URL, + }); + } + }, [appTheme, hasLogo]); + + return ; +}; + +const Styled: Record = {}; + +Styled.QrCode = styled.div` + width: 100%; + cursor: none; + border-radius: 0.75em; + + svg { + width: 100%; + height: auto; + border-radius: inherit; + border: var(--border-width) solid var(--color-layer-6); + } +`; diff --git a/src/components/RelativeTime.tsx b/src/components/RelativeTime.tsx new file mode 100644 index 0000000..0939a74 --- /dev/null +++ b/src/components/RelativeTime.tsx @@ -0,0 +1,34 @@ +import { useEffect, useState } from 'react'; +import { useSelector } from 'react-redux'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; + +import { formatRelativeTime } from '@/lib/dateTime'; + +export const RelativeTime = ({ + timestamp, + format, + resolution = 2, +}: { + timestamp?: number; + format: 'long' | 'short' | 'narrow' | 'singleCharacter'; + resolution?: number; +}) => { + const locale = useSelector(getSelectedLocale); + + const [now, setNow] = useState(Date.now()); + + useEffect(() => { + const i = setInterval(() => setNow(Date.now()), 60_000); + return () => clearInterval(i); + }, []); + + return timestamp && new Date(timestamp).valueOf() ? ( + + ) : null; +}; diff --git a/src/components/Ring.stories.tsx b/src/components/Ring.stories.tsx new file mode 100644 index 0000000..3c8b4ca --- /dev/null +++ b/src/components/Ring.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { Ring } from '@/components/Ring'; + +import { StoryWrapper } from '.ladle/components'; + +export const RingStory: Story<{ value: number }> = (args) => { + return ( + + + + ); +}; + +RingStory.args = { + value: 0, +}; diff --git a/src/components/Ring.tsx b/src/components/Ring.tsx new file mode 100644 index 0000000..ddfe610 --- /dev/null +++ b/src/components/Ring.tsx @@ -0,0 +1,68 @@ +import styled, { css, keyframes, type AnyStyledComponent } from 'styled-components'; + +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; + withAnimation?: boolean; +}; + +export const Ring = ({ className, value, withAnimation }: ElementProps & StyleProps) => { + const radius = 12; + const circumference = radius * 2 * Math.PI; + const offset = Math.max(circumference - circumference * value, 0); + + return ( + + + + + ); +}; + +const Styled: Record = {}; + +Styled.Ring = styled.svg<{ withAnimation?: boolean }>` + --ring-color: currentColor; + + transform: rotate(-90deg); + width: 2rem; + height: 2rem; + + ${({ withAnimation }) => + withAnimation && + css` + animation: ${keyframes` + from{ + -webkit-transform: rotate(0deg); + } + to{ + -webkit-transform: rotate(360deg); + } + `} 2s linear infinite; + `} +`; diff --git a/src/components/ScrollAreas.stories.tsx b/src/components/ScrollAreas.stories.tsx new file mode 100644 index 0000000..a13d87f --- /dev/null +++ b/src/components/ScrollAreas.stories.tsx @@ -0,0 +1,259 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const ScrollAreasStory: Story<{}> = (args) => ( + + +

+ Scroll area. (layoutMixins.scrollArea) +

+ + + +
+ +

Basic sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + Sticky footer. +
+ + + +
+ +

Nested sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + + Nested sticky header. + +

+ Nested sticky area. (layoutMixins.stickyArea1) +

+ + + + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+ + + +
+ +

Super-nested sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + Nested sticky header. + + + Super-nested sticky header. + +

+ Super-nested sticky area. (layoutMixins.stickyArea2) +

+ + + + Super-nested sticky footer. +
+ + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+ +
+ +

Nested scroll area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + Nested sticky header. + + + Super-nested sticky header. + +

+ Super-nested sticky area. (layoutMixins.stickyArea2) +

+ + +

+ Nested scroll area. (layoutMixins.scrollArea) +

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + Sticky footer. +
+
+ + Super-nested sticky footer. +
+ + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+
+
+); + +const Styled: Record = {}; + +Styled.ScrollArea = styled.section<{ width: string, height: string, }>` + ${layoutMixins.container} + ${layoutMixins.scrollArea} + + width: ${({ width }) => width}; + height: ${({ height }) => height}; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + background: var(--color-layer-1); + border: 1px solid; + border-radius: 1.5rem; + + h2 { + font-size: 1.5em; + font-weight: bold; + } +`; + +Styled.StickyHeader = styled.header<{}>` + ${layoutMixins.stickyHeader} + + ${layoutMixins.row} + padding-left: 1.5rem; + padding-right: 1.5rem; + gap: 1rem; + + font-size: 1.25em; + + background: rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; +`; + +Styled.StickyFooter = styled.footer<{}>` + ${layoutMixins.stickyFooter} + + ${layoutMixins.row} + padding-left: 1.5rem; + padding-right: 1.5rem; + gap: 1rem; + + background: rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; +`; + +Styled.StickyArea0 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea0-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea0-background: var(--color-layer-2); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 1rem; +`; + +Styled.StickyArea1 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea1} + --stickyArea1-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea1-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea1-background: var(--color-layer-3); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 0.5rem; +`; + +Styled.StickyArea2 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea2} + --stickyArea2-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea2-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea2-background: var(--color-layer-4); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 0.5rem; +`; + +Styled.PlaceholderContent = styled.p` + opacity: 0.3; + + &:before { + content: 'Content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content'; + } +`; diff --git a/src/components/SearchInput.stories.tsx b/src/components/SearchInput.stories.tsx new file mode 100644 index 0000000..8a8258e --- /dev/null +++ b/src/components/SearchInput.stories.tsx @@ -0,0 +1,25 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { SearchInput } from '@/components/SearchInput'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; +import { InputType } from './Input'; + +export const SearchInputStory: Story> = (args) => ( + + + + + +); + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + width: 300px; +`; diff --git a/src/components/SearchInput.tsx b/src/components/SearchInput.tsx new file mode 100644 index 0000000..14b1772 --- /dev/null +++ b/src/components/SearchInput.tsx @@ -0,0 +1,94 @@ +import { useState } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; +import { Input, type InputProps } from '@/components/Input'; + +type ElementProps = { + onOpenChange?: (isOpen: boolean) => void; + onTextChange?: (value: string) => void; +}; + +export type SearchInputProps = ElementProps & InputProps; + +export const SearchInput = ({ + type, + placeholder, + onOpenChange, + onTextChange, +}: SearchInputProps) => { + const [isOpen, setIsOpen] = useState(false); + const [value, setValue] = useState(''); + + return ( + + { + setIsOpen(isPressed); + onOpenChange?.(isPressed); + + if (!isPressed) { + onTextChange?.(''); + setValue(''); + } + }} + /> + ) => { + setValue(e.target.value); + onTextChange?.(e.target.value); + }} + disabled={!isOpen} + placeholder={placeholder} + /> + + ); +}; + +const Styled: Record = {}; + +Styled.Search = styled.div` + ${layoutMixins.row} + + justify-content: end; + width: 100%; + height: 100%; +`; + +Styled.Input = styled(Input)<{ isOpen: boolean }>` + max-width: 0; + + @media (prefers-reduced-motion: no-preference) { + transition: max-width 0.45s var(--ease-out-expo); + } + + ${({ isOpen }) => + isOpen && + css` + padding-left: 0.5rem; + max-width: 100%; + `} +`; + +Styled.IconButton = styled(IconButton)<{ iconName: IconName.Close | IconName.Search }>` + --button-toggle-on-backgroundColor: var(--color-layer-3); + --button-toggle-on-textColor: var(--color-text-0); + + ${({ iconName }) => + iconName === IconName.Close && + css` + svg { + height: 0.875em; + } + `} +`; diff --git a/src/components/SearchSelectMenu.stories.tsx b/src/components/SearchSelectMenu.stories.tsx new file mode 100644 index 0000000..16a81d7 --- /dev/null +++ b/src/components/SearchSelectMenu.stories.tsx @@ -0,0 +1,46 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; +import styled from 'styled-components'; + +import { SearchSelectMenu } from '@/components/SearchSelectMenu'; + +import { StoryWrapper } from '.ladle/components'; + +export const SearchSelectMenuStory: Story> = (args) => { + const [selectedItem, setSelectedItem] = useState(); + + const exampleItems = [ + { + group: 'items', + groupLabel: 'Group of Items', + items: Array.from({ length: 1000 }, (_, i) => ({ + value: i.toString(), + label: `Item ${i}`, + onSelect: () => setSelectedItem(`Item ${i}`), + })), + }, + ]; + + return ( + + + + {!selectedItem ? Search and Select : {selectedItem}} + + + + ); +}; + +SearchSelectMenuStory.args = { + withSearch: true, +}; + +SearchSelectMenuStory.argTypes = {}; + +const Container = styled.div` + width: 400px; +`; diff --git a/src/components/SearchSelectMenu.tsx b/src/components/SearchSelectMenu.tsx new file mode 100644 index 0000000..74a484e --- /dev/null +++ b/src/components/SearchSelectMenu.tsx @@ -0,0 +1,159 @@ +import { type ReactNode, useState, useRef } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import { type MenuConfig } from '@/constants/menus'; +import { useOnClickOutside } from '@/hooks'; + +import { ComboboxMenu } from '@/components/ComboboxMenu'; +import { type DetailsItem } from '@/components/Details'; +import { Icon, IconName } from '@/components/Icon'; +import { Popover, TriggerType } from '@/components/Popover'; +import { WithDetailsReceipt } from '@/components/WithDetailsReceipt'; +import { WithLabel } from '@/components/WithLabel'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + asChild?: boolean; + children: ReactNode; + disabled?: boolean; + label?: string; + items: MenuConfig; + slotEmpty?: ReactNode; + withSearch?: boolean; + withReceiptItems?: DetailsItem[]; +}; + +type StyleProps = { + className?: string; +}; + +export type SearchSelectMenuProps = ElementProps & StyleProps; + +export const SearchSelectMenu = ({ + asChild, + children, + className, + disabled, + label, + items, + withSearch, + withReceiptItems, +}: SearchSelectMenuProps) => { + const [open, setOpen] = useState(false); + const searchSelectMenuRef = useRef(null); + + useOnClickOutside({ + onClickOutside(e: MouseEvent) { + setOpen(false); + }, + ref: searchSelectMenuRef, + }); + + const Trigger = asChild ? ( + children + ) : ( + + {label ? {children} : children} + + + ); + + return ( + + + + setOpen(false)} + withStickyLayout + /> + + + + ); +}; + +const Styled: Record = {}; + +Styled.MenuTrigger = styled.div` + height: var(--form-input-height); + + ${layoutMixins.spacedRow} + align-items: center; + padding: 0 1rem; +`; + +Styled.WithLabel = styled(WithLabel)` + --label-textColor: var(--color-text-0); + gap: 0.25rem; + + label { + font: var(--font-mini-book); + } +`; + +Styled.SearchSelectMenu = styled.div` + ${layoutMixins.column} +`; + +Styled.WithDetailsReceipt = styled(WithDetailsReceipt)` + --withReceipt-backgroundColor: var(--color-layer-2); + + abbr { + background-color: var(--withReceipt-backgroundColor); + } +`; + +Styled.Popover = styled(Popover)` + max-height: 30vh; + margin-top: 1rem; + border: var(--border-width) solid var(--color-layer-6); + border-radius: 0.5rem; + z-index: 2; + box-shadow: none; +`; + +Styled.ComboboxMenu = styled(ComboboxMenu)` + ${layoutMixins.withInnerHorizontalBorders} + + --comboboxMenu-backgroundColor: var(--color-layer-4); + + --comboboxMenu-input-backgroundColor: var(--color-layer-4); + --comboboxMenu-input-height: 1.375rem; + + --comboboxMenu-item-checked-backgroundColor: var(--color-layer-4); + --comboboxMenu-item-highlighted-backgroundColor: var(--color-layer-5); + --comboboxMenu-item-checked-textColor: var(--color-text-2); + --comboboxMenu-item-highlighted-textColor: var(--color-text-2); + + --stickyArea1-topHeight: var(--form-input-height); + + input:focus-visible { + outline: none; + } + + border-radius: 0.5rem; + max-height: 30vh; + overflow: auto; +`; + +Styled.TriggerIcon = styled(Icon)<{ open?: boolean }>` + width: 0.625rem; + height: 0.375rem; + color: var(--color-text-0); + + ${({ open }) => + open && + css` + transform: rotate(180deg); + `} +`; diff --git a/src/components/SelectMenu.stories.tsx b/src/components/SelectMenu.stories.tsx new file mode 100644 index 0000000..d6d50a7 --- /dev/null +++ b/src/components/SelectMenu.stories.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { SelectMenu, SelectItem } from '@/components/SelectMenu'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +const exampleItems: { value: string; label: string }[] = [ + { + value: '1', + label: 'Item 1', + }, + { + value: '2', + label: 'Item 2', + }, + { + value: '3', + label: 'Item 3', + }, + { + value: '4', + label: 'Item 4', + }, +]; + +export const SelectMenuStory: Story> = (args) => { + const [value, setValue] = useState(exampleItems[0].value); + const [value2, setValue2] = useState(exampleItems[2].value); + + return ( + + + + {exampleItems.map(({ value, label }) => ( + + ))} + + + + {exampleItems.map(({ value, label }) => ( + + ))} + + + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/SelectMenu.tsx b/src/components/SelectMenu.tsx new file mode 100644 index 0000000..387be0d --- /dev/null +++ b/src/components/SelectMenu.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { + Root, + Value, + Viewport, + Trigger, + Content, + Item, + ItemText, + ItemIndicator, + Portal, + Icon as SelectIcon, +} from '@radix-ui/react-select'; + +import { popoverMixins } from '@/styles/popoverMixins'; +import { formMixins } from '@/styles/formMixins'; + +import { WithLabel } from '@/components/WithLabel'; + +export const SelectMenu = ({ + children, + className, + value, + onValueChange, + label, + withBlur, +}: { + children: React.ReactNode; + className?: string; + value: T; + onValueChange: (value: T) => void; + label?: React.ReactNode; + withBlur?: boolean; +}) => { + return ( + + + {label ? ( + + + + ) : ( + + )} + {React.Children.toArray(children).length > 1 && } + + + + {/* */} + {children} + {/* */} + + + + ); +}; + +export const SelectItem = ({ + className, + value, + label, +}: { + className?: string; + value: T; + label: string; +}) => ( + + {label} + ✔{/* */} + +); + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)<{ $withBlur?: boolean }>` + --select-menu-trigger-maxWidth: ; + max-width: var(--select-menu-trigger-maxWidth); + ${popoverMixins.trigger} + ${({ $withBlur }) => $withBlur && popoverMixins.backdropOverlay} + + > * { + text-align: start; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +`; + +Styled.DropdownIcon = styled(SelectIcon)` + font-size: 0.675em; + color: var(--color-text-1); + margin-left: auto; +`; + +Styled.Content = styled(Content)` + --select-menu-content-maxWidth: ; + max-width: var(--select-menu-content-maxWidth); + + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} +`; + +Styled.Item = styled(Item)` + ${popoverMixins.item} +`; + +Styled.ItemIndicator = styled(ItemIndicator)` + margin-left: auto; + display: inline-flex; + transition: transform 0.3s var(--ease-out-expo); +`; + +Styled.WithLabel = styled(WithLabel)` + ${formMixins.inputLabel} + border-radius: 0; +`; diff --git a/src/components/Separator.tsx b/src/components/Separator.tsx new file mode 100644 index 0000000..64c6e6c --- /dev/null +++ b/src/components/Separator.tsx @@ -0,0 +1,106 @@ +import { Fragment } from 'react'; +import styled, { css } from 'styled-components'; + +import { Separator } from '@radix-ui/react-separator'; + +const StyledSeparator = styled(Separator)` + flex: 0 !important; + z-index: -1; + + &[data-orientation='horizontal'] { + align-self: stretch; + /* margin: 0 0 calc(-1 * var(--border-width)) 0 !important; */ + + border-bottom: solid var(--border-width) var(--color-border); + } + + &[data-orientation='vertical'] { + align-self: center; + width: 0; + height: calc(100% - 1.5rem); + margin: 0 !important; + + border-right: solid var(--border-width) var(--color-border); + } +`; + +export const HorizontalSeparator = ({ + className, + decorative = false, +}: { + className?: string; + decorative?: boolean; +}) => ; + +export const VerticalSeparator = ({ + className, + decorative = false, +}: { + className?: string; + decorative?: boolean; +}) => ; + +export const WithSeparators = ({ + layout, + children, + withSeparators = true, +}: { + layout: 'column' | 'row'; + children: React.ReactNode; + withSeparators?: boolean; +}) => ( + <> + {withSeparators + ? [children].flat().map((child, i, { length }) => ( + + {child} + {i < length - 1 && ( + + )} + + )) + : children} + +); + +export const HorizontalSeparatorWithText = styled(HorizontalSeparator)<{ contents?: string }>` + --contents: ''; + + ${({ contents }) => + contents && + css` + --contents: '${contents}'; + `} + + position: relative; + + &:before { + content: var(--contents); + position: absolute; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + background-color: inherit; + padding: 0 0.5em; + } +`; + +const StyledHorizontalSeparatorFiller = styled(Separator)` + flex: 1; + height: var(--border-width); + background-color: var(--color-border); +`; + +export const HorizontalSeparatorFiller = ({ className }: { className?: string }) => ( + +); diff --git a/src/components/StepIndicator.stories.tsx b/src/components/StepIndicator.stories.tsx new file mode 100644 index 0000000..bca960b --- /dev/null +++ b/src/components/StepIndicator.stories.tsx @@ -0,0 +1,16 @@ +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; + +import { StepIndicator, type StepIndicatorProps } from './StepIndicator'; + +export const StepIndicatorStory: Story = (args) => ( + + + +); + +StepIndicatorStory.args = { + currentStepIndex: 1, + totalSteps: 3, +}; diff --git a/src/components/StepIndicator.tsx b/src/components/StepIndicator.tsx new file mode 100644 index 0000000..c83618f --- /dev/null +++ b/src/components/StepIndicator.tsx @@ -0,0 +1,86 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + currentStepIndex: number; + totalSteps: number; +}; + +type StyleProps = { + className?: string; +}; + +export type StepIndicatorProps = ElementProps & StyleProps; + +export const StepIndicator = ({ className, currentStepIndex, totalSteps }: StepIndicatorProps) => ( + + {[...Array(totalSteps)].map((_, i) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.StepIndicator = styled.div<{ progress: number }>` + --stepIndicator-line-backgroundColor: var(--color-layer-4); + --stepIndicator-step-backgroundColor: var(--color-layer-4); + --stepIndicator-active-step-boxShadowColor: hsla(240, 32%, 21%, 1); + --stepIndicator-progress: 0; + + ${({ progress }) => css` + --stepIndicator-progress: ${progress}%; + `} + + ${layoutMixins.inlineRow} + gap: 0.75em; + position: relative; + align-self: center; + isolation: isolate; + + &:before { + content: ''; + width: 100%; + height: 0.125rem; + background-color: var(--stepIndicator-line-backgroundColor); + position: absolute; + z-index: -1; + } + + &:after { + content: ''; + width: var(--stepIndicator-progress); + height: 0.125rem; + background-color: var(--color-accent); + position: absolute; + z-index: -1; + } +`; + +Styled.Step = styled.div<{ isActive?: boolean; isFilled?: boolean }>` + width: 0.5em; + height: 0.5em; + border-radius: 50%; + color: var(--stepIndicator-step-backgroundColor); + background-color: currentColor; + + ${({ isFilled }) => + isFilled && + css` + --stepIndicator-step-backgroundColor: var(--color-accent); + `} + + ${({ isActive }) => + isActive && + css` + box-shadow: 0 0 0 0.25rem var(--stepIndicator-active-step-boxShadowColor); + `} +`; diff --git a/src/components/Switch.stories.tsx b/src/components/Switch.stories.tsx new file mode 100644 index 0000000..a366025 --- /dev/null +++ b/src/components/Switch.stories.tsx @@ -0,0 +1,28 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; +import styled from 'styled-components'; + +import { StoryWrapper } from '.ladle/components'; + +import { Switch } from '@/components/Switch'; + +type SwitchProps = Parameters; + +export const SwitchStory: Story = (args: SwitchProps) => { + const [checked, setChecked] = useState(false); + return ( + + + + + ); +}; + +const StyledSwitch = styled(Switch)` + font-size: 2em; + margin-left: 1em; +`; + +SwitchStory.args = { + disabled: false, +}; diff --git a/src/components/Switch.tsx b/src/components/Switch.tsx new file mode 100644 index 0000000..103f933 --- /dev/null +++ b/src/components/Switch.tsx @@ -0,0 +1,88 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Root, Thumb } from '@radix-ui/react-switch'; + +type ElementProps = { + checked: boolean; + onCheckedChange: (checked: boolean) => void; + disabled?: boolean; + required?: boolean; + name?: string; + value?: string; +}; + +type StyleProps = { + className?: string; +}; + +export const Switch = ({ + checked, + className, + disabled, + name, + onCheckedChange, + required, + value, +}: ElementProps & StyleProps) => ( + + + +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + --switch-width: 2.625em; + --switch-height: 1.5em; + --switch-backgroundColor: var(--color-layer-0); + --switch-thumb-backgroundColor: var(--color-layer-6); + + --switch-active-backgroundColor: var(--color-accent); + --switch-active-thumb-backgroundColor: var(--color-white); + + position: relative; + width: var(--switch-width); + height: var(--switch-height); + + background-color: var(--switch-backgroundColor); + border-radius: 100vmax; + transition: none; + -webkit-tap-highlight-color: var(--color-layer-0); + + &:disabled { + opacity: 0.75; + } + + &[data-state='checked'] { + background-color: var(--switch-active-backgroundColor); + } +`; + +Styled.Thumb = styled(Thumb)` + width: calc(var(--switch-width) / 2); + height: calc(var(--switch-height) - 0.1875em); + + display: block; + + background-color: var(--switch-thumb-backgroundColor); + border-radius: 50%; + + transform: translateX(0.125em); + + will-change: transform; + transition: transform 100ms; + + &[data-state='checked'] { + transform: translateX(calc((var(--switch-width) / 2) - 0.125em)); + background-color: var(--switch-active-thumb-backgroundColor); + } +`; diff --git a/src/components/Table.tsx b/src/components/Table.tsx new file mode 100644 index 0000000..cfde68f --- /dev/null +++ b/src/components/Table.tsx @@ -0,0 +1,922 @@ +import React, { Fragment, Key, useCallback, useEffect, useMemo, useState } from 'react'; +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { + useTable, + useTableCell, + useTableColumnHeader, + useTableRow, + useTableHeaderRow, + useTableRowGroup, + useTableSelectAllCheckbox, + useTableSelectionCheckbox, + mergeProps, + useFocusRing, + useCollator, +} from 'react-aria'; + +import { type ColumnSize, type TableCollection } from '@react-types/table'; +import { type GridNode } from '@react-types/grid'; + +import type { Node, SortDescriptor, SortDirection, CollectionChildren } from '@react-types/shared'; + +import { + Cell, + // CollectionBuilderContext, + Column, + Row, + TableBody, + TableHeader, + type TableState, + useTableState, +} from '@react-stately/table'; + +import { useAsyncList } from 'react-stately'; + +import { useBreakpoints } from '@/hooks'; +import { MediaQueryKeys } from '@/hooks/useBreakpoints'; + +import { Checkbox } from '@/components/Checkbox'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from './Icon'; +import { Tag } from './Tag'; + +export { TableCell } from './Table/TableCell'; +export { TableColumnHeader } from './Table/TableColumnHeader'; +export { MarketTableCell } from './Table/MarketTableCell'; + +export type CustomRowConfig = { + key: string; + slotCustomRow: (..._: Parameters) => React.ReactNode; +}; + +export type TableItem = { + value: TableRowData; + + slotBefore?: () => React.ReactNode; + label: string; + tag?: React.ReactNode; + slotAfter?: () => React.ReactNode; + + onSelect?: (key: TableRowData) => void; +}; + +export type ColumnDef = { + columnKey: string; + label: React.ReactNode; + tag?: React.ReactNode; + colspan?: number; + childColumns?: ColumnDef[]; + getCellValue: (row: TableRowData) => string | number; + allowsSorting?: boolean; // Default true + allowsResizing?: boolean; + renderCell: (row: TableRowData) => React.ReactNode; + isActionable?: boolean; + hideOnBreakpoint?: MediaQueryKeys; + width?: ColumnSize; +}; + +type ElementProps = { + label?: string; + columns: ColumnDef[]; + data: TableRowData[]; + getRowKey: (rowData: TableRowData, rowIndex?: number) => TableRowKey; + getRowAttributes?: (rowData: TableRowData, rowIndex?: number) => Record; + // shouldRowRender?: (prevRowData: object, currentRowData: object) => boolean; + defaultSortDescriptor?: SortDescriptor; + selectionMode?: 'multiple' | 'single'; + selectionBehavior?: 'replace' | 'toggle'; + onRowAction?: (key: TableRowKey, row: TableRowData) => void; + slotEmpty?: React.ReactNode; + // collection: TableCollection; + // children: React.ReactNode; +}; + +type StyleProps = { + hideHeader?: boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withOuterBorder?: boolean; + withInnerBorders?: boolean; + withScrollSnapColumns?: boolean; + withScrollSnapRows?: boolean; + className?: string; + style?: React.CSSProperties; +}; + +export type TableConfig = TableItem[]; + +export const Table = ({ + label = '', + columns, + data = [], + getRowKey, + getRowAttributes, + onRowAction, + defaultSortDescriptor, + selectionMode = 'single', + selectionBehavior = 'toggle', + slotEmpty, + // shouldRowRender, + + // collection, + // children, + hideHeader = false, + withGradientCardRows = false, + withFocusStickyRows = false, + withOuterBorder = false, + withInnerBorders = false, + withScrollSnapColumns = false, + withScrollSnapRows = false, + className, + style, +}: ElementProps & StyleProps) => { + const [selectedKeys, setSelectedKeys] = useState(new Set()); + + const currentBreakpoints = useBreakpoints(); + const shownColumns = columns.filter( + ({ hideOnBreakpoint }) => !hideOnBreakpoint || !currentBreakpoints[hideOnBreakpoint as string] + ); + + const collator = useCollator(); + + const sortFn = ( + a: TableRowData, + b: TableRowData, + sortColumn?: Key, + sortDirection?: SortDirection + ) => { + if (!sortColumn) return 0; + + const column = columns.find((column) => column.columnKey === sortColumn); + const first = column?.getCellValue(a); + const second = column?.getCellValue(b); + + return ( + // Compare the items by the sorted column + (isNaN(first as number) + ? // String + collator.compare(first as string, second as string) + : // Number + Math.sign( + (parseInt(first as string) || (first as number)) - + (parseInt(second as string) || (second as number)) + )) * + // Flip the direction if descending order is specified. + (sortDirection === 'descending' ? -1 : 1) + ); + }; + + const list = useAsyncList({ + getKey: getRowKey, + load: async ({ sortDescriptor }) => ({ + items: sortDescriptor?.column + ? data.sort((a, b) => sortFn(a, b, sortDescriptor?.column, sortDescriptor?.direction)) + : data, + }), + + initialSortDescriptor: defaultSortDescriptor, + + sort: async ({ items, sortDescriptor }) => ({ + items: items.sort((a, b) => sortFn(a, b, sortDescriptor?.column, sortDescriptor?.direction)), + }), + }); + + useEffect(() => list.reload(), [data]); + + const isEmpty = data.length === 0; + + return ( + + {!isEmpty ? ( + onRowAction(key, data.find((row) => getRowKey(row) === key)!)) + } + // shouldRowRender={shouldRowRender} + hideHeader={hideHeader} + withGradientCardRows={withGradientCardRows} + withFocusStickyRows={withFocusStickyRows} + withOuterBorder={withOuterBorder} + withInnerBorders={withInnerBorders} + withScrollSnapColumns={withScrollSnapColumns} + withScrollSnapRows={withScrollSnapRows} + > + + {(column) => ( + + {column.label} + {column.tag && {column.tag}} + + )} + + + + {(item) => ( + + {(columnKey) => ( + + {columns.find((column) => column.columnKey === columnKey)?.renderCell?.(item)} + + )} + + )} + + + ) : ( + {slotEmpty} + )} + + ); +}; + +const TableRoot = (props: { + 'aria-label'?: string; + sortDescriptor?: SortDescriptor; + onSortChange?: (descriptor: SortDescriptor) => void; + selectionMode: 'multiple' | 'single'; + selectionBehavior: 'replace' | 'toggle'; + selectedKeys: Set; + setSelectedKeys: (selectedKeys: Set) => void; + getRowAttributes?: ( + rowData: TableRowData, + rowIndex?: number + ) => Record>; + onRowAction?: (key: TableRowKey) => void; + // shouldRowRender?: (prevRowData: object, currentRowData: object) => boolean; + children: CollectionChildren; + + hideHeader?: boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withOuterBorder?: boolean; + withInnerBorders?: boolean; + withScrollSnapColumns?: boolean; + withScrollSnapRows?: boolean; +}) => { + const { selectionMode, selectionBehavior } = props; + + const state = useTableState({ + ...props, + showSelectionCheckboxes: selectionMode === 'multiple' && selectionBehavior !== 'replace', + }); + + const ref = React.useRef(null); + const { collection } = state; + const { gridProps } = useTable( + { + 'aria-label': props['aria-label'], + onRowAction: props.onRowAction as (key: Key) => void, + }, + state, + ref + ); + + return ( + + + + + {/* {Array.from(collection.getChildren!(collection.body.key), (row) => */} + {[...collection.body.childNodes].map((row) => + (row.value as CustomRowConfig)?.slotCustomRow ? ( + (row.value as CustomRowConfig).slotCustomRow({ + item: row, + state, + ...props.getRowAttributes?.(row.value!), + withGradientCardRows: props.withGradientCardRows, + withFocusStickyRows: props.withFocusStickyRows, + withScrollSnapRows: props.withScrollSnapRows, + children: null, + }) + ) : ( + + {/* {Array.from(collection.getChildren!(row.key), (cell) => */} + {[...row.childNodes].map( + (cell) => ( + // cell.props.isSelectionCell ? ( + // + // ) : ( + ).column?.value as ColumnDef) + ?.isActionable + } + /> + ) + // ) + )} + + ) + )} + + + ); +}; + +const TableHeadRowGroup = ({ + children, + hidden, + withGradientCardRows, + withInnerBorders, +}: { children: React.ReactNode } & { + hidden?: boolean; + withGradientCardRows?: boolean; + withInnerBorders?: boolean; +}) => { + const { rowGroupProps } = useTableRowGroup(); + + return ( + + ); +}; + +const TableBodyRowGroup = ({ + children, + withGradientCardRows, + withInnerBorders, +}: { children: React.ReactNode } & StyleProps) => { + const { rowGroupProps } = useTableRowGroup(); + + return ( + + {children} + + ); +}; + +const TableHeaderRow = ({ + item, + state, + children, + withScrollSnapRows, +}: { + item: TableCollection['headerRows'][number]; + state: TableState; + children: React.ReactNode; + withScrollSnapRows?: boolean; +}) => { + const ref = React.useRef(null); + const { rowProps } = useTableHeaderRow({ node: item }, state, ref); + + return ( + + {children} + + ); +}; + +const TableColumnHeader = ({ + column, + state, + withScrollSnapColumns, +}: { + column: Node; + state: TableState; + withScrollSnapColumns?: boolean; +}) => { + const ref = React.useRef(null); + const { columnHeaderProps } = useTableColumnHeader({ node: column }, state, ref); + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + + + {column.rendered} + {column.props.allowsSorting && ( + + )} + + + ); +}; + +export const TableRow = ({ + item, + children, + state, + // shouldRowRender, + withGradientCardRows, + withFocusStickyRows, + withScrollSnapRows, + ...attrs +}: { + item: TableCollection['rows'][number]; + children: React.ReactNode; + state: TableState; + // shouldRowRender?: (prevRowData: TableRowData, currentRowData: TableRowData) => boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withScrollSnapRows?: boolean; +}) => { + const ref = React.useRef(null); + const selectionManager = state.selectionManager; + const isSelected = selectionManager.isSelected(item.key); + const isClickable = selectionManager.selectionBehavior === 'toggle'; + + const { rowProps, isPressed } = useTableRow( + { + node: item, + }, + state, + ref + ); + + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + + {children} + + ); +}; + +// const TableRowMemo = React.memo( +// TableRow, +// (a, b) => !!b.shouldRowRender?.(a.item.value, b.item.value) +// ); + +const TableCell = ({ + cell, + state, + isActionable, +}: { + cell: Node; + state: TableState; + isActionable?: boolean; +}) => { + const ref = React.useRef(null); + const { gridCellProps } = useTableCell({ node: cell }, state, ref); + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + e.stopPropagation(), + onPointerDown: (e: MouseEvent) => e.stopPropagation(), + ...gridCellProps, + } + : gridCellProps, + focusProps + )} + // data-focused={isFocusVisible || undefined} + ref={ref} + > + {/* */} + {cell.rendered} + {/* */} + + ); +}; + +// const TableSelectAllCell = ({ column, state }) => { +// const ref = React.useRef(null); +// const isSingleSelectionMode = state.selectionManager.selectionMode === 'single'; +// const { columnHeaderProps } = useTableColumnHeader({ node: column }, state, ref); +// const { checkboxProps } = useTableSelectAllCheckbox(state); + +// return ( +// +// {state.selectionManager.selectionMode === 'single' ? ( +// {inputProps['aria-label']} +// ) : ( +// +// )} +// +// ); +// }; + +// const TableCheckboxCell = ({ cell, state }: { cell; state }) => { +// const ref = React.useRef(null); +// const { gridCellProps } = useTableCell({ node: cell }, state, ref); +// const { checkboxProps } = useTableSelectionCheckbox({ key: cell.parentKey }, state); + +// return ( +// +// +// +// ); +// }; + +const Styled: Record = {}; + +Styled.TableWrapper = styled.div<{ + isEmpty: boolean; + withGradientCardRows?: boolean; + withOuterBorder: boolean; +}>` + // Params + --tableHeader-textColor: var(--color-text-0, inherit); + --tableHeader-backgroundColor: inherit; + --table-header-height: 2rem; + + --tableRow-hover-backgroundColor: var(--color-layer-3); + --tableRow-backgroundColor: ; + + --table-cell-align: start; // start | center | end + --table-firstColumn-cell-align: start; // start | center | end | var(--table-cell-align) + --table-lastColumn-cell-align: end; // start | center | end | var(--table-cell-align) + --tableCell-padding: 0 1rem; + + // Rules + + flex: 1; + + ${layoutMixins.contentSectionAttached} + scroll-snap-align: none; + + ${layoutMixins.stack} + + overflow: clip; + + ${({ isEmpty, withGradientCardRows, withOuterBorder }) => + withOuterBorder && + (!withGradientCardRows || isEmpty) && + css` + ${layoutMixins.withOuterBorderClipped} + `} +`; + +Styled.Empty = styled.div<{ withOuterBorder: boolean }>` + ${layoutMixins.column} + height: 100%; + + justify-items: center; + align-content: center; + padding: 2rem; + gap: 0.75em; + + color: var(--color-text-0); + font: var(--font-base-book); +`; + +Styled.Table = styled.table<{ + hideHeader?: boolean; + withGradientCardRows: boolean; + withOuterBorder: boolean; + withInnerBorders: boolean; + withSolidHeader: boolean; +}>` + align-self: start; + + ${layoutMixins.stickyArea1} + --stickyArea1-background: var(--color-layer-2); + --stickyArea1-topHeight: var(--table-header-height); + ${({ hideHeader }) => + hideHeader && + css` + --stickyArea1-topHeight: 0px; + `} + + border-collapse: separate; + border-spacing: 0; + + /* [data-selected] {} */ + + ${({ withInnerBorders, hideHeader }) => + withInnerBorders && + css` + border-spacing: 0 var(--border-width); + --stickyArea1-topGap: var(--border-width); + + ${hideHeader && + css` + --stickyArea1-topGap: 0px; + `} + + // Compensate for outer border (hidden and omitted from scroll with overflow: clip; on ) + margin: calc(-1 * var(--border-width)) 0; + `} + + ${({ withGradientCardRows }) => + withGradientCardRows && + css` + border-spacing: 0 0.75rem; + + // Use negative margin and 0 padding on 'th' element, so that border-spacing + // doesn't affect the header row's height + margin: -0.75rem clamp(0rem, 1rem - var(--contentContainerPage-paddingLeft, 0rem), 1rem) 0; + + th { + padding: 0; + } + `} + + @media ${breakpoints.tablet} { + min-height: 6.25rem; + } +`; + +Styled.Tr = styled.tr<{ + isClickable?: boolean; + withFocusStickyRows?: boolean; + withScrollSnapRows: boolean; +}>` + /* Computed */ + --tableRow-currentBackgroundColor: var(--tableRow-backgroundColor); + + /* Rules */ + background-color: var(--tableRow-currentBackgroundColor); + + ${({ isClickable }) => + isClickable && + css` + cursor: pointer; + + &:hover, + &:focus-visible, + &:focus-within { + --tableRow-currentBackgroundColor: var(--tableRow-hover-backgroundColor); + filter: brightness(1.1); + } + `}; + + ${({ withFocusStickyRows }) => + withFocusStickyRows && + css` + &:focus-visible, + &:focus-within { + ${layoutMixins.sticky} + z-index: 1; + } + `} + + ${({ withScrollSnapRows }) => + withScrollSnapRows && + css` + ${layoutMixins.scrollSnapItem} + `} +`; + +Styled.Th = styled.th<{ withScrollSnapColumns: boolean }>` + // Computed + --table-cell-currentAlign: var(--table-cell-align); + + &:first-of-type { + --table-cell-currentAlign: var(--table-firstColumn-cell-align, var(--table-cell-align)); + } + &:last-of-type { + --table-cell-currentAlign: var(--table-lastColumn-cell-align, var(--table-cell-align)); + } + + // Rules + ${({ withScrollSnapColumns }) => + withScrollSnapColumns && + css` + ${layoutMixins.scrollSnapItem} + `} + + white-space: nowrap; + text-align: var(--table-cell-currentAlign); +`; + +Styled.Td = styled.td` + // Computed + --table-cell-currentAlign: var(--table-cell-align); + + &:first-of-type { + --table-cell-currentAlign: var(--table-firstColumn-cell-align, var(--table-cell-align)); + } + &:last-of-type { + --table-cell-currentAlign: var(--table-lastColumn-cell-align, var(--table-cell-align)); + } + + // Rules + padding: var(--tableCell-padding); + + text-align: var(--table-cell-currentAlign); + + > * { + vertical-align: middle; + } +`; + +Styled.SortArrow = styled.span<{ sortDirection: 'ascending' | 'descending' }>` + float: right; + margin-left: auto; + + display: inline-flex; + transition: transform 0.3s var(--ease-out-expo), font-size 0.3s var(--ease-out-expo); + + font-size: 0.375em; + + ${Styled.Th}[aria-sort="none"] & { + visibility: hidden; + } + + ${Styled.Th}[aria-sort="ascending"] & { + transform: scaleY(-1); + } +`; + +Styled.Thead = styled.thead` + ${layoutMixins.stickyHeader} + scroll-snap-align: none; + + > * { + height: var(--stickyArea-topHeight); + } + + color: var(--tableHeader-textColor); + background-color: var(--tableHeader-backgroundColor); + + @media ${breakpoints.notTablet} { + ${({ withInnerBorders, withGradientCardRows }) => + withInnerBorders && + !withGradientCardRows && + css` + ${layoutMixins.withInnerHorizontalBorders} + `} + } +`; + +Styled.Tbody = styled.tbody` + ${layoutMixins.stickyArea2} + + // If
height is fixed with not enough rows to overflow, vertically center the rows + &:before, + &:after { + content: ''; + display: table-row; + } + + ${({ withInnerBorders, withGradientCardRows }) => + withInnerBorders && + !withGradientCardRows && + css` + ${layoutMixins.withInnerHorizontalBorders} + + --stickyArea2-paddingTop: var(--border-width); + --stickyArea2-paddingBottom: var(--border-width); + --stickyArea2-paddingLeft: var(--border-width); + --stickyArea2-paddingRight: var(--border-width); + `} + + ${({ withGradientCardRows }) => + withGradientCardRows && + css` + --table-row-default-gradient: linear-gradient( + 342.62deg, + var(--color-gradient-base-0) -9.23%, + var(--color-gradient-base-1) 110.36% + ); + + --table-row-gradient-to-color: transparent; + --tableCell-borderRadius: ; + + &:before, + &:after { + content: none; + } + + tr { + background: linear-gradient( + 270deg, + var(--table-row-gradient-to-color) -32.39%, + transparent 100% + ), + var(--table-row-default-gradient); + + @supports (background: -webkit-named-image(i)) { + background: var(--table-row-gradient-to-color); + } + + td:first-child { + --tableCell-borderRadius: 1rem 0 0 1rem; + } + + td:last-child { + --tableCell-borderRadius: 0 1rem 1rem 0; + } + + td { + height: 4.25rem; + border-radius: var(--tableCell-borderRadius); + } + } + `} +`; + +Styled.Row = styled.div` + ${layoutMixins.inlineRow} + padding: var(--tableCell-padding); +`; diff --git a/src/components/Table/MarketTableCell.tsx b/src/components/Table/MarketTableCell.tsx new file mode 100644 index 0000000..e024670 --- /dev/null +++ b/src/components/Table/MarketTableCell.tsx @@ -0,0 +1,50 @@ +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import type { Asset } from '@/constants/abacus'; +import { breakpoints } from '@/styles'; + +import { AssetIcon } from '@/components/AssetIcon'; +import { Icon, IconName } from '@/components/Icon'; +import { TableCell } from '@/components/Table'; + +export const MarketTableCell = ({ + asset, + marketId, + showFavorite, + className, +}: { + asset?: Asset; + marketId: string; + showFavorite?: boolean; + className?: string; +}) => ( + + {showFavorite && } + + + } + > + {asset?.name} + {marketId} + +); + +const Styled: Record = {}; + +Styled.AssetIcon = styled(AssetIcon)` + font-size: 1.25rem; + + @media ${breakpoints.tablet} { + font-size: 2.25rem; + } +`; + +Styled.Asset = styled.span` + @media ${breakpoints.tablet} { + color: var(--color-text-2); + } +`; diff --git a/src/components/Table/TableCell.tsx b/src/components/Table/TableCell.tsx new file mode 100644 index 0000000..7aa8596 --- /dev/null +++ b/src/components/Table/TableCell.tsx @@ -0,0 +1,34 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { tableMixins } from '@/styles/tableMixins'; + +export const TableCell = ({ + className, + children, + slotLeft, + slotRight, + stacked, +}: { + className?: string; + children?: React.ReactNode; + slotLeft?: React.ReactNode; + slotRight?: React.ReactNode; + stacked?: boolean; +}) => ( + + {slotLeft} + {stacked ? {children} : children} + {slotRight} + +); + +const Styled: Record = {}; + +Styled.CellContent = styled.div` + ${tableMixins.cellContent} +`; + +Styled.Column = styled.div` + ${tableMixins.cellContentColumn} +`; diff --git a/src/components/Table/TableColumnHeader.tsx b/src/components/Table/TableColumnHeader.tsx new file mode 100644 index 0000000..152cfa1 --- /dev/null +++ b/src/components/Table/TableColumnHeader.tsx @@ -0,0 +1,17 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { tableMixins } from '@/styles/tableMixins'; + +export const TableColumnHeader = ({ + className, + children, +}: { + className?: string; + children?: React.ReactNode; +}) => {children}; + +const Styled: Record = {}; + +Styled.HeaderCellContent = styled.div` + ${tableMixins.headerCellContent} +`; diff --git a/src/components/Tabs.stories.tsx b/src/components/Tabs.stories.tsx new file mode 100644 index 0000000..6adb027 --- /dev/null +++ b/src/components/Tabs.stories.tsx @@ -0,0 +1,68 @@ +import type { Story } from '@ladle/react'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Tabs } from '@/components/Tabs'; + +import { StoryWrapper } from '.ladle/components'; + +enum TabItem { + Item1 = 'Item1', + Item2 = 'Item2', + Item3 = 'Item3', +} + +const TabItems = [ + { + value: TabItem.Item1, + label: 'Item 1', + content:
Item 1 Content
, + }, + { + value: TabItem.Item2, + label: 'Item 2', + content:
Item 2 Content
, + }, + { + value: TabItem.Item3, + label: 'Item 3', + content:
Item 3 Content
, + }, +]; + +export const TabsStory: Story> = (args) => { + return ( + + + + + + ); +}; + +TabsStory.args = { + fullWidthTabs: false, +}; + +TabsStory.argTypes = { + defaultValue: { + options: Object.values(TabItem), + control: { type: 'select' }, + defaultValue: TabItem.Item1, + }, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + width: 400px; + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/Tabs.tsx b/src/components/Tabs.tsx new file mode 100644 index 0000000..bb6360e --- /dev/null +++ b/src/components/Tabs.tsx @@ -0,0 +1,329 @@ +import { type ReactNode } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { Content, List, Root, Trigger } from '@radix-ui/react-tabs'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { type MenuItem } from '@/constants/menus'; + +import { DropdownSelectMenu } from '@/components/DropdownSelectMenu'; +import { Tag } from '@/components/Tag'; +import { Toolbar } from '@/components/Toolbar'; + +export type TabItem = { + value: TabItemsValue; + label: React.ReactNode; + forceMount?: boolean; + tag?: React.ReactNode; + slotRight?: React.ReactNode; + slotToolbar?: React.ReactNode; + content?: React.ReactNode; + subitems?: TabItem[]; + customTrigger?: ReactNode; +}; + +type ElementProps = { + defaultValue?: TabItemsValue; + value?: TabItemsValue; + items: TabItem[]; + slotToolbar?: ReactNode; + sharedContent?: ReactNode; + onValueChange?: (value: TabItemsValue) => void; + onWheel?: (event: WheelEvent) => void; +}; + +type StyleProps = { + fullWidthTabs?: boolean; + side?: 'top' | 'bottom'; + withBorders?: boolean; + withTransitions?: boolean; + className?: string; +}; + +export const Tabs = ({ + defaultValue, + value, + items, + slotToolbar, + sharedContent, + onValueChange, + onWheel, + fullWidthTabs, + side = 'top', + withBorders = true, + withTransitions = true, + className, +}: ElementProps & StyleProps) => { + const currentItem = items.find((item) => item.value === value); + + const triggers = ( + <> + + {items.map((item) => + !item.subitems ? ( + item.customTrigger ?? ( + + {item.label} + {item.tag && {item.tag}} + {item.slotRight} + + ) + ) : ( + []} + value={value} + onValueChange={onValueChange} + align="end" + $isActive={item.subitems.some((subitem) => subitem.value === value)} + slotTrigger={} + > + {item.label} + + ) + )} + + + {(currentItem?.slotToolbar || slotToolbar) && ( + {currentItem?.slotToolbar || slotToolbar} + )} + + ); + + return ( + + {triggers} + + {sharedContent ? ( + sharedContent + ) : ( + + {items.map(({ value, content, forceMount }) => ( + + {content} + + ))} + + )} + + ); +}; + +const Styled: Record = {}; + +const tabTriggerStyle = css` + ${layoutMixins.row} + justify-content: center; + gap: 0.5ch; + + align-self: stretch; + padding: 0 1.5rem; + + font: var(--trigger-font, var(--font-base-book)); + color: var(--trigger-textColor); + background-color: var(--trigger-backgroundColor); + + &[data-state='active'] { + color: var(--trigger-active-textColor); + background-color: var(--trigger-active-backgroundColor); + } +`; + +Styled.Root = styled(Root)<{ $side: 'top' | 'bottom'; $withInnerBorder?: boolean }>` + /* Overrides */ + --trigger-backgroundColor: var(--color-layer-2); + --trigger-textColor: var(--color-text-0); + + --trigger-active-backgroundColor: var(--color-layer-1); + --trigger-active-textColor: var(--color-text-2); + + /* Variants */ + --tabs-currentHeight: var(--tabs-height); + + @media ${breakpoints.tablet} { + --tabs-currentHeight: var(--tabs-height-mobile); + } + + /* Rules */ + ${layoutMixins.scrollArea} + overscroll-behavior: contain; + + ${layoutMixins.stickyArea0} + --stickyArea0-background: var(--color-layer-2); + --stickyArea0-topGap: var(--border-width); + + ${layoutMixins.contentContainer} + + ${({ $side }) => + ({ + top: css` + --stickyArea0-topHeight: var(--tabs-currentHeight); + ${layoutMixins.expandingColumnWithHeader} + `, + bottom: css` + --stickyArea0-bottomHeight: var(--tabs-currentHeight); + ${layoutMixins.expandingColumnWithFooter} + `, + }[$side])} + + ${({ $withInnerBorder }) => + $withInnerBorder && + css` + ${layoutMixins.withInnerHorizontalBorders} + `} + + @media ${breakpoints.tablet} { + overscroll-behavior: contain auto; + } +`; + +Styled.Header = styled.header<{ $side: 'top' | 'bottom' }>` + ${layoutMixins.contentSectionDetachedScrollable} + + ${({ $side }) => + ({ + top: css` + ${layoutMixins.stickyHeader} + `, + bottom: css` + ${layoutMixins.stickyFooter} + grid-row: 2; + `, + }[$side])} + + ${layoutMixins.row} + justify-content: space-between; +`; + +Styled.List = styled(List)<{ $fullWidthTabs?: boolean; $withBorders?: boolean }>` + align-self: stretch; + + ${({ $withBorders }) => + $withBorders && + css` + ${layoutMixins.withOuterAndInnerBorders} + `} + + ${({ $fullWidthTabs }) => + $fullWidthTabs + ? css` + flex: 1; + ${layoutMixins.gridEqualColumns} + ` + : css` + ${layoutMixins.row} + `} +`; + +Styled.Trigger = styled(Trigger)<{ $withBorders?: boolean }>` + ${({ $withBorders }) => + $withBorders && + css` + ${layoutMixins.withOuterBorder} + `} + + ${tabTriggerStyle} +`; + +Styled.Stack = styled.div` + ${layoutMixins.stack} + ${layoutMixins.perspectiveArea} + + box-shadow: none; +`; + +Styled.Content = styled(Content)<{ $hide?: boolean; $withTransitions: boolean }>` + ${layoutMixins.flexColumn} + outline: none; + box-shadow: none; + + &[data-state='inactive'] { + pointer-events: none; + } + + ${({ $hide }) => + $hide && + css` + display: none; + `} + + @media (prefers-reduced-motion: no-preference) { + ${({ $withTransitions }) => + $withTransitions && + css` + &[data-state='active'] { + animation: ${keyframes` + from { + translate: 0 -0.25rem -1.5rem; + opacity: 0; + /* filter: blur(3px); */ + } + `} 0.2s var(--ease-out-expo); + } + + &[data-state='inactive'] { + min-height: 0; + + animation: ${keyframes` + to { + translate: 0 -0.25rem -1.5rem; + opacity: 0; + /* filter: blur(3px); */ + } + `} 0.2s var(--ease-out-expo); + } + `} + } +`; + +Styled.DropdownTabTrigger = styled(Trigger)` + ${tabTriggerStyle} + gap: 1ch; + + height: 100%; + width: 100%; +`; + +Styled.DropdownSelectMenu = styled(DropdownSelectMenu)<{ $isActive?: boolean }>` + --trigger-radius: 0; + + ${({ $isActive }) => + $isActive && + css` + --trigger-textColor: var(--trigger-active-textColor); + --trigger-backgroundColor: var(--trigger-active-backgroundColor); + `} +`; + +export const MobileTabs = styled(Tabs)` + --trigger-backgroundColor: transparent; + --trigger-active-backgroundColor: transparent; + --tableHeader-backgroundColor: var(--color-layer-2); + --trigger-font: var(--font-extra-book); + + padding-bottom: 1rem; + gap: var(--border-width); + + > header { + padding: 0 1rem; + + button { + padding: 0 0.5rem; + } + } +`; diff --git a/src/components/Tag.stories.tsx b/src/components/Tag.stories.tsx new file mode 100644 index 0000000..b83d740 --- /dev/null +++ b/src/components/Tag.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { Tag } from '@/components/Tag'; + +import { StoryWrapper } from '.ladle/components'; + +export const TagStory: Story> = (args) => { + return ( + + + + ); +}; + +TagStory.args = { + children: 'USDC', +}; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx new file mode 100644 index 0000000..28ad37f --- /dev/null +++ b/src/components/Tag.tsx @@ -0,0 +1,80 @@ +import styled, { css } from 'styled-components'; + +export enum TagSize { + Small, + Medium, +} + +export enum TagType { + Asset, + Side, + Number, +} + +export enum TagSign { + Positive, + Negative, + Neutral, +} + +type StyleProps = { + size?: TagSize; + type?: TagType; + sign?: TagSign; + isHighlighted?: boolean; +}; + +export const Tag = styled.span` + font-family: var(--fontFamily-base); + font-weight: var(--fontWeight-book); + display: inline-flex; + + background-color: var(--color-layer-6); + border-radius: 0.25rem; + + color: var(--color-text-2); + letter-spacing: 0.04em; + line-height: 1.3; + + user-select: none; + + ${({ type, size }) => + ({ + [TagSize.Small]: css` + padding: ${type === TagType.Number + ? '0.125rem 0.344rem' + : '0.125rem 0.219rem 0.125rem 0.25rem'}; + + font: var(--font-tiny-book); + `, + [TagSize.Medium]: css` + padding: ${type === TagType.Number + ? '0.156rem 0.438rem' + : '0.156rem 0.219rem 0.156rem 0.25rem'}; + + font: var(--font-mini-book); + `, + }[size || TagSize.Small])} + + ${({ sign }) => + sign !== undefined && + { + [TagSign.Positive]: css` + color: var(--color-positive); + background-color: var(--color-gradient-positive); + `, + [TagSign.Negative]: css` + color: var(--color-negative); + background-color: var(--color-gradient-negative); + `, + [TagSign.Neutral]: css` + background-color: var(--color-layer-3); + `, + }[sign]} + + ${({ isHighlighted }) => + isHighlighted && + css` + background-color: var(--color-accent); + `} +`; diff --git a/src/components/TimeoutButton.tsx b/src/components/TimeoutButton.tsx new file mode 100644 index 0000000..df0a7f7 --- /dev/null +++ b/src/components/TimeoutButton.tsx @@ -0,0 +1,50 @@ +import { type ReactNode, useState } from 'react'; + +import { ButtonAction, ButtonState } from '@/constants/buttons'; +import { STRING_KEYS } from '@/constants/localization'; +import { useNow, useStringGetter } from '@/hooks'; + +import { Button, type ButtonStateConfig, type ButtonProps } from '@/components/Button'; + +type ElementProps = { + timeoutInSeconds: number; +} & ButtonProps; + +export type TimeoutButtonProps = ElementProps; + +export const TimeoutButton = ({ + children, + timeoutInSeconds, + ...otherProps +}: TimeoutButtonProps) => { + const [timeoutDeadline] = useState(Date.now() + timeoutInSeconds * 1000); + const now = useNow(); + const stringGetter = useStringGetter(); + + const secondsLeft = Math.max(0, (timeoutDeadline - now) / 1000); + + return ( + + ); +}; diff --git a/src/components/TimoutButton.stories.tsx b/src/components/TimoutButton.stories.tsx new file mode 100644 index 0000000..a8dbbc8 --- /dev/null +++ b/src/components/TimoutButton.stories.tsx @@ -0,0 +1,21 @@ +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; +import { TimeoutButton, type TimeoutButtonProps } from './TimeoutButton'; + +export const TimeoutButtonStory: Story = (args) => { + return ( + + alert('Timeout button clicked!')} + > + Continue + + + ); +}; + +TimeoutButtonStory.args = { + timeoutInSeconds: 5, +}; diff --git a/src/components/Toast.tsx b/src/components/Toast.tsx new file mode 100644 index 0000000..9c85fbf --- /dev/null +++ b/src/components/Toast.tsx @@ -0,0 +1,268 @@ +import React, { useEffect, useRef, useState } from 'react'; + +import { Root, Title, Description, Action, Close } from '@radix-ui/react-toast'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { IconButton } from './IconButton'; +import { CloseIcon } from '@/icons'; + +import styled, { keyframes } from 'styled-components'; +import { popoverMixins } from '@/styles/popoverMixins'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + isOpen?: boolean; + setIsOpen?: (isOpen: boolean, isClosedFromTimeout?: boolean) => void; + slotIcon?: React.ReactNode; + slotTitle?: React.ReactNode; + slotDescription?: React.ReactNode; + slotCustomContent?: React.ReactNode; + slotAction?: React.ReactNode; + actionDescription?: string; + actionAltText?: string; + sensitivity?: 'foreground' | 'background'; + duration?: number; + lastUpdated?: number; +}; + +type StyleProps = {}; + +export const Toast = ({ + isOpen = true, + setIsOpen, + slotIcon, + slotTitle, + slotDescription, + slotCustomContent, + slotAction, + actionDescription = '', + actionAltText = actionDescription, + sensitivity = 'background', + duration = Infinity, + lastUpdated, +}: ElementProps & StyleProps) => { + // Timeout + const timeout = useRef(); + const [isPaused, setIsPaused] = useState(false); + + useEffect(() => { + // Restart toast timer when `lastUpdated` timestamp changes or toast is paused + resumed + if (timeout.current) clearTimeout(timeout.current); + + if (isOpen && !isPaused && duration !== Infinity) + timeout.current = globalThis.setTimeout(() => { + setIsOpen?.(false, true); + }, duration) as unknown as number; + }, [isOpen, isPaused, duration, lastUpdated]); + + return ( + <$Root + type={sensitivity} + duration={Infinity} + open={isOpen} + onOpenChange={setIsOpen} + onPause={() => setIsPaused(true)} + onResume={() => setIsPaused(false)} + > +
+ <$Container> + <$Header> + {slotIcon && <$Icon>{slotIcon}} + + + <$CloseButton + iconComponent={CloseIcon} + shape={ButtonShape.Square} + size={ButtonSize.XSmall} + /> + + + <$Title>{slotTitle} + + {!slotCustomContent && <$Description>{slotDescription}} + {slotCustomContent} + {actionDescription && ( + <$Action asChild altText={actionAltText}> + {slotAction} + + )} + +
+ + ); +}; + +const $Root = styled(Root)` + // Params + --toast-transition-duration: 0.5s; + + // Computed + --x: var(--radix-toast-swipe-move-x, 0px); + --y: var(--radix-toast-swipe-move-y, 0px); + + // Rules + transition: var(--toast-transition-duration) var(--ease-out-expo); + + margin-left: calc(var(--border-width) + 0.6rem); // border + shadow + margin-right: var(--border-width); // border + + display: grid; // height transition + grid-template-rows: 1fr; // height transition + /* grid-template-rows: 1fr var(--toasts-gap); // height transition */ + + translate: var(--x) var(--y); + will-change: translate, margin-top; + + margin-bottom: var(--toasts-gap); + + &[data-swipe-direction='right'] { + &[data-state='open'] { + align-items: end; + transform-origin: left bottom; + + animation: ${keyframes` + from { + /* scale: 0; */ + grid-template-rows: 0fr; // height transition + /* grid-template-rows: 0fr 0fr; // height transition */ + + margin-top: calc(-1 * var(--toasts-gap)); + } + `} var(--toast-transition-duration) var(--ease-out-expo), + ${keyframes` + from { + opacity: 0; + /* filter: blur(1px); */ + } + `} var(--toast-transition-duration) var(--ease-out-expo), + ${keyframes` + 33% { + /* scale: 1.05; */ + /* filter: brightness(120%); */ + filter: drop-shadow(0 0 var(--color-text-1)); + } + `} calc(var(--toast-transition-duration) * 3) 0.1s; + } + + &[data-state='closed'] { + align-items: start; + + animation: ${keyframes``} var(--toast-transition-duration) var(--ease-out-expo); // delay Radix's DOM removal for [data-state='closed'] transition + } + } + + &:focus-visible { + outline: none; + } + + &:active[data-swipe-direction='right'] { + cursor: e-resize; + } + &:active[data-swipe-direction='up'] { + cursor: n-resize; + } + + &[data-swipe='move'] { + transition-property: opacity; + opacity: 0.98; + + cursor: grabbing; + * { + cursor: inherit; + } + } + + &[data-state='closed'], + &[data-swipe='end'] { + z-index: -1; + grid-template-rows: 0fr; // height transition + margin-top: 0; + margin-bottom: 0; + filter: blur(3px); + pointer-events: none; + + &[data-swipe-direction='right'] { + --x: calc(100% + 2rem); + } + } + + > div { + min-height: 0; // height transition + transition: scale var(--toast-transition-duration) var(--ease-out-expo); + } + + &:is(:active:not(:not(:focus):focus-within), [data-swipe='move']) > div { + scale: 0.95; + transition-duration: 5s; + } +`; + +const $Container = styled.div` + // Params + --toast-icon-size: 1.75em; + + // Rules + ${popoverMixins.popover} + padding: 1rem; + box-shadow: 0 0 0 var(--border-width) var(--color-border), + // border + 0 0 0.5rem 0.1rem var(--color-layer-2); // shadow + + ${$Root}:focus:not([data-swipe='end']) & { + outline: var(--color-accent) 1px solid; + } + + > * { + transition: opacity 0.2s; + } + ${$Root}[data-swipe='move'] & > * { + opacity: 0.5; + } +`; + +const $Header = styled.header` + display: block; +`; + +const $Icon = styled.div` + ${layoutMixins.row} + + float: left; + + width: 1em; + height: 1em; + + margin-right: 0.4em; + + line-height: 1; +`; + +const $CloseButton = styled(IconButton)` + --button-textColor: var(--color-text-0); + --button-border: none; + --button-icon-size: 0.85em; + + float: right; + margin: -0.42rem -0.42rem -0.42rem 0.42rem; +`; + +const $Title = styled(Title)` + flex: 1; + + font: var(--font-base-medium); + color: var(--color-text-2); + + overflow: hidden; + text-overflow: ellipsis; +`; + +const $Description = styled(Description)` + margin-top: 0.5rem; + color: var(--color-text-0); + font: var(--font-small-book); +`; + +const $Action = styled(Action)` + margin-top: 0.5rem; +`; diff --git a/src/components/ToastArea.tsx b/src/components/ToastArea.tsx new file mode 100644 index 0000000..eee1551 --- /dev/null +++ b/src/components/ToastArea.tsx @@ -0,0 +1,54 @@ +import { Provider, Viewport } from '@radix-ui/react-toast'; + +import styled from 'styled-components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + swipeDirection: 'up' | 'down' | 'left' | 'right'; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; +}; + +export const ToastArea = ({ swipeDirection, children, className }: ElementProps & StyleProps) => ( + <$ToastArea className={className}> + + {children} + + + +); + +const $ToastArea = styled.aside` + // Params + --toasts-gap: 0.5rem; + + // Rules + ${layoutMixins.scrollArea} + z-index: 1; + + pointer-events: none; + + > * { + display: contents; + pointer-events: none; + + > ol { + /* display: block; */ + + // Radix Toast's DOM order: earliest to latest (???) + // Radix Toast's focus order: latest to earliest (???) + // Desired display order: latest to earliest (¯\_(ツ)_/¯) + display: flex; + flex-direction: column-reverse; + + pointer-events: none; + + > * { + pointer-events: initial; + } + } + } +`; diff --git a/src/components/ToggleButton.stories.tsx b/src/components/ToggleButton.stories.tsx new file mode 100644 index 0000000..dd96fcc --- /dev/null +++ b/src/components/ToggleButton.stories.tsx @@ -0,0 +1,25 @@ +import type { Story } from '@ladle/react'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { StoryWrapper } from '.ladle/components'; +import { ToggleButton } from './ToggleButton'; + +export const ToggleButtonStory: Story> = (args) => ( + + Toggle me + +); + +ToggleButtonStory.argTypes = { + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.XSmall, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Pill, + }, +}; diff --git a/src/components/ToggleButton.tsx b/src/components/ToggleButton.tsx new file mode 100644 index 0000000..80e8a34 --- /dev/null +++ b/src/components/ToggleButton.tsx @@ -0,0 +1,66 @@ +import { forwardRef } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root } from '@radix-ui/react-toggle'; + +import { BaseButton, type BaseButtonProps } from '@/components/BaseButton'; + +type ElementProps = { + isPressed?: boolean; + onPressedChange?: (isPressed: boolean) => void; + disabled?: boolean; + slotLeft?: React.ReactNode; + slotRight?: React.ReactNode; + children?: React.ReactNode; +}; + +type StyleProps = { + className?: string; +}; + +export type ToggleButtonProps = BaseButtonProps & + ElementProps & + Omit; + +export const ToggleButton = forwardRef( + ( + { + isPressed, + onPressedChange, + disabled, + slotLeft = null, + slotRight = null, + children, + className, + ...buttonProps + }, + ref + ) => { + return ( + + + {slotLeft} + {children} + {slotRight} + + + ); + } +); + +const Styled: Record = {}; + +Styled.BaseButton = styled(BaseButton)` + --button-toggle-off-backgroundColor: var(--color-layer-3); + --button-toggle-off-textColor: var(--color-text-0); + --button-toggle-on-backgroundColor: var(--color-layer-1); + --button-toggle-on-textColor: var(--color-text-2); + + --button-backgroundColor: var(--button-toggle-off-backgroundColor); + --button-textColor: var(--button-toggle-off-textColor); + + &[data-state='on'], + &[data-state='active'] { + --button-backgroundColor: var(--button-toggle-on-backgroundColor); + --button-textColor: var(--button-toggle-on-textColor); + } +`; diff --git a/src/components/ToggleGroup.stories.tsx b/src/components/ToggleGroup.stories.tsx new file mode 100644 index 0000000..2e556cf --- /dev/null +++ b/src/components/ToggleGroup.stories.tsx @@ -0,0 +1,45 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { StoryWrapper } from '.ladle/components'; +import { ToggleGroup } from './ToggleGroup'; + +const ToggleGroupItems = [ + { + value: '0', + label: 'Item 1', + }, + { + value: '1', + label: 'Item 2', + }, + { + value: '2', + label: 'Item 3', + }, +]; + +export const ToggleGroupStory: Story> = (args) => { + const [value, setValue] = useState('0'); + + return ( + + + + ); +}; + +ToggleGroupStory.argTypes = { + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.XSmall, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Pill, + }, +}; diff --git a/src/components/ToggleGroup.tsx b/src/components/ToggleGroup.tsx new file mode 100644 index 0000000..d1541d0 --- /dev/null +++ b/src/components/ToggleGroup.tsx @@ -0,0 +1,69 @@ +import { forwardRef, type Ref } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root, Item } from '@radix-ui/react-toggle-group'; + +import { type MenuItem } from '@/constants/menus'; +import { ButtonShape, ButtonSize } from '@/constants/buttons'; +import { useBreakpoints } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { type BaseButtonProps } from '@/components/BaseButton'; +import { ToggleButton } from '@/components/ToggleButton'; + +type ElementProps = { + items: MenuItem[]; + value: MenuItemValue; + onValueChange: (value: MenuItemValue) => void; +}; + +type StyleProps = { + className?: string; +}; + +export const ToggleGroup = forwardRef( + ( + { + items, + value, + onValueChange, + className, + size, + shape = ButtonShape.Pill, + ...buttonProps + }: ElementProps & StyleProps & BaseButtonProps, + ref: Ref + ) => { + const { isTablet } = useBreakpoints(); + + return ( + + {items.map((item) => ( + + + {item.slotBefore} + {item.label} + + + ))} + + ); + } +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + ${layoutMixins.row} + gap: 0.33em; +`; diff --git a/src/components/Toolbar.tsx b/src/components/Toolbar.tsx new file mode 100644 index 0000000..1da0ec5 --- /dev/null +++ b/src/components/Toolbar.tsx @@ -0,0 +1,51 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Root, Button, Separator, Link, ToggleGroup, ToggleItem } from '@radix-ui/react-toolbar'; +import { WithSeparators } from './Separator'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + children: React.ReactNode; +}; + +type StyleProps = { + layout?: 'column' | 'row'; + className?: string; + withSeparators?: boolean; +}; + +export const Toolbar = ({ + children, + layout = 'row', + withSeparators = false, + className, +}: ElementProps & StyleProps) => ( + + + {children} + + {/* Each child as a */} + {/* {[children].flat().map((child, i) => ( + + ))} */} + + +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)<{ layout?: 'column' | 'row' }>` + ${({ layout }) => + layout && + { + column: layoutMixins.column, + row: layoutMixins.row, + }[layout]} + + padding: 0 1rem; +`; diff --git a/src/components/TriangleIndicator.stories.tsx b/src/components/TriangleIndicator.stories.tsx new file mode 100644 index 0000000..9e1f44f --- /dev/null +++ b/src/components/TriangleIndicator.stories.tsx @@ -0,0 +1,39 @@ +import { useEffect, useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { TriangleIndicator, TriangleIndicatorProps } from '@/components/TriangleIndicator'; + +import { StoryWrapper } from '.ladle/components'; +import { MustBigNumber } from '@/lib/numbers'; + +export const TriangleIndicatorStory: Story<{ value: number }> = (args) => { + const [valueBN] = useState(MustBigNumber(args.value)); + + return ( + + + + + + ); +}; + +TriangleIndicatorStory.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/TriangleIndicator.tsx b/src/components/TriangleIndicator.tsx new file mode 100644 index 0000000..d3fd122 --- /dev/null +++ b/src/components/TriangleIndicator.tsx @@ -0,0 +1,60 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; +import BigNumber from 'bignumber.js'; + +import { NumberSign } from '@/constants/numbers'; + +import { Icon, IconName } from './Icon'; + +type ElementProps = { + value: BigNumber; +}; + +type StyleProps = { + className?: string; +}; + +export type TriangleIndicatorProps = ElementProps & StyleProps; + +const getSign = (num: BigNumber) => + num.gt(0) ? NumberSign.Positive : num.lt(0) ? NumberSign.Negative : NumberSign.Neutral; + +export const TriangleIndicator = ({ className, value }: TriangleIndicatorProps) => { + return ( + + + + ); +}; + +const Styled: Record = {}; + +Styled.TriangleIndicator = styled.div<{ sign: NumberSign }>` + display: flex; + align-items: center; + height: 100%; + margin-top: 0.0625rem; + + svg { + width: 0.375em; + height: 0.375em; + } + + ${({ sign }) => + ({ + [NumberSign.Positive]: css` + color: var(--color-positive); + + svg { + transform: rotate(180deg); + } + `, + [NumberSign.Negative]: css` + color: var(--color-negative); + `, + [NumberSign.Neutral]: css` + svg { + transform: rotate(180deg); + } + `, + }[sign])} +`; diff --git a/src/components/UsageBars.stories.tsx b/src/components/UsageBars.stories.tsx new file mode 100644 index 0000000..0b2e324 --- /dev/null +++ b/src/components/UsageBars.stories.tsx @@ -0,0 +1,29 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { UsageBars } from '@/components/UsageBars'; + +import { StoryWrapper } from '.ladle/components'; + +export const UsageBarsStory: Story<{ value: number }> = (args) => ( + + + + + +); + +UsageBarsStory.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + ${layoutMixins.container} + background: var(--color-layer-3); + + padding: 1rem; +`; diff --git a/src/components/UsageBars.tsx b/src/components/UsageBars.tsx new file mode 100644 index 0000000..07322fb --- /dev/null +++ b/src/components/UsageBars.tsx @@ -0,0 +1,56 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { type RiskLevels } from '@/constants/abacus'; + +import { UsageColorFromRiskLevel } from '@/styles/colors'; + +import { abacusHelper } from '@/lib/abacus'; +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; +}; + +export const UsageBars = ({ value, className }: ElementProps & StyleProps) => ( + + {Array.from({ length: 3 }, (_, i) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.UsageBars = styled.div<{ riskLevel: RiskLevels }>` + ${({ riskLevel }) => UsageColorFromRiskLevel(riskLevel)} + + width: 0.875rem; + height: 0.875rem; + display: flex; + align-items: end; + justify-content: space-between; +`; + +Styled.Bar = styled.div<{ active: boolean }>` + --active-delay: calc(0.2s * calc(var(--i) + 1)); + + max-width: 3px; + height: min(calc(100% / calc(var(--l) - var(--i)) + 0.1rem), 100%); + opacity: ${({ active }) => (active ? 1 : 0.2)}; + flex: 1; + background-color: currentColor; + border-radius: 1px; + + @media (prefers-reduced-motion: no-preference) { + transition: opacity 0.3s linear var(--active-delay); + } +`; diff --git a/src/components/WithConfirmationPopover.stories.tsx b/src/components/WithConfirmationPopover.stories.tsx new file mode 100644 index 0000000..2032932 --- /dev/null +++ b/src/components/WithConfirmationPopover.stories.tsx @@ -0,0 +1,52 @@ +import { type ChangeEvent, useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { + WithConfirmationPopover, + WithConfirmationPopoverProps, +} from '@/components/WithConfirmationPopover'; + +import { StoryWrapper } from '.ladle/components'; +import { Input, InputType } from './Input'; + +export const WithConfirmationPopoverStory: Story = (args) => { + const [textValue, setTextValue] = useState(''); + const [open, setOpen] = useState(false); + + return ( + + { + setOpen(false); + // alert('Cancelled!'); + }} + onConfirm={() => { + setOpen(false); + // alert('Confirmed!'); + }} + slotTrigger={
Trigger
} + > + ) => setTextValue(e.target.value)} + /> +
+
+ ); +}; + +WithConfirmationPopoverStory.args = { + sideOffset: 8, +}; + +WithConfirmationPopoverStory.argTypes = { + align: { + options: ['end', 'start', 'center'], + control: { type: 'select' }, + defaultValue: 'end', + }, +}; diff --git a/src/components/WithConfirmationPopover.tsx b/src/components/WithConfirmationPopover.tsx new file mode 100644 index 0000000..f2aabcc --- /dev/null +++ b/src/components/WithConfirmationPopover.tsx @@ -0,0 +1,136 @@ +import { + forwardRef, + type FormEvent, + type FormEventHandler, + type MouseEventHandler, + type ReactElement, + type Ref, +} from 'react'; + +import styled, { AnyStyledComponent } from 'styled-components'; +import { Anchor, Content, Portal, Root, Trigger } from '@radix-ui/react-popover'; + +import { ButtonType } from '@/constants/buttons'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +type ElementProps = { + children?: ReactElement; + asChild?: boolean; + onCancel?: MouseEventHandler | MouseEventHandler; + onConfirm?: FormEventHandler; + open?: boolean; + onOpenChange?: (open: boolean) => void; + slotTrigger: ReactElement; +}; + +type StyleProps = { + className?: string; + align?: 'start' | 'center' | 'end'; + sideOffset?: number; +}; + +export type WithConfirmationPopoverProps = ElementProps & StyleProps; + +export const WithConfirmationPopover = forwardRef( + ( + { + children, + className, + onCancel, + onConfirm, + + asChild, + open, + onOpenChange, + align, + sideOffset, + slotTrigger, + }: WithConfirmationPopoverProps, + ref?: Ref + ) => ( + + asChild && e.preventDefault()}> + {slotTrigger} + + + + e.preventDefault()} + > + { + e.preventDefault(); + e.stopPropagation(); + + onConfirm?.(e); + }} + > + {children} + + {onCancel && } + {onConfirm && ( + + )} + + + + + + ) +); + +const Styled: Record = {}; + +Styled.Content = styled(Content)` + z-index: 1; + + &:focus-visible { + outline: none; + } +`; + +Styled.Form = styled.form` + ${layoutMixins.column} + gap: 0.25rem; +`; + +Styled.ConfirmationButtons = styled.div` + ${layoutMixins.row}; + + justify-content: flex-end; + gap: 0.25rem; +`; + +Styled.IconButton = styled(IconButton)` + --button-height: 1.25rem; + --button-font: var(--font-tiny-book); +`; + +Styled.ConfirmButton = styled(Styled.IconButton)` + --button-backgroundColor: hsla(203, 25%, 19%, 1); + + svg { + color: var(--color-positive); + } +`; + +Styled.CancelButton = styled(Styled.IconButton)` + --button-backgroundColor: hsla(296, 16%, 18%, 1); + + svg { + color: var(--color-negative); + width: 0.8em; + height: 0.8em; + + path { + stroke-width: 3; + } + } +`; diff --git a/src/components/WithDetailsReceipt.stories.tsx b/src/components/WithDetailsReceipt.stories.tsx new file mode 100644 index 0000000..730a78a --- /dev/null +++ b/src/components/WithDetailsReceipt.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { Button } from '@/components/Button'; + +import { WithDetailsReceipt, WithDetailsReceiptProps } from '@/components/WithDetailsReceipt'; +import { type DetailsItem } from './Details'; + +import { StoryWrapper } from '.ladle/components'; + +const detailItems: DetailsItem[] = [ + { + key: 'item-1', + label: 'Item 1', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Item 2', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + value: 'Value 3', + }, +]; + +export const WithDetailsReceiptStory: Story = (args) => ( + +
+ + + +
+
+); + +WithDetailsReceiptStory.args = { + detailItems, +}; + +WithDetailsReceiptStory.argTypes = { + side: { + options: ['top', 'bottom'], + control: { type: 'select' }, + defaultValue: 'top', + }, +}; diff --git a/src/components/WithDetailsReceipt.tsx b/src/components/WithDetailsReceipt.tsx new file mode 100644 index 0000000..6f733cd --- /dev/null +++ b/src/components/WithDetailsReceipt.tsx @@ -0,0 +1,44 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Details, type DetailsItem } from '@/components/Details'; +import { WithReceipt } from '@/components/WithReceipt'; + +type ElementProps = { + detailItems?: DetailsItem[]; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; + hideReceipt?: boolean; + side?: 'top' | 'bottom'; +}; + +export type WithDetailsReceiptProps = ElementProps & StyleProps; + +export const WithDetailsReceipt = ({ + children, + className, + hideReceipt, + detailItems, + side, +}: WithDetailsReceiptProps) => ( + } + > + {children} + +); + +const Styled: Record = {}; + +Styled.Details = styled(Details)` + --details-item-backgroundColor: var(--withReceipt-backgroundColor); + + padding: 0.375rem 0.75rem 0.25rem; + + font-size: 0.8125em; +`; diff --git a/src/components/WithLabel.stories.tsx b/src/components/WithLabel.stories.tsx new file mode 100644 index 0000000..fc8fa84 --- /dev/null +++ b/src/components/WithLabel.stories.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { Input, InputType } from '@/components/Input'; +import { WithLabel } from '@/components/WithLabel'; + +import { StoryWrapper } from '.ladle/components'; + +import styled, { type AnyStyledComponent } from 'styled-components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const WithLabelStory: Story> = (args) => { + const [firstName, setFirstName] = useState(''); + const [lastName, setLastName] = useState(''); + + return ( + + + + ) => setFirstName(e.target.value)} + placeholder="Type something" + type={InputType.Text} + value={firstName} + /> + + + ) => setLastName(e.target.value)} + placeholder="Type something" + type={InputType.Text} + value={lastName} + /> + + + + ); +}; + +WithLabelStory.args = { + label: 'First Name', +}; + +const Styled: Record = {}; + +Styled.Column = styled.div` + ${layoutMixins.column} + gap: 1rem; +`; diff --git a/src/components/WithLabel.tsx b/src/components/WithLabel.tsx new file mode 100644 index 0000000..83e5f4b --- /dev/null +++ b/src/components/WithLabel.tsx @@ -0,0 +1,35 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + label?: React.ReactNode; + children?: React.ReactNode; + inputID?: string; +}; + +type StyleProps = { + className?: string; +}; + +export const WithLabel = ({ label, inputID, children, className }: ElementProps & StyleProps) => ( + + {label} + {children} + +); + +const Styled: Record = {}; + +Styled.WithLabel = styled.div` + --label-textColor: var(--color-text-1); + + display: grid; + gap: 0.5rem; +`; + +Styled.Label = styled.label` + ${layoutMixins.inlineRow} + font: var(--font-mini-book); + color: var(--label-textColor); +`; diff --git a/src/components/WithReceipt.stories.tsx b/src/components/WithReceipt.stories.tsx new file mode 100644 index 0000000..a14589a --- /dev/null +++ b/src/components/WithReceipt.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { Button } from '@/components/Button'; + +import { WithReceipt } from '@/components/WithReceipt'; +import { type DetailsItem } from './Details'; + +import { StoryWrapper } from '.ladle/components'; + +const items: DetailsItem[] = [ + { + key: 'item-1', + label: 'Item 1', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Item 2', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + value: 'Value 3', + }, +]; + +export const WithReceiptStory: Story> = (args) => ( + +
+ + + +
+
+); + +WithReceiptStory.args = { + items, +}; + +WithReceiptStory.argTypes = { + side: { + options: ['top', 'bottom'], + control: { type: 'select' }, + defaultValue: 'top', + }, +}; diff --git a/src/components/WithReceipt.tsx b/src/components/WithReceipt.tsx new file mode 100644 index 0000000..8b3c405 --- /dev/null +++ b/src/components/WithReceipt.tsx @@ -0,0 +1,61 @@ +import { type ReactNode } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +type ElementProps = { + slotReceipt?: ReactNode; + children: ReactNode; +}; + +type StyleProps = { + className?: string; + hideReceipt?: boolean; + side?: 'top' | 'bottom'; +}; + +export const WithReceipt = ({ + slotReceipt, + className, + hideReceipt, + side = 'top', + children, +}: ElementProps & StyleProps) => { + if (!slotReceipt) { + return <>{children}; + } + + const receipt = {slotReceipt}; + + return ( + + {side === 'top' && receipt} + {children} + {side === 'bottom' && receipt} + + ); +}; + +const Styled: Record = {}; + +Styled.WithReceipt = styled.div<{ hideReceipt?: boolean }>` + --withReceipt-backgroundColor: var(--color-layer-1); + display: grid; + + background-color: var(--withReceipt-backgroundColor); + border-radius: 0.5em; + + ${({ hideReceipt }) => + hideReceipt && + css` + background-color: transparent; + + ${Styled.SlotReceipt} { + height: 0; + opacity: 0; + } + `} +`; + +Styled.SlotReceipt = styled.div``; diff --git a/src/components/WithSidebar.tsx b/src/components/WithSidebar.tsx new file mode 100644 index 0000000..4e4c79a --- /dev/null +++ b/src/components/WithSidebar.tsx @@ -0,0 +1,204 @@ +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import styled, { type AnyStyledComponent, keyframes } from 'styled-components'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { ToggleButton } from '@/components/ToggleButton'; +import { Icon, IconName } from '@/components/Icon'; + +import { setIsSidebarOpen } from '@/state/layout'; +import { getIsSidebarOpen } from '@/state/layoutSelectors'; + +type ElementProps = { + children: React.ReactNode; + sidebar: React.ReactNode; +}; + +export type WithSidebarProps = ElementProps; + +export const WithSidebar: React.FC = ({ children, sidebar }) => { + const dispatch = useDispatch(); + const isSidebarOpen = useSelector(getIsSidebarOpen); + const stringGetter = useStringGetter(); + + return ( + + {sidebar && ( + + dispatch(setIsSidebarOpen(!isPressed))} + > + {isSidebarOpen ? ( + stringGetter({ key: STRING_KEYS.HIDE }) + ) : ( + + )} + + + {sidebar} + + )} + + {children} + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.div` + /* Params */ + --withSidebar-containerWidth: 100vw; + --withSidebar-open-sidebarWidth: var(--sidebar-width); + --withSidebar-closed-sidebarWidth: var(--collapsed-sidebar-width); + --withSidebar-gap: var(--border-width); + + /* Computed */ + + --withSidebar-current-sidebarWidth: 0px; + --withSidebar-current-contentAreaWidth: calc( + var(--withSidebar-containerWidth) - var(--withSidebar-gap) - + var(--withSidebar-current-sideAreaWidth) + ); + + &[data-state='none'] { + --withSidebar-open-sideAreaWidth: 0px; + --withSidebar-closed-sideAreaWidth: 0px; + } + &[data-state='open'] { + --withSidebar-current-sidebarWidth: var(--withSidebar-open-sidebarWidth); + } + &[data-state='closed'] { + --withSidebar-current-sidebarWidth: var(--withSidebar-closed-sidebarWidth); + } + + @media ${breakpoints.notTablet} { + /* Dynamic sidebarArea, open sidebar shrinks contentArea */ + --withSidebar-current-sideAreaWidth: var(--withSidebar-current-sidebarWidth); + /* prettier-ignore */ + --withSidebar-gridTemplate: + 'Side Content' 100% + / auto 1fr; + } + + @media ${breakpoints.tablet} { + /* No sidebar */ + --withSidebar-current-sideAreaWidth: 0px; + /* prettier-ignore */ + --withSidebar-gridTemplate: + 'Content' 100% + / 1fr; + } + + /* Rules */ + + ${layoutMixins.stickyArea1} + --stickyArea1-leftWidth: var(--withSidebar-current-sideAreaWidth); + --stickyArea1-leftGap: var(--border-width); + min-height: var(--stickyArea-height); + + ${layoutMixins.withOuterAndInnerBorders} + + display: grid; + grid-template: var(--withSidebar-gridTemplate); +`; + +Styled.Side = styled.aside` + grid-area: Side; + + ${layoutMixins.container} + + ${layoutMixins.sticky} + max-height: var(--stickyArea-height); + backdrop-filter: none; + + ${layoutMixins.stack} +`; + +Styled.Sidebar = styled.div` + --current-sidebar-width: var(--sidebar-width); + + ${layoutMixins.scrollArea} + + width: min(var(--withSidebar-current-sidebarWidth), var(--withSidebar-containerWidth)); + transition: var(--ease-out-expo) 0.3s; + transform: perspective(62.5em); + transform-origin: left top; + + &[data-state='closed'] { + --current-sidebar-width: var(--collapsed-sidebar-width); + opacity: 0; + pointer-events: none; + transform: perspective(62.5em) translateZ(-12.5em); + } + + ${layoutMixins.sticky} + + &:hover { + will-change: width; + } +`; + +Styled.TriggerButton = styled(ToggleButton)` + --button-toggle-on-backgroundColor: transparent; + + place-self: start end; + z-index: 2; + + min-width: 0; + min-height: 0; + + &[data-state='off'] { + margin: 0.75rem; + + @media (prefers-reduced-motion: no-preference) { + animation: ${keyframes` + 10%, 40% { + opacity: 0; + scale: 0; + } + `} 0.2s; + } + } + + &[data-state='on'] { + --button-border: none; + --button-radius: 0; + + min-width: 100%; + min-height: 100%; + + outline-color: transparent; + + @media (prefers-reduced-motion: no-preference) { + transition: var(--ease-out-expo) 0.25s; + + animation: ${keyframes` + 20% { + opacity: 0; + scale: 0; + } + `} 0.2s; + } + } +`; + +Styled.Content = styled.article` + grid-area: Content; + + ${layoutMixins.contentContainerPage} + --content-container-width: var(--withSidebar-current-contentAreaWidth); + + ${layoutMixins.stickyArea2} + + transition: var(--ease-out-expo) 0.25s; +`; diff --git a/src/components/WithTooltip.stories.tsx b/src/components/WithTooltip.stories.tsx new file mode 100644 index 0000000..93bd2b3 --- /dev/null +++ b/src/components/WithTooltip.stories.tsx @@ -0,0 +1,39 @@ +import type { Story } from '@ladle/react'; + +import { WithTooltip } from '@/components/WithTooltip'; + +import { tooltipStrings } from '@/constants/tooltips'; + +import { StoryWrapper } from '.ladle/components'; + +export const Tooltip: Story> = (args) => { + return ( + + +
Hover me
+
+
+ ); +}; + +Tooltip.args = { + withIcon: false, +}; + +Tooltip.argTypes = { + align: { + options: ['start', 'center', 'end'], + control: { type: 'select' }, + defaultValue: 'start', + }, + side: { + options: ['top', 'bottom', 'left', 'right'], + control: { type: 'select' }, + defaultValue: 'top', + }, + tooltip: { + options: Object.keys(tooltipStrings), + control: { type: 'select' }, + defaultValue: Object.keys(tooltipStrings)[0], + }, +}; diff --git a/src/components/WithTooltip.tsx b/src/components/WithTooltip.tsx new file mode 100644 index 0000000..71563c6 --- /dev/null +++ b/src/components/WithTooltip.tsx @@ -0,0 +1,144 @@ +import type { ReactNode } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import { Content, Portal, Provider, Root, Trigger, Arrow } from '@radix-ui/react-tooltip'; + +import { tooltipStrings } from '@/constants/tooltips'; + +import { useStringGetter } from '@/hooks'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +type ElementProps = { + tooltip?: keyof typeof tooltipStrings; + tooltipString?: string; + stringParams?: Record; + withIcon?: boolean; + children?: ReactNode; + slotTooltip?: ReactNode; +}; + +type StyleProps = { + align?: 'start' | 'center' | 'end'; + side?: 'top' | 'right' | 'bottom' | 'left'; + className?: string; +}; + +export const WithTooltip = ({ + tooltip, + tooltipString, + stringParams, + withIcon, + children, + align, + side, + className, + slotTooltip, +}: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + const getTooltipStrings = tooltip && tooltipStrings[tooltip]; + if (!getTooltipStrings && !tooltipString && !slotTooltip) return <>{children}; + + let tooltipTitle; + let tooltipBody; + + if (getTooltipStrings) { + const { title, body } = getTooltipStrings({ + stringGetter, + stringParams, + }); + tooltipTitle = title; + tooltipBody = body; + } else { + tooltipBody = tooltipString; + } + + return ( + + + + + {children} + {withIcon && } + + + + + + {slotTooltip ?? ( +
+ {tooltipTitle &&
{tooltipTitle}
} + {tooltipBody &&
{tooltipBody}
} + +
+ )} +
+
+
+
+ ); +}; + +const Styled: Record = {}; + +Styled.Abbr = styled.abbr` + ${layoutMixins.inlineRow} + + text-decoration: underline dashed 0px; + text-underline-position: under; + text-decoration-color: var(--color-text-0); + text-decoration-skip-ink: all; + + cursor: help; +`; + +Styled.Content = styled(Content)` + --tooltip-backgroundColor: var(--color-layer-4); + --tooltip-backgroundColor: hsl( + var(--layer-base-hue), + var(--layer-base-saturation), + calc(var(--layer-base-lightness) + 4%), + 0.66 + ); + + ${popoverMixins.popover} + --popover-backgroundColor: var(--tooltip-backgroundColor); + --popover-textColor: var(--color-text-1); + + ${popoverMixins.popoverAnimation} + --popover-closed-height: auto; + + max-width: 30ch; + display: grid; + align-items: end; + gap: 0.25rem; + padding: 0.75em; + + font-size: 0.8125em; + + border-radius: 0.33em; + + dt { + font: var(--font-small-book); + } + + dd { + font: var(--font-mini-book); + } +`; + +Styled.Arrow = styled(Arrow)` + width: 0.75rem; + height: 0.375rem; + + polygon { + fill: var(--tooltip-backgroundColor); + } +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); +`; diff --git a/src/components/visx/AxisLabelOutput.tsx b/src/components/visx/AxisLabelOutput.tsx new file mode 100644 index 0000000..fe0bd6c --- /dev/null +++ b/src/components/visx/AxisLabelOutput.tsx @@ -0,0 +1,39 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { Output } from '../Output'; + +type ElementProps = { + children: React.ReactNode; +} & Parameters[0]; + +type StyleProps = { + accentColor?: string; +}; + +export const AxisLabelOutput = ({ children, accentColor, ...props }: ElementProps & StyleProps) => ( + + {children} + +); + +const Styled: Record = {}; + +Styled.AxisLabelOutput = styled(Output)<{ accentColor?: string }>` + --accent-color: var(--color-layer-6); + + ${({ accentColor }) => + accentColor && + css` + --accent-color: ${accentColor}; + `} + + offset: path('M 0 0') 0px; + + display: inline-block; + padding: 0.15em 0.4em; + border-radius: 0.25em; + + color: white; + + background-color: var(--accent-color); +`; diff --git a/src/components/visx/TimeSeriesChart.tsx b/src/components/visx/TimeSeriesChart.tsx new file mode 100644 index 0000000..43adba2 --- /dev/null +++ b/src/components/visx/TimeSeriesChart.tsx @@ -0,0 +1,467 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import styled, { AnyStyledComponent, keyframes } from 'styled-components'; + +import { allTimeUnits } from '@/constants/time'; +import { useBreakpoints } from '@/hooks'; +import { useAnimationFrame } from '@/hooks/useAnimationFrame'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { ParentSize } from '@visx/responsive'; +import { + XYChart, + Axis, + Grid, + DataProvider, + EventEmitterProvider, + LineSeries, + GlyphSeries, + type Margin, + type AxisScale, + type TooltipContextType, +} from '@visx/xychart'; +import type { ScaleConfig } from '@visx/scale'; +import { LinearGradient } from '@visx/gradient'; +import Tooltip from '@/components/visx/XYChartTooltipWithBounds'; +import { RenderTooltipParams } from '@visx/xychart/lib/components/Tooltip'; + +import { clamp, lerp, map } from '@/lib/math'; +import { formatAbsoluteTime } from '@/lib/dateTime'; +import { objectEntries } from '@/lib/objectEntries'; + +import { XYChartThreshold, type Threshold } from './XYChartThreshold'; + +type LineSeriesProps = Parameters< + typeof LineSeries +>[0]; + +type GlyphSeriesProps = Parameters< + typeof GlyphSeries +>[0]; + +type ThresholdProps = Parameters>[0]; + +type ElementProps = { + id: string; + selectedLocale: string; + yAxisScaleType?: ScaleConfig['type']; + data: Datum[]; + series: (Pick< + LineSeriesProps, + | 'dataKey' + // | 'xAccessor' + // | 'yAccessor' + | 'colorAccessor' + // | 'curve' + | 'onPointerMove' + | 'onPointerOut' + > & + Pick, 'curve'> & { + colorAccessor: GlyphSeriesProps['colorAccessor']; + xAccessor: (_: Datum) => number; + yAccessor: (_: Datum) => number; + getCurve?: (_: { zoom: number; zoomDomain: number }) => ThresholdProps['curve']; // LineSeriesProps['curve']; + glyphSize?: GlyphSeriesProps['size']; + getGlyphSize?: (_: { datum: Datum; zoom: number }) => number; + threshold?: Pick, 'aboveAreaProps' | 'belowAreaProps'> & { + yAccessor: LineSeriesProps['yAccessor']; + }; + })[]; + tickFormatX?: (x: number, _: { zoom: number; zoomDomain: number; numTicks: number }) => string; + tickFormatY?: (y: number, _: { zoom: number; zoomDomain: number; numTicks: number }) => string; + renderXAxisLabel?: (_: RenderTooltipParams) => React.ReactNode; + renderYAxisLabel?: (_: RenderTooltipParams) => React.ReactNode; + renderTooltip?: (_: RenderTooltipParams) => React.ReactNode; + onTooltipContext?: (tooltipContext: TooltipContextType) => void; + onVisibleDataChange?: (data: Datum[]) => void; + onZoom?: (_: { zoomDomain: number | undefined }) => void; + slotEmpty: React.ReactNode; + children: React.ReactNode; + className?: string; +}; + +type StyleProps = { + margin?: Margin; + padding?: Margin; + defaultZoomDomain?: number; + minZoomDomain: number; + numGridLines?: number; + withGridRows?: boolean; + withGridColumns?: boolean; + tickSpacingX?: number; + tickSpacingY?: number; +}; + +export const TimeSeriesChart = ({ + id, + selectedLocale, + yAxisScaleType = 'linear', + data, + series, + tickFormatX = (timestamp, { zoomDomain, numTicks }) => + formatAbsoluteTime(timestamp, { + resolutionUnit: + objectEntries(allTimeUnits) + .sort((a, b) => a[1] - b[1]) + .find(([, milliseconds]) => zoomDomain <= milliseconds)?.[0] ?? 'year', + locale: selectedLocale, + }), + tickFormatY = (y) => String(y), + renderXAxisLabel, + renderYAxisLabel, + renderTooltip, + onTooltipContext, + onVisibleDataChange, + onZoom, + slotEmpty, + children, + className, + + margin, + padding, + defaultZoomDomain, + minZoomDomain = 0, + numGridLines, + withGridRows = true, + withGridColumns = false, + tickSpacingX = 150, + tickSpacingY = 50, +}: ElementProps & StyleProps) => { + // Context + const { isMobile } = useBreakpoints(); + + // Chart data + const { xAccessor, yAccessor } = series[0]; + + const earliestDatum = data?.[0]; + const latestDatum = data?.[data.length - 1]; + + // Chart state + const [zoomDomain, setZoomDomain] = useState( + defaultZoomDomain ?? xAccessor(latestDatum) - xAccessor(earliestDatum) + ); + + const [zoomDomainAnimateTo, setZoomDomainAnimateTo] = useState(); + + useEffect(() => { + if (defaultZoomDomain && defaultZoomDomain !== zoomDomain) { + setZoomDomainAnimateTo(defaultZoomDomain); + } + }, [defaultZoomDomain]); + + useEffect(() => { + onZoom?.({ zoomDomain }); + }, [zoomDomain]); + + useAnimationFrame( + (elapsedMilliseconds) => { + if (zoomDomainAnimateTo) { + setZoomDomain( + (zoomDomain) => + zoomDomain && + zoomDomain * (zoomDomainAnimateTo / zoomDomain) ** (elapsedMilliseconds * 0.0166) + ); + } + }, + [zoomDomainAnimateTo] + ); + + // Computations + const { zoom, domain, range, visibleData } = useMemo(() => { + if (!zoomDomain) return {}; + + const zoom = zoomDomain / minZoomDomain; + + const domain = [ + clamp(xAccessor(latestDatum) - zoomDomain, xAccessor(earliestDatum), xAccessor(latestDatum)), + xAccessor(latestDatum), + ] as const; + + const visibleData = data.filter( + (datum) => xAccessor(datum) >= domain[0] && xAccessor(datum) <= domain[1] + ); + + const range = visibleData + .filter((datum) => xAccessor(datum) >= domain[0] && xAccessor(datum) <= domain[1]) + .map((datum) => yAccessor(datum)) + .reduce((range, y) => [Math.min(range[0], y), Math.max(range[1], y)] as const, [ + Infinity, + -Infinity, + ] as const); + + return { zoom, domain, range, visibleData }; + }, [data, zoomDomain, minZoomDomain]); + + useEffect(() => { + if (visibleData) { + onVisibleDataChange?.(visibleData); + } + }, [visibleData]); + + // Events + const onWheel = ({ deltaX, deltaY }: WheelEvent) => { + setZoomDomain( + clamp( + Math.max(1e-320, Math.min(Number.MAX_SAFE_INTEGER, zoomDomain * Math.exp(deltaY / 1000))), + minZoomDomain, + xAccessor(latestDatum) - xAccessor(earliestDatum) + ) + ); + + setZoomDomainAnimateTo(undefined); + + // TODO: scroll horizontally to pan + }; + + return ( + + {data.length && zoomDomain ? ( + + + + {({ width, height }: { width: number; height: number }) => { + const numTicksX = + (width - (margin?.left ?? 0) - (margin?.right ?? 0)) / tickSpacingX; + const numTicksY = + (height - (margin?.top ?? 0) - (margin?.bottom ?? 0)) / tickSpacingY; + + return ( + + + + {series.map((series) => ( + + {series.threshold && ( + <> + + id={`${Math.random()}`} + data={data} + x={series.xAccessor} + y0={series.yAccessor} + y1={series.threshold.yAccessor} + clipAboveTo={margin?.top ?? 0} + clipBelowTo={height - (margin?.bottom ?? 0)} + curve={series.getCurve?.({ zoom, zoomDomain }) ?? series.curve} + aboveAreaProps={{ + fill: 'url(#XYChartThresholdAbove)', + fillOpacity: series.threshold.aboveAreaProps?.fillOpacity, + strokeWidth: series.threshold.aboveAreaProps?.strokeWidth, + stroke: series.threshold.aboveAreaProps?.stroke, + }} + belowAreaProps={{ + fill: 'url(#XYChartThresholdBelow)', + fillOpacity: series.threshold.belowAreaProps?.fillOpacity, + strokeWidth: series.threshold.belowAreaProps?.strokeWidth, + stroke: series.threshold.belowAreaProps?.stroke, + }} + /> + + + + )} + 'transparent' : series.colorAccessor + } + onPointerMove={series?.onPointerMove} + onPointerOut={series?.onPointerOut} + /> + + {(series.glyphSize || series.getGlyphSize) && ( + series.getGlyphSize?.({ datum, zoom }) || 0 + : series.glyphSize || 0 + } + /> + )} + + ))} + + {/* Y-Axis */} + {!isMobile && ( + <> + {margin?.left && margin.left > 0 && ( + + )} + + + tickFormatY(y, { zoom, zoomDomain, numTicks: numTicksY }) + } + /> + + )} + + {/* X-Axis */} + tickFormatX(x, { zoom, zoomDomain, numTicks: numTicksX })} + /> + + {renderTooltip && ( + + unstyled + applyPositionStyle + showDatumGlyph + glyphStyle={{ + fill: 'var(--color-text-1)', + stroke: 'var(--color-layer-5)', + radius: 4, + }} + showVerticalCrosshair + verticalCrosshairStyle={{ + strokeWidth: 1, + strokeDasharray: '5 5', + opacity: 0.7, + }} + snapCrosshairToDatumX + renderXAxisLabel={renderXAxisLabel} + showHorizontalCrosshair + horizontalCrosshairStyle={{ + strokeWidth: 1, + strokeDasharray: '5 5', + opacity: 0.7, + }} + snapCrosshairToDatumY + renderYAxisLabel={renderYAxisLabel} + snapTooltipToDatumX + snapTooltipToDatumY={false} + renderTooltip={renderTooltip} + onTooltipContext={onTooltipContext} + /> + )} + + ); + }} + + + + ) : ( + slotEmpty ?? null + )} + + {children} + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.div` + ${layoutMixins.stack} + width: 0; + min-width: 100%; + height: 0; + min-height: 100%; + + background: var(--stickyArea-background); + + font-size: 0.75rem; + + transform-style: flat; + + cursor: crosshair; + user-select: none; + + text { + font-feature-settings: var(--fontFeature-monoNumbers); + fill: var(--color-text-0); + } + + @media (prefers-reduced-motion: no-preference) { + g[data-state='open'] { + animation: ${keyframes` + from { + opacity: 0; + } + `} 0.1s var(--ease-out-expo); + } + &:not(:hover) g[data-state] { + animation: ${keyframes` + to { + opacity: 0; + } + `} 0.2s 0.3s var(--ease-out-expo) forwards; + } + } +`; + +Styled.ParentSize = styled(ParentSize)` + min-height: 0; + display: grid; + + overflow: auto; + overscroll-behavior: contain; +`; + +Styled.YAxisBackground = styled.foreignObject` + background: var(--stickyArea-background); + + /* Safari */ + @supports (background: -webkit-named-image(i)) { + background: var(--stickyArea-background); + } +`; diff --git a/src/components/visx/TooltipContent.tsx b/src/components/visx/TooltipContent.tsx new file mode 100644 index 0000000..db3d108 --- /dev/null +++ b/src/components/visx/TooltipContent.tsx @@ -0,0 +1,66 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +type ElementProps = { + children: React.ReactNode; +}; + +type StyleProps = { + accentColor?: string; +}; + +export const TooltipContent = ({ children, accentColor }: ElementProps & StyleProps) => ( + {children} +); + +const Styled: Record = {}; + +Styled.TooltipContent = styled.aside<{ accentColor?: string }>` + --accent-color: currentColor; + + ${({ accentColor }) => + accentColor && + css` + --accent-color: ${accentColor}; + `} + + ${popoverMixins.popover} + --popover-radius: 0.5rem; + --popover-background-color: hsl( + var(--layer-base-hue), + var(--layer-base-saturation), + calc(var(--layer-base-lightness)), + 0.9 + ); + --popover-backdrop-filter: saturate(120%) blur(12px); + + display: grid; + gap: 0.25rem; + overflow: hidden; + padding: 0.5rem 0.75rem; + + /* Safari */ + width: max-content; + + /* Firefox */ + dl { + margin: 0; + } + + &:before { + content: ''; + + position: absolute; + inset: 0; + width: 2px; + + background-color: var(--accent-color); + + transition: 0.2s; + } + + h4 { + line-height: 1.75; + } +`; diff --git a/src/components/visx/XYChartThreshold.tsx b/src/components/visx/XYChartThreshold.tsx new file mode 100644 index 0000000..c360b6e --- /dev/null +++ b/src/components/visx/XYChartThreshold.tsx @@ -0,0 +1,26 @@ +import { Threshold } from '@visx/threshold'; +import { DataContext } from '@visx/xychart'; +import { useContext } from 'react'; + +/** A visx that scales based on the nearest . Use inside . */ +export const XYChartThreshold = ({ + x, + y0, + y1, + ...props +}: Parameters>[0]) => { + const { xScale, yScale } = useContext(DataContext); + + return xScale && yScale ? ( + <> + + x={(datum, index, data) => xScale(typeof x === 'function' ? x(datum, index, data) : x) as number} + y0={(datum, index, data) => yScale(typeof y0 === 'function' ? y0(datum, index, data) : y0) as number} + y1={(datum, index, data) => yScale(typeof y1 === 'function' ? y1(datum, index, data) : y1) as number} + {...props} + /> + + ) : null; +}; + +export { Threshold }; diff --git a/src/components/visx/XYChartTooltipWithBounds.tsx b/src/components/visx/XYChartTooltipWithBounds.tsx new file mode 100644 index 0000000..c9633b2 --- /dev/null +++ b/src/components/visx/XYChartTooltipWithBounds.tsx @@ -0,0 +1,305 @@ +// Forked from original XYChart Tooltip to use TooltipWithBounds instead of TooltipInPortal: +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/components/Tooltip.tsx + +import React, { Fragment, useCallback, useContext, useEffect } from 'react'; + +import { TooltipWithBounds } from '@visx/tooltip'; +import type { TooltipProps as BaseTooltipProps } from '@visx/tooltip/lib/tooltips/Tooltip'; +import { PickD3Scale } from '@visx/scale'; +import { Group } from '@visx/group'; + +import { + TooltipContext, + DataContext, + type GlyphProps as RenderGlyphProps, + type TooltipContextType, +} from '@visx/xychart'; + +import { getScaleBandwidth } from './getScaleBandwidth'; +import { isValidNumber } from './isValidNumber'; + +export type RenderTooltipParams = TooltipContextType & { + colorScale?: PickD3Scale<'ordinal', string, string>; +}; + +export interface RenderTooltipGlyphProps extends RenderGlyphProps { + glyphStyle?: React.SVGProps; + isNearestDatum: boolean; +} + +export type TooltipProps = { + /** + * When TooltipContext.tooltipOpen=true, this function is invoked and if the + * return value is non-null, its content is rendered inside the tooltip container. + * Content will be rendered in an HTML parent. + */ + renderTooltip: (params: RenderTooltipParams) => React.ReactNode; + /** Function which handles rendering glyphs. */ + renderGlyph?: (params: RenderTooltipGlyphProps) => React.ReactNode; + + renderYAxisLabel?: (params: RenderTooltipParams) => React.ReactNode; + renderXAxisLabel?: (params: RenderTooltipParams) => React.ReactNode; + + /** Whether to snap tooltip x-coord to the nearest Datum x-coord instead of the event x-coord. */ + snapTooltipToDatumX?: boolean; + /** Whether to snap tooltip y-coord to the nearest Datum y-coord instead of the event y-coord. */ + snapTooltipToDatumY?: boolean; + /** Whether to show a vertical line at tooltip position. */ + showVerticalCrosshair?: boolean; + /** Whether to show a horizontal line at tooltip position. */ + showHorizontalCrosshair?: boolean; + /** Whether to snap crosshair x-coord to the nearest Datum x-coord instead of the event x-coord. */ + snapCrosshairToDatumX?: boolean; + /** Whether to snap crosshair y-coord to the nearest Datum y-coord instead of the event y-coord. */ + snapCrosshairToDatumY?: boolean; + /** Whether to show a glyph at the tooltip position for the (single) nearest Datum. */ + showDatumGlyph?: boolean; + /** Whether to show a glyph for the nearest Datum in each series. */ + showSeriesGlyphs?: boolean; + /** Optional styles for the vertical crosshair, if visible. */ + verticalCrosshairStyle?: React.SVGProps; + /** Optional styles for the vertical crosshair, if visible. */ + horizontalCrosshairStyle?: React.SVGProps; + /** Optional styles for the point, if visible. */ + glyphStyle?: React.SVGProps; +} & Omit & { + onTooltipContext?: (tooltipContext: TooltipContextType) => void; + }; + +function DefaultGlyph(props: RenderTooltipGlyphProps) { + const { theme } = useContext(DataContext) || {}; + + return ( + + ); +} + +function defaultRenderGlyph(props: RenderTooltipGlyphProps) { + return ; +} + +function TooltipInner({ + horizontalCrosshairStyle, + glyphStyle, + onTooltipContext, + renderTooltip, + renderYAxisLabel, + renderXAxisLabel, + renderGlyph = defaultRenderGlyph, + showDatumGlyph = false, + showHorizontalCrosshair = false, + showSeriesGlyphs = false, + showVerticalCrosshair = false, + snapTooltipToDatumX = false, + snapTooltipToDatumY = false, + snapCrosshairToDatumX = true, + snapCrosshairToDatumY = true, + verticalCrosshairStyle, + ...tooltipProps +}: TooltipProps) { + const { + colorScale, + theme, + innerHeight = 0, + innerWidth = 0, + margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + }, + xScale, + yScale, + dataRegistry, + } = useContext(DataContext) || {}; + + const tooltipContext = useContext(TooltipContext) as TooltipContextType; + + useEffect(() => { + onTooltipContext?.(tooltipContext); + }, [tooltipContext]); + + const tooltipContent = tooltipContext?.tooltipOpen + ? renderTooltip({ ...tooltipContext, colorScale }) + : null; + + const showTooltip = tooltipContext?.tooltipOpen && tooltipContent != null; + + let computedTooltipLeft = tooltipContext?.tooltipLeft || 0; + let computedTooltipTop = tooltipContext?.tooltipTop || 0; + let crosshairLeft = computedTooltipLeft; + let crosshairTop = computedTooltipTop; + + const xScaleBandwidth = xScale ? getScaleBandwidth(xScale) : 0; + const yScaleBandwidth = yScale ? getScaleBandwidth(yScale) : 0; + + const getDatumLeftTop = useCallback( + (key: string, datum: Datum) => { + const entry = dataRegistry?.get(key); + const xAccessor = entry?.xAccessor; + const yAccessor = entry?.yAccessor; + const left = + xScale && xAccessor + ? Number(xScale(xAccessor(datum))) + xScaleBandwidth / 2 ?? 0 + : undefined; + const top = + yScale && yAccessor + ? Number(yScale(yAccessor(datum))) + yScaleBandwidth / 2 ?? 0 + : undefined; + return { left, top }; + }, + [dataRegistry, xScaleBandwidth, yScaleBandwidth, xScale, yScale] + ); + + const nearestDatum = tooltipContext?.tooltipData?.nearestDatum; + const nearestDatumKey = nearestDatum?.key ?? ''; + + if (showTooltip && nearestDatum) { + const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum); + + // snap x- or y-coord to the actual data point (not event coordinates) + computedTooltipLeft = snapTooltipToDatumX && isValidNumber(left) ? left : computedTooltipLeft; + computedTooltipTop = snapTooltipToDatumY && isValidNumber(top) ? top : computedTooltipTop; + + crosshairLeft = snapCrosshairToDatumX && isValidNumber(left) ? left : crosshairLeft; + crosshairTop = snapCrosshairToDatumY && isValidNumber(top) ? top : crosshairTop; + } + + // collect positions + styles for glyphs; glyphs always snap to Datum, not event coords + const glyphProps: RenderTooltipGlyphProps[] = []; + + if (showTooltip && (showDatumGlyph || showSeriesGlyphs)) { + const size = Number(glyphStyle?.radius ?? 4); + + if (showSeriesGlyphs) { + Object.values(tooltipContext?.tooltipData?.datumByKey ?? {}).forEach( + ({ key, datum, index }) => { + const color = colorScale?.(key) ?? theme?.htmlLabel?.color ?? '#222'; + const { left, top } = getDatumLeftTop(key, datum); + + // don't show glyphs if coords are unavailable + if (!isValidNumber(left) || !isValidNumber(top)) return; + + glyphProps.push({ + key, + color, + datum, + index, + size, + x: left, + y: top, + glyphStyle, + isNearestDatum: nearestDatum ? nearestDatum.key === key : false, + }); + } + ); + } else if (nearestDatum) { + const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum); + // don't show glyphs if coords are unavailable + if (isValidNumber(left) && isValidNumber(top)) { + const color = + (nearestDatumKey && colorScale?.(nearestDatumKey)) ?? + null ?? + theme?.gridStyles?.stroke ?? + theme?.htmlLabel?.color ?? + '#222'; + glyphProps.push({ + key: nearestDatumKey, + color, + datum: nearestDatum.datum, + index: nearestDatum.index, + size, + x: left, + y: top, + glyphStyle, + isNearestDatum: true, + }); + } + } + } + + const yAxisLabelSide = + crosshairLeft < innerWidth / 2 + ? crosshairLeft < 120 + ? 'right' + : 'left' + : crosshairLeft > innerWidth - 120 + ? 'left' + : 'right'; + + return showTooltip ? ( + + {showVerticalCrosshair && ( + + )} + + {showHorizontalCrosshair && ( + + )} + + {nearestDatum && renderXAxisLabel && ( + + + {renderXAxisLabel?.({ ...tooltipContext, colorScale })} + + + )} + + {nearestDatum && renderYAxisLabel && ( + + + {renderYAxisLabel?.({ ...tooltipContext, colorScale })} + + + )} + + {glyphProps.map(({ x, y, ...props }, i) => ( + {renderGlyph({ x, y, ...props })} + ))} + + + + {tooltipContent} + + + + ) : null; +} + +/** + * This is a wrapper component which bails early if tooltip is not visible. + * If many charts with Tooltips are rendered on a page, + * this avoids creating many resize observers / hitting browser limits. + */ +export default function Tooltip(props: TooltipProps) { + return ; +} diff --git a/src/components/visx/XYChartWithPointerEvents.tsx b/src/components/visx/XYChartWithPointerEvents.tsx new file mode 100644 index 0000000..0928d6f --- /dev/null +++ b/src/components/visx/XYChartWithPointerEvents.tsx @@ -0,0 +1,46 @@ +import React, { useContext, useState } from 'react'; + +import { Point } from '@visx/point'; +import { localPoint } from '@visx/event'; +import { XYChart, DataContext } from '@visx/xychart'; +import { getScaleBandwidth } from '@/components/visx/getScaleBandwidth'; + +export const XYChartWithPointerEvents = ({ + onPointerMove, onPointerUp, onPointerPressedChange, ...props +}: { + onPointerMove?: (point: Point) => void; + onPointerUp?: (point: Point) => void; + onPointerPressedChange?: (isPointerPressed: boolean) => void; +} & React.PropsWithChildren>) => { + const { xScale, yScale } = useContext(DataContext); + + const [lastPointerMoveEvent, setLastPointerMoveEvent] = useState(); + + const pointerContainerPosition = lastPointerMoveEvent ? localPoint(lastPointerMoveEvent) : null; + + const pointerChartPosition = xScale && yScale && pointerContainerPosition && + new Point({ + x: xScale.invert(pointerContainerPosition?.x - getScaleBandwidth(xScale) / 2), + y: yScale.invert(pointerContainerPosition?.y - getScaleBandwidth(yScale) / 2), + }); + + return ( + { + setLastPointerMoveEvent(event as React.PointerEvent); + if (pointerChartPosition) + onPointerMove?.(pointerChartPosition); + }} + onPointerOut={() => setLastPointerMoveEvent(undefined)} + onPointerDown={() => onPointerPressedChange?.(true)} + onPointerUp={() => { + onPointerPressedChange?.(false); + if (pointerChartPosition) + onPointerUp?.(pointerChartPosition); + }} + > + {props.children} + + ); +}; diff --git a/src/components/visx/getScaleBandwidth.ts b/src/components/visx/getScaleBandwidth.ts new file mode 100644 index 0000000..700e234 --- /dev/null +++ b/src/components/visx/getScaleBandwidth.ts @@ -0,0 +1,9 @@ +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/typeguards/isValidNumber.ts + +import { AxisScale } from '@visx/axis'; + +export function getScaleBandwidth(scale?: Scale) { + // Broaden type before using 'xxx' in s as typeguard. + const s = scale as AxisScale; + return s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0; +} diff --git a/src/components/visx/isValidNumber.ts b/src/components/visx/isValidNumber.ts new file mode 100644 index 0000000..5489bcd --- /dev/null +++ b/src/components/visx/isValidNumber.ts @@ -0,0 +1,5 @@ +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/typeguards/isValidNumber.ts + +export function isValidNumber(_: unknown): _ is number { + return _ != null && typeof _ === 'number' && !Number.isNaN(_) && Number.isFinite(_); +} diff --git a/src/constants/abacus.ts b/src/constants/abacus.ts new file mode 100644 index 0000000..6ff6bf0 --- /dev/null +++ b/src/constants/abacus.ts @@ -0,0 +1,254 @@ +import Abacus, { kollections } from '@dydxprotocol/abacus'; +import { OrderSide } from '@dydxprotocol/v4-client-js'; +import { PositionSide, TradeTypes } from './trade'; +import { STRING_KEYS } from './localization'; + +export type Nullable = T | null | undefined; + +// ------ V4 Protocols ------ // +export const IOImplementations = Abacus.exchange.dydx.abacus.utils.IOImplementations; +export const UIImplementations = Abacus.exchange.dydx.abacus.utils.UIImplementations; +export type AbacusDYDXChainTransactionsProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.DYDXChainTransactionsProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusRestProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.RestProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusWebsocketProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.WebSocketProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusStateNotificationProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.StateNotificationProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusLocalizerProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.LocalizerProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusFormatterProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.FormatterProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusThreadingProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.ThreadingProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusFileSystemProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.FileSystemProtocol, + '__doNotUseOrImplementIt' +>; + +export type FileLocation = Abacus.exchange.dydx.abacus.protocols.FileLocation; +export type ThreadingType = Abacus.exchange.dydx.abacus.protocols.ThreadingType; +export const CoroutineTimer = Abacus.exchange.dydx.abacus.utils.CoroutineTimer; + +// ------ Networking ------ // +export const QueryType = Abacus.exchange.dydx.abacus.protocols.QueryType; +const queryTypes = [...QueryType.values()] as const; +export type QueryTypes = (typeof queryTypes)[number]; + +export const TransactionType = Abacus.exchange.dydx.abacus.protocols.TransactionType; +const transactionTypes = [...TransactionType.values()] as const; +export type TransactionTypes = (typeof transactionTypes)[number]; + +export type NetworkConfig = { + chainId: string; + indexerUrl: string; + indexerSocketUrl: string; + validatorUrl: string; + faucetUrl?: string | null; +}; + +export type ConnectNetworkEvent = CustomEvent>; + +// ------ State ------ +export type AbacusApiState = Abacus.exchange.dydx.abacus.state.app.ApiState; +export const AbacusApiStatus = Abacus.exchange.dydx.abacus.state.app.ApiStatus; +const abacusApiStatuses = [...AbacusApiStatus.values()]; +export type AbacusApiStatuses = (typeof abacusApiStatuses)[number]; +export const Changes = Abacus.exchange.dydx.abacus.state.changes.Changes; +export type PerpetualStateChanges = Abacus.exchange.dydx.abacus.state.changes.StateChanges; +export const AsyncAbacusStateManager = + Abacus.exchange.dydx.abacus.state.manager.AsyncAbacusStateManager; +export type ParsingError = Abacus.exchange.dydx.abacus.responses.ParsingError; +export type ParsingErrors = kollections.List; + +// ------ Perpetuals/Markets ------ // +export type PerpetualState = Abacus.exchange.dydx.abacus.output.PerpetualState; +export type MarketCandles = Abacus.exchange.dydx.abacus.output.MarketCandles; +export type MarketOrderbook = Abacus.exchange.dydx.abacus.output.MarketOrderbook; +export type MarketPerpetual = Abacus.exchange.dydx.abacus.output.MarketPerpetual; +export type MarketStatus = Abacus.exchange.dydx.abacus.output.MarketStatus; +export type MarketTrade = Abacus.exchange.dydx.abacus.output.MarketTrade; +export type MarketTrades = kollections.List; +export type MarketsSummary = Partial; +export type OrderbookLine = Abacus.exchange.dydx.abacus.output.OrderbookLine; +export type PerpetualMarket = Abacus.exchange.dydx.abacus.output.PerpetualMarket; +export type MarketHistoricalFunding = Abacus.exchange.dydx.abacus.output.MarketHistoricalFunding; + +// ------ Configs ------ // +export type Configs = Abacus.exchange.dydx.abacus.output.Configs; +export type FeeDiscount = Abacus.exchange.dydx.abacus.output.FeeDiscount; +export type FeeDiscountResources = Abacus.exchange.dydx.abacus.output.FeeDiscountResources; +export type FeeTier = Abacus.exchange.dydx.abacus.output.FeeTier; +export type FeeTierResources = Abacus.exchange.dydx.abacus.output.FeeTierResources; +export type NetworkConfigs = Abacus.exchange.dydx.abacus.output.NetworkConfigs; + +// ------ Assets ------ // +export type Asset = Abacus.exchange.dydx.abacus.output.Asset; +export type AssetResources = Abacus.exchange.dydx.abacus.output.AssetResources; + +// ------ Inputs ------ // +export type Inputs = Abacus.exchange.dydx.abacus.output.input.Input; +export type TradeInputs = Abacus.exchange.dydx.abacus.output.input.TradeInput; +export type ClosePositionInputs = Abacus.exchange.dydx.abacus.output.input.ClosePositionInput; +export type TradeInputSummary = Abacus.exchange.dydx.abacus.output.input.TradeInputSummary; +export type TransferInputs = Abacus.exchange.dydx.abacus.output.input.TransferInput; +export type InputError = Abacus.exchange.dydx.abacus.output.input.ValidationError; +export type TransferInputTokenResource = + Abacus.exchange.dydx.abacus.output.input.TransferInputTokenResource; +export type TransferInputChainResource = + Abacus.exchange.dydx.abacus.output.input.TransferInputChainResource; +export type SelectionOption = Abacus.exchange.dydx.abacus.output.input.SelectionOption; +export const ErrorType = Abacus.exchange.dydx.abacus.output.input.ErrorType; +export const InputSelectionOption = Abacus.exchange.dydx.abacus.output.input.SelectionOption; + +// ------ Wallet ------ // +export type Wallet = Abacus.exchange.dydx.abacus.output.Wallet; +export type Subaccount = Abacus.exchange.dydx.abacus.output.Subaccount; +export type SubaccountPosition = Abacus.exchange.dydx.abacus.output.SubaccountPosition; +export type SubaccountOrder = Abacus.exchange.dydx.abacus.output.SubaccountOrder; +export type OrderStatus = Abacus.exchange.dydx.abacus.output.input.OrderStatus; +export const AbacusOrderStatus = Abacus.exchange.dydx.abacus.output.input.OrderStatus; +export type SubaccountFills = Abacus.exchange.dydx.abacus.output.SubaccountFill[]; +export type SubaccountFill = Abacus.exchange.dydx.abacus.output.SubaccountFill; +export type SubaccountFundingPayment = Abacus.exchange.dydx.abacus.output.SubaccountFundingPayment; +export type SubaccountFundingPayments = + Abacus.exchange.dydx.abacus.output.SubaccountFundingPayment[]; +export type SubaccountTransfer = Abacus.exchange.dydx.abacus.output.SubaccountTransfer; +export type SubaccountTransfers = Abacus.exchange.dydx.abacus.output.SubaccountTransfer[]; + +// ------ Historical PnL ------ // +export type SubAccountHistoricalPNL = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL; +export type SubAccountHistoricalPNLs = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL[]; +export const HistoricalPnlPeriod = Abacus.exchange.dydx.abacus.state.app.HistoricalPnlPeriod; +const historicalPnlPeriod = [...HistoricalPnlPeriod.values()] as const; +export type HistoricalPnlPeriods = (typeof historicalPnlPeriod)[number]; + +// ------ Transfer Items ------ // +export const TransferInputField = Abacus.exchange.dydx.abacus.state.modal.TransferInputField; +const transferInputFields = [...TransferInputField.values()] as const; +export type TransferInputFields = (typeof transferInputFields)[number]; + +export const TransferType = Abacus.exchange.dydx.abacus.output.input.TransferType; +const transferTypes = [...TransferType.values()] as const; +export type TransferTypes = (typeof transferTypes)[number]; + +// ------ Trade Items ------ // +export const TradeInputField = Abacus.exchange.dydx.abacus.state.modal.TradeInputField; +const tradeInputFields = [...TradeInputField.values()] as const; +export type TradeInputFields = (typeof tradeInputFields)[number]; + +export type TradeState = { + current?: Nullable; + postAllOrders?: Nullable; + postOrder?: Nullable; +}; + +export const ClosePositionInputField = + Abacus.exchange.dydx.abacus.state.modal.ClosePositionInputField; + +const closePositionInputFields = [...ClosePositionInputField.values()] as const; +export type ClosePositionInputFields = (typeof closePositionInputFields)[number]; + +export type ValidationError = Abacus.exchange.dydx.abacus.output.input.ValidationError; +export const TradeInputErrorAction = Abacus.exchange.dydx.abacus.output.input.ErrorAction; +export type AbacusOrderTypes = Abacus.exchange.dydx.abacus.output.input.OrderType; +export type AbacusOrderSides = Abacus.exchange.dydx.abacus.output.input.OrderSide; +export const AbacusOrderType = Abacus.exchange.dydx.abacus.output.input.OrderType; +export const AbacusOrderSide = Abacus.exchange.dydx.abacus.output.input.OrderSide; + +export const AbacusPositionSide = Abacus.exchange.dydx.abacus.output.PositionSide; +export type AbacusPositionSides = Abacus.exchange.dydx.abacus.output.PositionSide; + +export type SubaccountPlaceOrderPayload = + Abacus.exchange.dydx.abacus.state.app.V4SubaccountPlaceOrderPayload2; + +export type SubaccountCancelOrderPayload = + Abacus.exchange.dydx.abacus.state.app.V4SubaccountCancelOrderPayload2; + +export type HumanReadablePlaceOrderPayload = + Abacus.exchange.dydx.abacus.state.manager.HumanReadablePlaceOrderPayload; +export type HumanReadableCancelOrderPayload = + Abacus.exchange.dydx.abacus.state.manager.HumanReadableCancelOrderPayload; + +// ------ Helpers ------ // +export const AbacusHelper = Abacus.exchange.dydx.abacus.utils.AbacusHelper; + +export const RiskLevel = Abacus.exchange.dydx.abacus.utils.RiskLevel; +const riskLevels = [...RiskLevel.values()] as const; +export type RiskLevels = (typeof riskLevels)[number]; + +// ------ Notifications ------ // +export type AbacusNotification = Abacus.exchange.dydx.abacus.output.Notification; + +// ------ Enum Conversions ------ // +type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 + ? A + : B; + +type ReadonlyKeysOf = { + [K in keyof T]: IfEquals<{ [_ in K]: T[K] }, { readonly [_ in K]: T[K] }, K, never>; +}[keyof T]; + +type KotlinIrEnumValues = Exclude, 'Companion' | '$serializer'>; + +export const ORDER_SIDES: Record, OrderSide> = { + [AbacusOrderSide.buy.name]: OrderSide.BUY, + [AbacusOrderSide.sell.name]: OrderSide.SELL, +}; + +export const POSITION_SIDES: Record, PositionSide> = { + [AbacusPositionSide.LONG.name]: PositionSide.Long, + [AbacusPositionSide.SHORT.name]: PositionSide.Short, + [AbacusPositionSide.NONE.name]: PositionSide.None, +}; + +export const HISTORICAL_PNL_PERIODS: Record< + KotlinIrEnumValues, + HistoricalPnlPeriods +> = { + [HistoricalPnlPeriod.Period1d.name]: HistoricalPnlPeriod.Period1d, + [HistoricalPnlPeriod.Period7d.name]: HistoricalPnlPeriod.Period7d, + [HistoricalPnlPeriod.Period30d.name]: HistoricalPnlPeriod.Period30d, + [HistoricalPnlPeriod.Period90d.name]: HistoricalPnlPeriod.Period90d, +}; + +export const ORDER_STATUS_STRINGS: Record, string> = { + [AbacusOrderStatus.open.name]: STRING_KEYS.OPEN_STATUS, + [AbacusOrderStatus.partiallyFilled.name]: STRING_KEYS.PARTIALLY_FILLED, + [AbacusOrderStatus.filled.name]: STRING_KEYS.ORDER_FILLED, + [AbacusOrderStatus.cancelled.name]: STRING_KEYS.CANCELED, + [AbacusOrderStatus.canceling.name]: STRING_KEYS.CANCELING, + [AbacusOrderStatus.pending.name]: STRING_KEYS.PENDING, + [AbacusOrderStatus.untriggered.name]: STRING_KEYS.UNTRIGGERED, +}; + +export const TRADE_TYPES: Record< + KotlinIrEnumValues, + Nullable +> = { + [AbacusOrderType.limit.name]: TradeTypes.LIMIT, + [AbacusOrderType.market.name]: TradeTypes.MARKET, + [AbacusOrderType.stopLimit.name]: TradeTypes.STOP_LIMIT, + [AbacusOrderType.stopMarket.name]: TradeTypes.STOP_MARKET, + [AbacusOrderType.takeProfitLimit.name]: TradeTypes.TAKE_PROFIT, + [AbacusOrderType.takeProfitMarket.name]: TradeTypes.TAKE_PROFIT_MARKET, + + [AbacusOrderType.liquidated.name]: null, + [AbacusOrderType.liquidation.name]: null, + [AbacusOrderType.trailingStop.name]: null, +}; diff --git a/src/constants/account.ts b/src/constants/account.ts new file mode 100644 index 0000000..f8f911e --- /dev/null +++ b/src/constants/account.ts @@ -0,0 +1,62 @@ +/** + * OnboardingSteps + * 1. Choose between 3 options + * a. Ethereum EOA (current) + * b. Keplr or Other Cosmos (future) + * c. Social (future) + * 2. Key derivation + * a. If wallet has no dYdX Chain transactions and not on whitelist, sign twice (future) + * i. Success + * ii. Signatures don't match error (Wallet is non-deterministic) + * b. Success + * 3. Post Registration items (Only on first onboarding) + * a. Acknowledge Terms + * b. DepositFunds + */ +export enum OnboardingSteps { + ChooseWallet = 'ChooseWallet', + KeyDerivation = 'KeyDerivation', + AcknowledgeTerms = 'AcknowledgeTerms', + DepositFunds = 'DepositFunds', +} + +/** + * @description The three main OnboardingStates, + * - Disconnected + * - WalletConnected + * - AccountConnected + */ +export enum OnboardingState { + Disconnected = 'Disconnected', + WalletConnected = 'WalletConnected', + AccountConnected = 'AccountConnected', +} + +/** + * @description Guards to determine what onboarding step a user should be on + * - hasAcknowledgedTerms + * - hasPreviousTransactions + */ +export enum OnboardingGuard { + hasAcknowledgedTerms = 'hasAcknowledgedTerms', + hasPreviousTransactions = 'hasPreviousTransactions', +} + +export enum EvmDerivedAccountStatus { + NotDerived, + Deriving, + EnsuringDeterminism, + Derived, +} + +import type { DydxAddress, EvmAddress } from './wallets'; + +export type EvmDerivedAddresses = { + version?: string; + [EvmAddress: EvmAddress]: { + encryptedSignature?: string; + dydxAddress?: DydxAddress; + }; +} + +export const AMOUNT_RESERVED_FOR_GAS_USDC = 100_000; \ No newline at end of file diff --git a/src/constants/alerts.ts b/src/constants/alerts.ts new file mode 100644 index 0000000..f6ff882 --- /dev/null +++ b/src/constants/alerts.ts @@ -0,0 +1,6 @@ +export enum AlertType { + Error = 'Error', + Info = 'Info', + Success = 'Success', + Warning = 'Warning', +} diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts new file mode 100644 index 0000000..121d6e5 --- /dev/null +++ b/src/constants/analytics.ts @@ -0,0 +1,163 @@ +import type { SupportedLocales } from './localization'; +import type { DydxNetwork } from './networks'; +import type { OnboardingState, OnboardingSteps } from './account'; +import type { DydxAddress, WalletType, WalletConnectionType, EvmAddress } from './wallets'; +import type { DialogTypes } from './dialogs'; +import type { TradeTypes } from './trade'; +import type { AbacusApiStatus, HumanReadablePlaceOrderPayload } from './abacus'; + +// User properties +export enum AnalyticsUserProperty { + // Environment + Locale = 'selectedLocale', + Breakpoint = 'breakpoint', + + // Network + Network = 'network', + + // Wallet + WalletType = 'walletType', + WalletConnectionType = 'walletConnectionType', + WalletAddress = 'walletAddress', + + // Account + DydxAddress = 'dydxAddress', + SubaccountNumber = 'subaccountNumber', +} + +export type AnalyticsUserPropertyValue = + // Environment + T extends AnalyticsUserProperty.Breakpoint + ? 'MOBILE' | 'TABLET' | 'DESKTOP_SMALL' | 'DESKTOP_MEDIUM' | 'DESKTOP_LARGE' | 'UNSUPPORTED' + : T extends AnalyticsUserProperty.Locale + ? SupportedLocales + : // Network + T extends AnalyticsUserProperty.Network + ? DydxNetwork + : // Wallet + T extends AnalyticsUserProperty.WalletType + ? WalletType | undefined + : T extends AnalyticsUserProperty.WalletConnectionType + ? WalletConnectionType | undefined + : T extends AnalyticsUserProperty.WalletAddress + ? EvmAddress | DydxAddress | undefined + : // Account + T extends AnalyticsUserProperty.DydxAddress + ? DydxAddress | undefined + : T extends AnalyticsUserProperty.SubaccountNumber + ? number | undefined + : undefined; + +// Events +export enum AnalyticsEvent { + // App + AppStart = 'AppStart', + NetworkStatus = 'NetworkStatus', + + // Navigation + NavigatePage = 'NavigatePage', + NavigateDialog = 'NavigateDialog', + NavigateDialogClose = 'NavigateDialogClose', + NavigateExternal = 'NavigateExternal', + + // Wallet + ConnectWallet = 'ConnectWallet', + DisconnectWallet = 'DisconnectWallet', + + // Onboarding + OnboardingStepChanged = 'OnboardingStepChanged', + OnboardingAccountDerived = 'OnboardingAccountDerived', + OnboardingWalletIsNonDeterministic = 'OnboardingWalletIsNonDeterministic', + + // Transfers + TransferFaucet = 'TransferFaucet', + TransferDeposit = 'TransferDeposit', + TransferWithdraw = 'TransferWithdraw', + + // Trading + TradeOrderTypeSelected = 'TradeOrderTypeSelected', + TradePlaceOrder = 'TradePlaceOrder', + TradePlaceOrderConfirmed = 'TradePlaceOrderConfirmed', + TradeCancelOrderConfirmed = 'TradeCancelOrderConfirmed', +} + +export type AnalyticsEventData = + // App + T extends AnalyticsEvent.AppStart + ? {} + : T extends AnalyticsEvent.NetworkStatus + ? { + status: (typeof AbacusApiStatus)['name']; + /** Last time indexer node was queried successfully */ + lastSuccessfulIndexerRpcQuery?: number; + /** Time elapsed since indexer node was queried successfully */ + elapsedTime?: number; + blockHeight?: number; + indexerBlockHeight?: number; + } + : // Navigation + T extends AnalyticsEvent.NavigatePage + ? { + path: string; + } + : T extends AnalyticsEvent.NavigateDialog + ? { + type: DialogTypes; + } + : T extends AnalyticsEvent.NavigateDialogClose + ? { + type: DialogTypes; + } + : T extends AnalyticsEvent.NavigateExternal + ? { + link: string; + } + : // Wallet + T extends AnalyticsEvent.ConnectWallet + ? { + walletType: WalletType; + walletConnectionType: WalletConnectionType; + } + : T extends AnalyticsEvent.DisconnectWallet + ? {} + : // Onboarding + T extends AnalyticsEvent.OnboardingStepChanged + ? { + state: OnboardingState; + step?: OnboardingSteps; + } + : T extends AnalyticsEvent.OnboardingAccountDerived + ? { + hasPreviousTransactions: boolean; + } + : // Transfers + T extends AnalyticsEvent.TransferFaucet + ? {} + : T extends AnalyticsEvent.TransferDeposit + ? {} + : T extends AnalyticsEvent.TransferWithdraw + ? {} + : // Trading + T extends AnalyticsEvent.TradeOrderTypeSelected + ? { + type: TradeTypes; + } + : T extends AnalyticsEvent.TradePlaceOrder + ? HumanReadablePlaceOrderPayload & { + isClosePosition: boolean; + } + : T extends AnalyticsEvent.TradePlaceOrderConfirmed + ? { + /** roundtrip time between user placing an order and confirmation from indexer (client → validator → indexer → client) */ + roundtripMs: number; + /** URL/IP of node the order was sent to */ + validator: string; + } + : T extends AnalyticsEvent.TradeCancelOrderConfirmed + ? { + /** roundtrip time between user canceling an order and confirmation from indexer (client → validator → indexer → client) */ + roundtripMs: number; + /** URL/IP of node the order was sent to */ + validator: string; + } + : never; diff --git a/src/constants/buttons.ts b/src/constants/buttons.ts new file mode 100644 index 0000000..ea8fab1 --- /dev/null +++ b/src/constants/buttons.ts @@ -0,0 +1,38 @@ +export enum ButtonType { + Button = 'button', + Submit = 'submit', + Link = 'link', + Reset = 'reset', +} + +export enum ButtonSize { + XSmall = 'XSmall', + Small = 'Small', + Base = 'Base', + Medium = 'Medium', + Large = 'Large', + XLarge = 'XLarge', +} + +export enum ButtonShape { + Circle = 'Circle', + Pill = 'Pill', + Rectangle = 'Rectangle', + Square = 'Square', +} + +export enum ButtonAction { + Base = 'Base', + Primary = 'Primary', + Secondary = 'Secondary', + Create = 'Create', + Destroy = 'Destroy', + Navigation = 'Navigation', + Reset = 'Reset', +} + +export enum ButtonState { + Default = 'Default', + Disabled = 'Disabled', + Loading = 'Loading', +} diff --git a/src/constants/candles.ts b/src/constants/candles.ts new file mode 100644 index 0000000..5844754 --- /dev/null +++ b/src/constants/candles.ts @@ -0,0 +1,74 @@ +import { ResolutionString } from 'public/tradingview/charting_library'; +import { timeUnits } from './time'; + +export interface Candle { + startedAt: string; + ticker: string; + resolution: CandleResolution; + low: string; + high: string; + open: string; + close: string; + baseTokenVolume: string; + usdVolume: string; + trades: number; + startingOpenInterest: string; +} + +export interface TradingViewBar { + time: number; + low: number; + high: number; + open: number; + close: number; + volume: number; +} + +export interface TradingViewSymbol { + description: string; + exchange: string; + full_name: string; + symbol: string; + type: string; +} + +/** + * @description Resolution values used with Indexer API's Candles endpoints + */ +export enum CandleResolution { + ONE_MINUTE = '1MIN', + FIVE_MINUTES = '5MINS', + FIFTEEN_MINUTES = '15MINS', + THIRTY_MINUTES = '30MINS', + ONE_HOUR = '1HOUR', + FOUR_HOURS = '4HOURS', + ONE_DAY = '1DAY', +} + +/** + * @description ResolutionStrings used with TradingView's charting library mapped to CandleResolution + */ +export const RESOLUTION_MAP = { + '1': CandleResolution.ONE_MINUTE, + '5': CandleResolution.FIVE_MINUTES, + '15': CandleResolution.FIFTEEN_MINUTES, + '30': CandleResolution.THIRTY_MINUTES, + '60': CandleResolution.ONE_HOUR, + '240': CandleResolution.FOUR_HOURS, + '1D': CandleResolution.ONE_DAY, +} as Record; + +export const DEFAULT_RESOLUTION = '1D'; + +/** + * @description Chart Configs mapped to ResolutionStrings + */ +export const RESOLUTION_CHART_CONFIGS = { + '1': { defaultRange: timeUnits.hour }, + '5': { defaultRange: 5 * timeUnits.hour }, + '15': { defaultRange: 15 * timeUnits.hour }, + '30': { defaultRange: 30 * timeUnits.hour }, + '60': { defaultRange: 3 * timeUnits.day }, + '240': { defaultRange: 12 * timeUnits.day }, + '1D': { defaultRange: 2 * timeUnits.month }, +} as Record; diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts new file mode 100644 index 0000000..ed20d3f --- /dev/null +++ b/src/constants/dialogs.ts @@ -0,0 +1,20 @@ +export enum DialogTypes { + ClosePosition = 'ClosePosition', + Deposit = 'Deposit', + DisconnectWallet = 'DisconnectWallet', + ExchangeOffline = 'ExchangeOffline', + FillDetails = 'FillDetails', + Help = 'Help', + MnemonicExport = 'MnemonicExport', + MobileSignIn = 'MobileSignIn', + Onboarding = 'Onboarding', + OrderDetails = 'OrderDetails', + Receive = 'Receive', + Trade = 'Trade', + Transfer = 'Transfer', + Withdraw = 'Withdraw', +} + +export enum TradeBoxDialogTypes { + ClosePosition = 'ClosePosition', +} diff --git a/src/constants/layout.ts b/src/constants/layout.ts new file mode 100644 index 0000000..925bedc --- /dev/null +++ b/src/constants/layout.ts @@ -0,0 +1,5 @@ +export enum TradeLayouts { + Default = 'Default', + Reverse = 'Reverse', + Alternative = 'Alternative', +} diff --git a/src/constants/localStorage.ts b/src/constants/localStorage.ts new file mode 100644 index 0000000..03f9f80 --- /dev/null +++ b/src/constants/localStorage.ts @@ -0,0 +1,29 @@ +export enum LocalStorageKey { + // Onboarding / Accounts + EvmAddress = 'dydx.EvmAddress', + DydxAddress = 'dydx.DydxAddress', + OnboardingSelectedWalletType = 'dydx.OnboardingSelectedWalletType', + WalletConnectionType = 'dydx.WalletConnectionType', + OnboardingHasAcknowledgedTerms = 'dydx.OnboardingHasAcknowledgedTerms', + EvmDerivedAddresses = 'dydx.EvmDerivedAddresses', + + // Notifications + Notifications = 'dydx.Notifications', + NotificationsLastUpdated = 'dydx.NotificationsLastUpdated', + PushNotificationsEnabled = 'dydx.PushNotificationsEnabled', + PushNotificationsLastUpdated = 'dydx.PushNotificationsLastUpdated', + TransferNotifications = 'dydx.TransferNotifications', + + // UI State + LastViewedMarket = 'dydx.LastViewedMarket', + SelectedLocale = 'dydx.SelectedLocale', + SelectedNetwork = 'dydx.SelectedNetwork', + SelectedTheme = 'dydx.SelectedTheme', + SelectedTradeLayout = 'dydx.SelectedTradeLayout', + TradingViewChartConfig = 'dydx.TradingViewChartConfig', +} + +export const LOCAL_STORAGE_VERSIONS = { + [LocalStorageKey.EvmDerivedAddresses]: 'v1', + // TODO: version all localStorage keys +}; diff --git a/src/constants/localization.ts b/src/constants/localization.ts new file mode 100644 index 0000000..dc8e05a --- /dev/null +++ b/src/constants/localization.ts @@ -0,0 +1,106 @@ +import { ReactNode } from 'react'; + +import { + APP_STRING_KEYS, + ERRORS_STRING_KEYS, + LOCALE_DATA, + TOOLTIPS, + WARNINGS_STRING_KEYS, +} from '@dydxprotocol/v4-localization'; + +export { TOOLTIP_STRING_KEYS } from '@dydxprotocol/v4-localization'; + +export enum SupportedLocales { + EN = 'en', + ZH_CN = 'zh-CN', + JA = 'ja', + KO = 'ko', + RU = 'ru', + TR = 'tr', + FR = 'fr', + PT = 'pt', + ES = 'es', + DE = 'de', +} + +export const EN_LOCALE_DATA = { + ...LOCALE_DATA[SupportedLocales.EN], + TOOLTIPS: TOOLTIPS[SupportedLocales.EN], +}; + +export const STRING_KEYS = { + ...APP_STRING_KEYS, + ...ERRORS_STRING_KEYS, + ...WARNINGS_STRING_KEYS, +}; + +export type StringKey = keyof typeof STRING_KEYS; + +export type LocaleData = typeof EN_LOCALE_DATA; + +export type StringGetterFunction = (a: { + key: string; + params?: { + [key: string]: ReactNode; + }; +}) => string; + +export const SUPPORTED_LOCALE_STRING_LABELS: { [key in SupportedLocales]: string } = { + [SupportedLocales.EN]: 'English', + [SupportedLocales.ZH_CN]: '中文', + [SupportedLocales.JA]: '日本語', + [SupportedLocales.KO]: '한국어', + [SupportedLocales.RU]: 'русский', + [SupportedLocales.TR]: 'Türkçe', + [SupportedLocales.FR]: 'Français', + [SupportedLocales.PT]: 'Português', + [SupportedLocales.ES]: 'Español', + [SupportedLocales.DE]: 'Deutsch', +}; + +export const SUPPORTED_LOCALE_BASE_TAGS = { + [SupportedLocales.EN]: 'en', + [SupportedLocales.ZH_CN]: 'zh', + [SupportedLocales.JA]: 'ja', + [SupportedLocales.KO]: 'ko', + [SupportedLocales.RU]: 'ru', + [SupportedLocales.TR]: 'tr', + [SupportedLocales.FR]: 'fr', + [SupportedLocales.PT]: 'pt', + [SupportedLocales.ES]: 'es', + [SupportedLocales.DE]: 'de', +}; + +export const SUPPORTED_BASE_TAGS_LOCALE_MAPPING = Object.fromEntries( + Object.entries(SUPPORTED_LOCALE_BASE_TAGS).map(([locale, baseTag]) => [baseTag, locale]) +); + +export type TooltipStrings = { + [key: string]: ({ + stringGetter, + stringParams, + }: { + stringGetter: StringGetterFunction; + stringParams?: any; + }) => { + title: string; + body: string; + learnMoreLink?: string; + }; +}; + +export const ORDER_ERROR_CODE_MAP: { [key: number]: string } = { + 2000: STRING_KEYS['2000_FILL_OR_KILL_ORDER_COULD_NOT_BE_FULLY_FILLED'], + 2001: STRING_KEYS['2001_REDUCE_ONLY_WOULD_INCREASE_POSITION_SIZE'], + 2002: STRING_KEYS['2002_REDUCE_ONLY_WOULD_CHANGE_POSITION_SIDE'], + 2003: STRING_KEYS['2003_POST_ONLY_WOULD_CROSS_MAKER_ORDER'], + 3000: STRING_KEYS['3000_INVALID_ORDER_FLAGS'], + 3001: STRING_KEYS['3001_INVALID_STATEFUL_ORDER_GOOD_TIL_BLOCK_TIME'], + 3002: STRING_KEYS['3002_STATEFUL_ORDERS_CANNOT_REQUIRE_IMMEDIATE_EXECUTION'], + 3003: STRING_KEYS['3003_TIME_EXCEEDS_GOOD_TIL_BLOCK_TIME'], + 3004: STRING_KEYS['3004_GOOD_TIL_BLOCK_TIME_EXCEEDS_STATEFUL_ORDER_TIME_WINDOW'], + 3005: STRING_KEYS['3005_STATEFUL_ORDER_ALREADY_EXISTS'], + 3006: STRING_KEYS['3006_STATEFUL_ORDER_DOES_NOT_EXIST'], + 3007: STRING_KEYS['3007_STATEFUL_ORDER_COLLATERALIZATION_CHECK_FAILED'], + 3008: STRING_KEYS['3008_STATEFUL_ORDER_PREVIOUSLY_CANCELLED'], +}; diff --git a/src/constants/markets.ts b/src/constants/markets.ts new file mode 100644 index 0000000..edb44f9 --- /dev/null +++ b/src/constants/markets.ts @@ -0,0 +1,28 @@ +import { Asset, PerpetualMarket } from '@/constants/abacus'; +import { STRING_KEYS } from '@/constants/localization'; + +export type MarketData = { + asset: Asset; + tickSizeDecimals: number; +} & PerpetualMarket & + PerpetualMarket['perpetual'] & + PerpetualMarket['configs']; + +export enum MarketFilters { + ALL = 'all', + LAYER_1 = 'Layer 1', + DEFI = 'Defi', +} + +export const MARKET_FILTER_LABELS = { + [MarketFilters.ALL]: STRING_KEYS.ALL, + [MarketFilters.LAYER_1]: STRING_KEYS.LAYER_1, + [MarketFilters.DEFI]: STRING_KEYS.DEFI, +}; + +export const DEFAULT_MARKETID = 'ETH-USD'; + +export enum FundingDirection { + ToShort = 'ToShort', + ToLong = 'ToLong', +} diff --git a/src/constants/menus.ts b/src/constants/menus.ts new file mode 100644 index 0000000..b350873 --- /dev/null +++ b/src/constants/menus.ts @@ -0,0 +1,37 @@ +import type React from 'react'; + +export type MenuConfig< + MenuItemValue extends string | number, + MenuGroupValue extends string | number, + MenuItemTypes extends string | number = string | number +> = MenuGroup[]; + +export type MenuGroup< + MenuItemValue extends string | number, + MenuGroupValue extends string | number, + MenuItemTypes extends string | number = string | number +> = { + group: MenuGroupValue; + groupLabel?: string; + items: MenuItem[]; +}; + +export type MenuItem = { + type?: MenuItemTypes; + value: MenuItemValue; + + slotBefore?: React.ReactNode; + label: string; + labelRight?: React.ReactNode; + tag?: React.ReactNode; + slotAfter?: React.ReactNode; + description?: string; + + href?: string; + onSelect?: (key: MenuItemValue) => void; + onClick?: () => void; + + disabled?: boolean; + + subitems?: MenuItem[]; +}; diff --git a/src/constants/mockData.ts b/src/constants/mockData.ts new file mode 100644 index 0000000..2e07d40 --- /dev/null +++ b/src/constants/mockData.ts @@ -0,0 +1,35 @@ +// Mock data for offline testing + +import type { MarketHistoricalFunding } from './abacus'; +import { timeUnits } from './time'; + +export const mockHistoricalFundingData = Array.from( + { length: 100 }, + (_, i) => + ({ + effectiveAtMilliseconds: + timeUnits.hour * Math.floor(Date.now() / timeUnits.hour) - (100 - i - 1) * timeUnits.hour, + rate: (Math.random() - 0.5) * 0.0001, + } as MarketHistoricalFunding) +); + +export const mockSubaccountPnlData = Array.from({ length: 3000 }, (_, i) => { + const j = 3000 - i - 1; + const netTransfers = 2000 + Math.floor(i / 150) * 1500 - Math.floor(i / 400) * 2500; + + const equity = + (Math.random() - 0.5) * 400 + + Math.sin(i * 0.5) * 200 + + Math.sin(i * 0.08) * Math.cos(i * 0.18) * 500; + + const totalPnl = netTransfers + equity; + + return { + id: i, + subaccountId: 0, + equity, + totalPnl, + netTransfers, + createdAt: j ? timeUnits.hour * (Math.floor(Date.now() / timeUnits.hour) - j) : Date.now(), + }; +}); diff --git a/src/constants/networks.tsx b/src/constants/networks.tsx new file mode 100644 index 0000000..7861da6 --- /dev/null +++ b/src/constants/networks.tsx @@ -0,0 +1,29 @@ +import { ENDPOINTS, DEV_ENDPOINTS } from '@dydxprotocol/v4-localization'; + +export const NETWORK_ENDPOINTS = import.meta.env.MODE === 'production' ? ENDPOINTS : DEV_ENDPOINTS; + +export const CLIENT_NETWORK_CONFIGS: Record< + string, + (typeof NETWORK_ENDPOINTS.environments)[number] +> = Object.fromEntries( + NETWORK_ENDPOINTS.environments.map((environment) => [environment.environment, environment]) +); + +export const DEFAULT_APP_ENVIRONMENT = NETWORK_ENDPOINTS.defaultEnvironment; + +export enum DydxV4Network { + V4Mainnet = 'dydxprotocol-mainnet', + V4Staging = 'dydxprotocol-staging', + V4Testnet2 = 'dydxprotocol-testnet', + V4Local = 'dydxprotocol-dev', +} + +export type DydxNetwork = keyof typeof CLIENT_NETWORK_CONFIGS; + +export function isDydxV4Network(network: any): boolean { + return CLIENT_NETWORK_CONFIGS[network]?.version === 'v4'; +} + +export function isValidDydxNetwork(network: any): boolean { + return Object.keys(CLIENT_NETWORK_CONFIGS).includes(network); +} diff --git a/src/constants/notifications.ts b/src/constants/notifications.ts new file mode 100644 index 0000000..5695617 --- /dev/null +++ b/src/constants/notifications.ts @@ -0,0 +1,126 @@ +import { StatusResponse } from "@0xsquid/sdk"; + +/** implemented in useNotificationTypes */ +export enum NotificationType { + OrderStatusChanged = 'OrderStatusChanged', + SquidTransfer = 'SquidTransfer', +} + +export enum NotificationComponentType {} + +export type NotificationId = string | number; + +export type NotificationTypeConfig< + _NotificationId extends NotificationId = string, + NotificationUpdateKey = any +> = { + type: NotificationType; + + /** React hook to trigger notifications based on app state */ + useTrigger: (_: { + trigger: ( + /** Unique ID for the triggered notification */ + id: _NotificationId, + + /** Display data for the triggered notification */ + displayData: NotificationDisplayData, + + /** + * JSON-serializable key. + * Re-triggers the notification if passed a different value from the last trigger() call (even from a previous browser session). + * Suggested usage: data dependency array + */ + updateKey?: NotificationUpdateKey, + + /** + * @param true (default): Notification initialized with status NotificationStatus.Triggered + * @param false: Notification initialized with status NotificationStatus.Cleared + */ + isNew?: boolean + ) => void; + + lastUpdated: number; + }) => void; + + /** Callback for notification action (Toast action button click, NotificationsMenu item click, or native push notification interaction) */ + useNotificationAction?: () => (id: _NotificationId) => any; +}; + +export enum NotificationStatus { + /** Notification triggered for the first time. Toast timer started. "New" in NotificationsMenu. */ + Triggered, + + /** Notification re-triggered with a different NotificationUpdateKey. Toast timer restarted. "New" in NotificationsMenu. */ + Updated, + + /** Toast timer expired without user interaction. "New" in NotificationsMenu. */ + Unseen, + + /** Toast or NotificationsMenu item interacted with or dismissed. "Seen" in NotificationsMenu. */ + Seen, + + /** Notification marked for deletion. "Archived" in NotificationsMenu. */ + Cleared, +} + +/** Notification state. Serialized and cached into localStorage. */ +export type Notification< + _NotificationId extends NotificationId = string, + NotificationUpdateKey = any +> = { + id: _NotificationId; + type: NotificationType; + status: NotificationStatus; + timestamps: Partial>; + updateKey: NotificationUpdateKey; +}; + +export type Notifications = Record>; + +/** Notification display data derived from app state at runtime. */ +export type NotificationDisplayData = { + icon?: React.ReactNode; + + title?: string; + + description?: React.ReactNode; + + customContent?: React.ReactNode; + + customMenuContent?: React.ReactNode; + + actionDescription?: string; + + /** Screen reader: instructions for performing toast action after its timer expires */ + actionAltText?: string; + + /** + * @param foreground + Screen reader: announces immediately. + Push notification: vibrates device. + * @param background + Screen reader: announces at the next graceful opportunity. + Push notification: no vibration. + */ + toastSensitivity?: 'foreground' | 'background'; + + /** + * @param number + Radix UI Toast: automatically Unseen. + Push notification: requires interaction. + * @param Infinity + Radix UI Toast: no timer. + Push notification: requires interaction. + */ + toastDuration?: number; +}; + +// Notification types +export type TransferNotifcation = { + txHash: string; + toChainId?: string; + fromChainId?: string; + toAmount?: number; + triggeredAt?: number; + status?: StatusResponse; +}; diff --git a/src/constants/numbers.ts b/src/constants/numbers.ts new file mode 100644 index 0000000..8a28f00 --- /dev/null +++ b/src/constants/numbers.ts @@ -0,0 +1,22 @@ +import { getSeparator } from '@/lib/numbers'; + +export const USD_DECIMALS = 2; +export const SMALL_USD_DECIMALS = 4; + +export const PERCENT_DECIMALS = 2; +export const SMALL_PERCENT_DECIMALS = 4; +export const TINY_PERCENT_DECIMALS = 6; + +export const INTEGER_DECIMALS = 0; +export const LEVERAGE_DECIMALS = 2; +export const TOKEN_DECIMALS = 4; +export const LARGE_TOKEN_DECIMALS = 2; +export const FEE_DECIMALS = 3; + +export const QUANTUM_MULTIPLIER = 1_000_000; + +export enum NumberSign { + Positive = 'Positive', + Negative = 'Negative', + Neutral = 'Neutral', +} diff --git a/src/constants/page.ts b/src/constants/page.ts new file mode 100644 index 0000000..b3dc20f --- /dev/null +++ b/src/constants/page.ts @@ -0,0 +1,13 @@ +export const BREAKPOINT_REM = { + mobile: '48rem', + tablet: '64rem', + desktopSmall: '80rem', + desktopMedium: '90rem', + desktopLarge: '120rem', +}; + +export const PAGE_REM = { + maxContentWidth: '80rem', + collapsedSidebarWidth: '3.5rem', + sidebarWidth: '20.25rem', +}; diff --git a/src/constants/routes.ts b/src/constants/routes.ts new file mode 100644 index 0000000..1aaa95b --- /dev/null +++ b/src/constants/routes.ts @@ -0,0 +1,42 @@ +import { DEFAULT_MARKETID } from './markets'; + +export enum AppRoute { + Markets = '/markets', + Portfolio = '/portfolio', + Trade = '/trade', + Profile = '/profile', + Alerts = '/alerts', + Settings = '/settings', + Rewards = '/DV4TNT', +} + +export enum PortfolioRoute { + Fees = 'fees', + History = 'history', + Orders = 'orders', + Overview = 'overview', + Positions = 'positions', +} + +export enum HistoryRoute { + Trades = 'trades', + Transfers = 'transfers', + Payments = 'payments', +} + +export enum MobileSettingsRoute { + Language = 'language', + Notifications = 'notifications', + Network = 'network', +} + +export const TRADE_ROUTE = `${AppRoute.Trade}/:market`; +export const PORTFOLIO_ROUTE = `${AppRoute.Portfolio}/:subroute`; +export const HISTORY_ROUTE = `${AppRoute.Portfolio}/${PortfolioRoute.History}/:subroute`; +export const DEFAULT_TRADE_ROUTE = `${AppRoute.Trade}/${DEFAULT_MARKETID}`; +export const SETTINGS_ROUTE = `${AppRoute.Settings}/*`; +export const DEFAULT_DOCUMENT_TITLE = 'dYdX'; + +export enum ExternalLink { + Foundation = 'https://dydx.foundation', +} diff --git a/src/constants/time.ts b/src/constants/time.ts new file mode 100644 index 0000000..867725e --- /dev/null +++ b/src/constants/time.ts @@ -0,0 +1,40 @@ +export enum TimeUnit { + Day = 'Day', + Hour = 'Hour', + Minute = 'Minute', + Second = 'Second', +} + +// Good Til Time Timescales +export enum TimeUnitShort { + Minutes = 'M', + Hours = 'H', + Days = 'D', + Weeks = 'W', +} + +export const timeUnits = { + year: 31536000000, + month: 2628000000, + week: 604800000, + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000, +} satisfies Partial>; + +export const smallTimeUnits = { + decisecond: 100, + centisecond: 10, + millisecond: 1, +} satisfies Partial>; + +export const otherTimeUnits = { + threeDays: 3 * timeUnits.day, +} satisfies Partial>; + +export const allTimeUnits = { + ...timeUnits, + ...smallTimeUnits, + ...otherTimeUnits, +}; diff --git a/src/constants/tooltips/deposit.ts b/src/constants/tooltips/deposit.ts new file mode 100644 index 0000000..a358def --- /dev/null +++ b/src/constants/tooltips/deposit.ts @@ -0,0 +1,8 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const depositTooltips: TooltipStrings = { + swap: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.SWAP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.SWAP_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/general.ts b/src/constants/tooltips/general.ts new file mode 100644 index 0000000..9da6b45 --- /dev/null +++ b/src/constants/tooltips/general.ts @@ -0,0 +1,12 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const generalTooltips: TooltipStrings = { + 'legacy-signing': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LEGACY_SIGNING_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LEGACY_SIGNING_BODY }), + }), + 'remember-me': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REMEMBER_ME_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REMEMBER_ME_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/index.ts b/src/constants/tooltips/index.ts new file mode 100644 index 0000000..d36075c --- /dev/null +++ b/src/constants/tooltips/index.ts @@ -0,0 +1,15 @@ +import type { TooltipStrings } from '@/constants/localization'; + +import { depositTooltips } from './deposit'; +import { generalTooltips } from './general'; +import { portfolioTooltips } from './portfolio'; +import { tradeTooltips } from './trade'; +import { withdrawTooltips } from './withdraw'; + +export const tooltipStrings: TooltipStrings = { + ...depositTooltips, + ...generalTooltips, + ...portfolioTooltips, + ...tradeTooltips, + ...withdrawTooltips, +} as const; diff --git a/src/constants/tooltips/portfolio.ts b/src/constants/tooltips/portfolio.ts new file mode 100644 index 0000000..b995f40 --- /dev/null +++ b/src/constants/tooltips/portfolio.ts @@ -0,0 +1,8 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const portfolioTooltips: TooltipStrings = { + 'holding-hedgies': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.HOLDING_HEDGIES_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.HOLDING_HEDGIES_BODY, params: stringParams }), + }), +} as const; diff --git a/src/constants/tooltips/trade.ts b/src/constants/tooltips/trade.ts new file mode 100644 index 0000000..d2beee4 --- /dev/null +++ b/src/constants/tooltips/trade.ts @@ -0,0 +1,178 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const tradeTooltips: TooltipStrings = { + 'account-leverage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ACCOUNT_LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ACCOUNT_LEVERAGE_BODY }), + }), + 'bracket-sl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_SL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_SL_BODY }), + }), + 'bracket-tp': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_TP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_TP_BODY }), + }), + 'buying-power': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BUYING_POWER_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BUYING_POWER_BODY, params: stringParams }), + }), + 'default-execution': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.DEFAULT_EXECUTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.DEFAULT_EXECUTION_BODY }), + }), + equity: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.EQUITY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.EQUITY_BODY }), + }), + 'expected-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.EXPECTED_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.EXPECTED_PRICE_BODY }), + }), + fee: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FEE_BODY }), + }), + 'fill-or-kill': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FILL_OR_KILL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FILL_OR_KILL_BODY }), + }), + 'free-collateral': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FREE_COLLATERAL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FREE_COLLATERAL_BODY }), + }), + 'good-til': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.GOOD_TIL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.GOOD_TIL_BODY }), + }), + 'immediate-or-cancel': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.IMMEDIATE_OR_CANCEL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.IMMEDIATE_OR_CANCEL_BODY }), + }), + 'index-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INDEX_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INDEX_PRICE_BODY }), + }), + 'initial-margin-fraction': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_MARGIN_FRACTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_MARGIN_FRACTION_BODY }), + learnMoreLink: 'https://help.dydx.exchange/articles/5232637-maximum-position-sizes', + }), + 'initial-stop': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_STOP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_STOP_BODY }), + }), + leverage: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LEVERAGE_BODY }), + }), + 'limit-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_BODY }), + }), + 'limit-price-slippage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_SLIPPAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_SLIPPAGE_BODY }), + }), + 'liquidation-price': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_BODY, params: stringParams }), + }), + 'liquidation-price-general': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_GENERAL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_GENERAL_BODY }), + }), + liquidity: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDITY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDITY_BODY }), + }), + 'maintenance-margin-fraction': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_BODY }), + }), + 'max-withdraw': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_BODY }), + }), + 'maker-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAKER_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAKER_FEE_BODY }), + }), + 'margin-usage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MARGIN_USAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MARGIN_USAGE_BODY }), + }), + 'maximum-leverage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_LEVERAGE_BODY }), + }), + 'net-funding': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.NET_FUNDING_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.NET_FUNDING_BODY }), + }), + 'open-interest': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.OPEN_INTEREST_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.OPEN_INTEREST_BODY }), + }), + 'oracle-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORACLE_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORACLE_PRICE_BODY }), + }), + 'order-amount': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_BODY, params: stringParams }), + }), + 'order-amount-usd': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_USD_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_USD_BODY, params: stringParams }), + }), + 'post-only': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.POST_ONLY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.POST_ONLY_BODY }), + }), + 'price-impact': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.PRICE_IMPACT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.PRICE_IMPACT_BODY }), + }), + 'realized-pnl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REALIZED_PNL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REALIZED_PNL_BODY }), + }), + 'reduce-only': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REDUCE_ONLY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REDUCE_ONLY_BODY }), + learnMoreLink: 'https://help.dydx.exchange/articles/6345793-reduce-only-orders', + }), + spread: () => ({ + title: 'Spread', + body: 'The difference in price between the highest bid (the price a buyer is willing to buy for) and lowest ask (the price a seller is willing to sell for) an asset.', + }), + 'step-size': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.STEP_SIZE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.STEP_SIZE_BODY }), + }), + 'taker-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TAKER_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TAKER_FEE_BODY }), + }), + 'tick-size': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TICK_SIZE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TICK_SIZE_BODY }), + }), + 'time-in-force': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TIME_IN_FORCE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TIME_IN_FORCE_BODY }), + }), + 'trailing-percent': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TRAILING_PERCENT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TRAILING_PERCENT_BODY }), + }), + 'trigger-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TRIGGER_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TRIGGER_PRICE_BODY }), + }), + 'unrealized-pnl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/withdraw.ts b/src/constants/tooltips/withdraw.ts new file mode 100644 index 0000000..4b91aa7 --- /dev/null +++ b/src/constants/tooltips/withdraw.ts @@ -0,0 +1,12 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const withdrawTooltips: TooltipStrings = { + 'fast-withdraw-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FAST_WITHDRAW_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FAST_WITHDRAW_FEE_BODY }), + }), + 'withdraw-types': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.WITHDRAW_TYPES_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.WITHDRAW_TYPES_BODY }), + }), +} as const; diff --git a/src/constants/trade.ts b/src/constants/trade.ts new file mode 100644 index 0000000..e85b7a8 --- /dev/null +++ b/src/constants/trade.ts @@ -0,0 +1,118 @@ +import { OrderSide } from '@dydxprotocol/v4-client-js'; + +import { AlertType } from '@/constants/alerts'; +import { STRING_KEYS } from '@/constants/localization'; +import { TimeUnitShort } from '@/constants/time'; + +// TODO: rename to OrderType +export enum TradeTypes { + MARKET = 'MARKET', + LIMIT = 'LIMIT', + STOP_LIMIT = 'STOP_LIMIT', + STOP_MARKET = 'STOP_MARKET', + TAKE_PROFIT = 'TAKE_PROFIT', + TAKE_PROFIT_MARKET = 'TAKE_PROFIT_MARKET', + TRAILING_STOP = 'TRAILING_STOP', +} + +export enum TimeInForceOptions { + GTT = 'GTT', + FOK = 'FOK', + IOC = 'IOC', +} + +export enum PositionSide { + None = 'NONE', + Long = 'LONG', + Short = 'SHORT', +} + +export const UNCOMMITTED_ORDER_TIMEOUT = 10_000; + +export const ORDER_SIDE_STRINGS = { + [OrderSide.BUY]: STRING_KEYS.BUY, + [OrderSide.SELL]: STRING_KEYS.SELL, +}; + +export const POSITION_SIDE_STRINGS: Record = { + [PositionSide.None]: STRING_KEYS.NONE, + [PositionSide.Long]: STRING_KEYS.LONG_POSITION_SHORT, + [PositionSide.Short]: STRING_KEYS.SHORT_POSITION_SHORT, +}; + +export const TRADE_TYPE_STRINGS: Record< + TradeTypes, + { + tradeTypeKeyShort: string; + tradeTypeKey: string; + descriptionKey: string; + } +> = { + [TradeTypes.LIMIT]: { + tradeTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, + tradeTypeKey: STRING_KEYS.LIMIT_ORDER, + descriptionKey: STRING_KEYS.LIMIT_ORDER_DESCRIPTION, + }, + [TradeTypes.MARKET]: { + tradeTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, + tradeTypeKey: STRING_KEYS.MARKET_ORDER, + descriptionKey: STRING_KEYS.MARKET_ORDER_DESCRIPTION, + }, + [TradeTypes.STOP_LIMIT]: { + tradeTypeKeyShort: STRING_KEYS.STOP_LIMIT, + tradeTypeKey: STRING_KEYS.STOP_LIMIT, + descriptionKey: STRING_KEYS.STOP_LIMIT_DESCRIPTION, + }, + [TradeTypes.STOP_MARKET]: { + tradeTypeKeyShort: STRING_KEYS.STOP_MARKET, + tradeTypeKey: STRING_KEYS.STOP_MARKET, + descriptionKey: STRING_KEYS.STOP_MARKET_DESCRIPTION, + }, + [TradeTypes.TAKE_PROFIT]: { + tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, + tradeTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, + descriptionKey: STRING_KEYS.TAKE_PROFIT_LIMIT_DESCRIPTION, + }, + [TradeTypes.TAKE_PROFIT_MARKET]: { + tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, + tradeTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, + descriptionKey: STRING_KEYS.TAKE_PROFIT_MARKET_DESCRIPTION, + }, + [TradeTypes.TRAILING_STOP]: { + tradeTypeKeyShort: STRING_KEYS.TRAILING_STOP, + tradeTypeKey: STRING_KEYS.TRAILING_STOP, + descriptionKey: STRING_KEYS.TRAILING_STOP_DESCRIPTION, + }, +}; + +export const GOOD_TIL_TIME_TIMESCALE_STRINGS: Record = { + [TimeUnitShort.Minutes]: STRING_KEYS.MINUTES_SHORT, + [TimeUnitShort.Hours]: STRING_KEYS.HOURS, + [TimeUnitShort.Days]: STRING_KEYS.DAYS, + [TimeUnitShort.Weeks]: STRING_KEYS.WEEKS, +}; + +export enum TradeSizeInput { + Leverage = 'size.leverage', + Size = 'size.size', + Usdc = 'size.usdcSize', +} + +export enum TradeBoxKeys { + LimitPrice = 'price.limitPrice', + TrailingPercent = 'price.trailingPercent', + TriggerPrice = 'price.triggerPrice', +} + +export type InputErrorData = { + attached: boolean; + message: string; + type: AlertType; +}; + +export enum MobilePlaceOrderSteps { + EditOrder = 'EditOrder', + PreviewOrder = 'PreviewOrder', + PlacingOrder = 'PlacingOrder', + Confirmation = 'Confirmation', +} diff --git a/src/constants/unicode.ts b/src/constants/unicode.ts new file mode 100644 index 0000000..a655af2 --- /dev/null +++ b/src/constants/unicode.ts @@ -0,0 +1,5 @@ +export const UNICODE = { + MINUS: '\u2212', + PLUS: '\u002b', + ARROW_RIGHT: '\u2192', +}; diff --git a/src/constants/wallets.ts b/src/constants/wallets.ts new file mode 100644 index 0000000..ef0c10f --- /dev/null +++ b/src/constants/wallets.ts @@ -0,0 +1,396 @@ +import type { ExternalProvider } from '@ethersproject/providers'; + +import { STRING_KEYS } from '@/constants/localization'; + +import { + BitkeepIcon, + BitpieIcon, + CloverWalletIcon, + CoinbaseIcon, + Coin98Icon, + GenericWalletIcon, + HuobiIcon, + ImTokenIcon, + KeplrIcon, + MathWalletIcon, + MetaMaskIcon, + RainbowIcon, + TokenPocketIcon, + TrustWalletIcon, + WalletConnectIcon, +} from '@/icons'; + +import { isMetaMask } from '@/lib/wallet/providers'; + +// Wallet connection types + +export enum WalletConnectionType { + CoinbaseWalletSdk = 'coinbaseWalletSdk', + CosmosSigner = 'CosmosSigner', + InjectedEip1193 = 'injectedEip1193', + WalletConnect1 = 'walletConnect1', + WalletConnect2 = 'walletConnect2', +} + +export enum WalletErrorType { + // General + ChainMismatch, + UserCanceled, + + // Non-Deterministic + NonDeterministicWallet, + + // Misc + Unknown, +} + +type WalletConnectionTypeConfig = { + name: string; + wagmiConnectorId?: string; +}; + +export const walletConnectionTypes: Record = { + [WalletConnectionType.CoinbaseWalletSdk]: { + name: 'Coinbase Wallet SDK', + wagmiConnectorId: 'coinbaseWallet', + }, + [WalletConnectionType.InjectedEip1193]: { + name: 'injected EIP-1193 provider', + wagmiConnectorId: 'injected', + }, + [WalletConnectionType.WalletConnect1]: { + name: 'WalletConnect 1.0', + wagmiConnectorId: 'walletConnectLegacy', + }, + [WalletConnectionType.WalletConnect2]: { + name: 'WalletConnect 2.0', + wagmiConnectorId: 'walletConnect', + }, + [WalletConnectionType.CosmosSigner]: { + name: 'CosmosSigner', + }, +}; + +// Wallets + +export enum WalletType { + BitKeep = 'BITKEEP', + BitPie = 'BITPIE', + CloverWallet = 'CLOVER_WALLET', + CoinbaseWallet = 'COINBASE_WALLET', + Coin98 = 'COIN98', + HuobiWallet = 'HUOBI_WALLET', + ImToken = 'IMTOKEN', + Keplr = 'KEPLR', + // Ledger = 'LEDGER', + MathWallet = 'MATH_WALLET', + MetaMask = 'METAMASK', + Rainbow = 'RAINBOW_WALLET', + TokenPocket = 'TOKEN_POCKET', + TrustWallet = 'TRUST_WALLET', + WalletConnect = 'WALLETCONNECT', + WalletConnect2 = 'WALLETCONNECT_2', + // TestWallet = 'TEST_WALLET', + OtherWallet = 'OTHER_WALLET', +} + +type WalletConfig = { + type: WalletType; + stringKey: string; + icon: string; + connectionTypes: WalletConnectionType[]; + matchesInjectedEip1193?: (provider: ExternalProvider & any) => boolean; + walletconnect1Name?: string; + walletconnect2Id?: string; +}; + +export const wallets: Record = { + [WalletType.OtherWallet]: { + type: WalletType.OtherWallet, + stringKey: STRING_KEYS.OTHER_WALLET, + icon: GenericWalletIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + // WalletConnectionType.CoinbaseWalletSdk, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => + Object.entries(wallets).every( + ([walletType, walletConfig]) => + walletType === WalletType.OtherWallet || + !walletConfig.matchesInjectedEip1193 || + !walletConfig.matchesInjectedEip1193(provider) + ), + }, + [WalletType.BitKeep]: { + type: WalletType.BitKeep, + stringKey: STRING_KEYS.BITKEEP, + icon: BitkeepIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isBitKeep, // isBitKeepChrome, isBitEthereum + walletconnect1Name: 'bitkeep', + walletconnect2Id: '38f5d18bd8522c244bdd70cb4a68e0e718865155811c043f052fb9f1c51de662', + }, + [WalletType.BitPie]: { + type: WalletType.BitPie, + stringKey: STRING_KEYS.BITPIE, + icon: BitpieIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isBitpie, + walletconnect1Name: 'bitpie', + }, + [WalletType.CloverWallet]: { + type: WalletType.CloverWallet, + stringKey: STRING_KEYS.CLOVER_WALLET, + icon: CloverWalletIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isClover, + // walletconnect1Name: 'clover', + }, + [WalletType.CoinbaseWallet]: { + type: WalletType.CoinbaseWallet, + stringKey: STRING_KEYS.COINBASE_WALLET, + icon: CoinbaseIcon, + connectionTypes: [ + WalletConnectionType.CoinbaseWalletSdk, + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isCoinbaseWallet, // provider.selectedProvider?.isCoinbaseWallet, + walletconnect1Name: 'coinbase', + }, + [WalletType.Coin98]: { + type: WalletType.Coin98, + stringKey: STRING_KEYS.COIN98, + icon: Coin98Icon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isCoin98, + walletconnect1Name: 'coin98', + walletconnect2Id: '2a3c89040ac3b723a1972a33a125b1db11e258a6975d3a61252cd64e6ea5ea01', + }, + [WalletType.HuobiWallet]: { + type: WalletType.HuobiWallet, + stringKey: STRING_KEYS.HUOBI_WALLET, + icon: HuobiIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isHbWallet, + walletconnect2Id: '797c615e2c556b610c048eb35535f212c0dd58de5d03e763120e90a7d1350a77', + }, + [WalletType.ImToken]: { + type: WalletType.ImToken, + stringKey: STRING_KEYS.IMTOKEN, + icon: ImTokenIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isImToken, + walletconnect1Name: 'imtoken', + walletconnect2Id: 'ef333840daf915aafdc4a004525502d6d49d77bd9c65e0642dbaefb3c2893bef', + }, + [WalletType.MathWallet]: { + type: WalletType.MathWallet, + stringKey: STRING_KEYS.MATH_WALLET, + icon: MathWalletIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isMathWallet, + walletconnect1Name: 'math', + walletconnect2Id: '7674bb4e353bf52886768a3ddc2a4562ce2f4191c80831291218ebd90f5f5e26', + }, + [WalletType.MetaMask]: { + type: WalletType.MetaMask, + stringKey: STRING_KEYS.METAMASK, + icon: MetaMaskIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: isMetaMask, + walletconnect1Name: 'metamask', + walletconnect2Id: 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', + }, + [WalletType.Rainbow]: { + type: WalletType.Rainbow, + stringKey: STRING_KEYS.RAINBOW_WALLET, + icon: RainbowIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isRainbowWallet, + walletconnect1Name: 'rainbow', + walletconnect2Id: '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', + }, + [WalletType.TokenPocket]: { + type: WalletType.TokenPocket, + stringKey: STRING_KEYS.TOKEN_POCKET, + icon: TokenPocketIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isTokenPocket, + walletconnect1Name: 'tokenpocket', + walletconnect2Id: '20459438007b75f4f4acb98bf29aa3b800550309646d375da5fd4aac6c2a2c66', + }, + [WalletType.TrustWallet]: { + type: WalletType.TrustWallet, + stringKey: STRING_KEYS.TRUST_WALLET, + icon: TrustWalletIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isTrust, + walletconnect1Name: 'trust', + walletconnect2Id: '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0', + }, + [WalletType.WalletConnect2]: { + type: WalletType.WalletConnect, + stringKey: STRING_KEYS.WALLET_CONNECT_2, + icon: WalletConnectIcon, + connectionTypes: [WalletConnectionType.WalletConnect2], + }, + [WalletType.WalletConnect]: { + type: WalletType.WalletConnect, + stringKey: STRING_KEYS.WALLET_CONNECT, + icon: WalletConnectIcon, + connectionTypes: [WalletConnectionType.WalletConnect1], + }, + [WalletType.Keplr]: { + type: WalletType.Keplr, + stringKey: STRING_KEYS.KEPLR, + icon: KeplrIcon, + connectionTypes: [WalletConnectionType.CosmosSigner], + }, +}; + +// Injected EIP-1193 Providers +export type InjectedEthereumProvider = ExternalProvider; + +export type InjectedWeb3Provider = ExternalProvider; + +export type InjectedCoinbaseWalletExtensionProvider = InjectedEthereumProvider & { + isMetaMask: true; + overrideIsMetaMask: true; + providerMap: Map<'MetaMask' | 'CoinbaseWallet', ExternalProvider>; + providers: ExternalProvider[]; +}; + +export type WithInjectedEthereumProvider = { + ethereum: InjectedEthereumProvider; +}; + +export type WithInjectedWeb3Provider = { + web3: { + currentProvider: InjectedWeb3Provider; + }; +}; + +// Wallet connections + +export type WalletConnection = { + type: WalletConnectionType; + provider?: ExternalProvider; +}; + +// dYdX Chain wallets + +import { USDC_DENOM, type onboarding, DYDX_DENOM } from '@dydxprotocol/v4-client-js'; +import type { suggestChain } from 'graz'; + +export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0"; + +/** + * @description typed data to sign for v4 onboarding + */ +export const SIGN_TYPED_DATA = { + primaryType: 'dYdX', + domain: { + name: 'dYdX V4', + }, + types: { + dYdX: [{ name: 'action', type: 'string' }], + }, + message: { + action: 'dYdX V4 Onboarding', + }, +} as const; + +export type PrivateInformation = ReturnType; + +export type EvmAddress = `0x${string}`; +export type DydxAddress = `dydx${string}`; + +export const DYDX_CHAIN_INFO: Parameters[0] = { + rpc: '13.59.4.93:26657', + rest: '13.59.4.93:1317', + chainId: 'dydx-testnet-2', + chainName: 'dYdX Public Testnet', + chainSymbolImageUrl: + 'https://raw.githubusercontent.com/chainapsis/keplr-chain-registry/main/images/dydx-testnet-2/chain.png', + bech32Config: { + bech32PrefixAccPub: 'dydxpub', + bech32PrefixValPub: 'dydxvaloperpub', + bech32PrefixAccAddr: 'dydx', + bech32PrefixConsPub: 'dydxvalconspub', + bech32PrefixValAddr: 'dydxvaloper', + bech32PrefixConsAddr: 'dydxvalcons', + }, + bip44: { + coinType: 118, + }, + stakeCurrency: { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + currencies: [ + { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + { + coinDenom: 'USDC', + coinMinimalDenom: 'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5', + coinDecimals: 6, + }, + ], + feeCurrencies: [ + { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + ], + features: [], +}; + +export enum DydxChainAsset { + USDC = 'USDC', + DYDX = 'Dv4TNT', +} + +export const DYDX_CHAIN_ASSET_COIN_DENOM: Record = { + [DydxChainAsset.USDC]: USDC_DENOM, + [DydxChainAsset.DYDX]: DYDX_DENOM, +}; diff --git a/src/constants/websocket.ts b/src/constants/websocket.ts new file mode 100644 index 0000000..e6c9c4c --- /dev/null +++ b/src/constants/websocket.ts @@ -0,0 +1,6 @@ +export const PING_INTERVAL_MS = 2000; +export const PONG_TIMEOUT_MS = 5000; + +export const PONG_MESSAGE_TYPE = 'pong'; + +export const OUTGOING_PING_MESSAGE = JSON.stringify({ type: 'ping' }); diff --git a/src/contexts/LoadingContext.ts b/src/contexts/LoadingContext.ts new file mode 100644 index 0000000..bdea33a --- /dev/null +++ b/src/contexts/LoadingContext.ts @@ -0,0 +1,3 @@ +import { createContext } from 'react'; + +export const LoadingContext = createContext(false); diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..d6c228d --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,47 @@ +import { useApiState } from './useApiState'; +import { useBreakpoints } from './useBreakpoints'; +import { useCommandMenu } from './useCommandMenu'; +import { useCurrentMarketId } from './useCurrentMarketId'; +import { useDebounce } from './useDebounce'; +import { useInterval } from './useInterval'; +import { useDocumentTitle } from './useDocumentTitle'; +import { useDydxClient } from './useDydxClient'; +import { useAccountBalance } from './useAccountBalance'; +import { useAccounts } from './useAccounts'; +import { useAnalytics } from './useAnalytics'; +import { useInitializePage } from './useInitializePage'; +import { useIsFirstRender } from './useIsFirstRender'; +import { useLocaleSeparators } from './useLocaleSeparators'; +import { useLocalStorage } from './useLocalStorage'; +import { useNow } from './useNow'; +import { useOnClickOutside } from './useOnClickOutside'; +import { usePageTitlePriceUpdates } from './usePageTitlePriceUpdates'; +import { useShouldShowFooter } from './useShouldShowFooter'; +import { useSelectedNetwork } from './useSelectedNetwork'; +import { useStringGetter } from './useStringGetter'; +import { useSubaccount } from './useSubaccount'; + +export { + useApiState, + useBreakpoints, + useCommandMenu, + useCurrentMarketId, + useDebounce, + useDocumentTitle, + useDydxClient, + useAccountBalance, + useAccounts, + useAnalytics, + useInitializePage, + useInterval, + useIsFirstRender, + useLocaleSeparators, + useLocalStorage, + useNow, + useOnClickOutside, + usePageTitlePriceUpdates, + useShouldShowFooter, + useSelectedNetwork, + useStringGetter, + useSubaccount, +}; diff --git a/src/hooks/tradingView/index.ts b/src/hooks/tradingView/index.ts new file mode 100644 index 0000000..13ecccc --- /dev/null +++ b/src/hooks/tradingView/index.ts @@ -0,0 +1,2 @@ +export { useTradingView } from './useTradingView'; +export { useTradingViewTheme } from './useTradingViewTheme'; diff --git a/src/hooks/tradingView/useTradingView.ts b/src/hooks/tradingView/useTradingView.ts new file mode 100644 index 0000000..5206e2f --- /dev/null +++ b/src/hooks/tradingView/useTradingView.ts @@ -0,0 +1,81 @@ +import { useEffect } from 'react'; +import { shallowEqual, useSelector } from 'react-redux'; +import isEmpty from 'lodash/isEmpty'; + +import { LanguageCode, ResolutionString, widget } from 'public/tradingview/charting_library'; + +import { DEFAULT_RESOLUTION } from '@/constants/candles'; +import { SUPPORTED_LOCALE_BASE_TAGS } from '@/constants/localization'; +import { LocalStorageKey } from '@/constants/localStorage'; +import { useDydxClient, useLocalStorage } from '@/hooks'; +import { store } from '@/state/_store'; + +import { getSelectedNetwork } from '@/state/appSelectors'; +import { getAppTheme } from '@/state/configsSelectors'; +import { getSelectedLocale } from '@/state/localizationSelectors'; +import { getCurrentMarketId, getMarketIds } from '@/state/perpetualsSelectors'; + +import { getDydxDatafeed } from '@/lib/tradingView/dydxfeed'; +import { getSavedResolution, getWidgetOptions, getWidgetOverrides } from '@/lib/tradingView/utils'; + +/** + * @description Hook to initialize TradingView Chart + */ +export const useTradingView = ({ + tvWidgetRef, + setIsChartReady, +}: { + tvWidgetRef: React.MutableRefObject; + setIsChartReady: React.Dispatch>; +}) => { + const marketId = useSelector(getCurrentMarketId); + const appTheme = useSelector(getAppTheme); + const marketIds = useSelector(getMarketIds, shallowEqual); + const selectedLocale = useSelector(getSelectedLocale); + const selectedNetwork = useSelector(getSelectedNetwork); + const { getCandlesForDatafeed } = useDydxClient(); + + const [savedTvChartConfig, setTvChartConfig] = useLocalStorage({ + key: LocalStorageKey.TradingViewChartConfig, + defaultValue: undefined, + }); + + const savedResolution = getSavedResolution({ savedConfig: savedTvChartConfig }); + const hasMarkets = marketIds.length > 0; + + useEffect(() => { + if (hasMarkets) { + const widgetOptions = getWidgetOptions(); + const widgetOverrides = getWidgetOverrides(appTheme); + const options = { + // debug: true, + ...widgetOptions, + ...widgetOverrides, + datafeed: getDydxDatafeed(store, getCandlesForDatafeed), + interval: (savedResolution || DEFAULT_RESOLUTION) as ResolutionString, + locale: SUPPORTED_LOCALE_BASE_TAGS[selectedLocale] as LanguageCode, + symbol: marketId, + saved_data: !isEmpty(savedTvChartConfig) ? savedTvChartConfig : undefined, + }; + + const tvChartWidget = new widget(options); + tvWidgetRef.current = tvChartWidget; + + tvWidgetRef.current.onChartReady(() => { + tvWidgetRef?.current?.subscribe('onAutoSaveNeeded', () => + tvWidgetRef?.current?.save((chartConfig: object) => setTvChartConfig(chartConfig)) + ); + + setIsChartReady(true); + }); + } + + return () => { + tvWidgetRef.current?.remove(); + tvWidgetRef.current = null; + setIsChartReady(false); + }; + }, [getCandlesForDatafeed, hasMarkets, selectedLocale, selectedNetwork]); + + return { savedResolution }; +}; diff --git a/src/hooks/tradingView/useTradingViewTheme.ts b/src/hooks/tradingView/useTradingViewTheme.ts new file mode 100644 index 0000000..302c54f --- /dev/null +++ b/src/hooks/tradingView/useTradingViewTheme.ts @@ -0,0 +1,65 @@ +import { useEffect } from 'react'; +import { useSelector } from 'react-redux'; + +import type { IChartingLibraryWidget, ThemeName } from 'public/tradingview/charting_library'; + +import { AppTheme } from '@/state/configs'; + +import { getAppTheme } from '@/state/configsSelectors'; + +import { getWidgetOverrides } from '@/lib/tradingView/utils'; + +/** + * @description Method to define a type guard and check that an element is an IFRAME + * @param element: HTMLElement + * @returns boolean on whether the element is an IFRAME + */ +const isIFrame = (element: HTMLElement | null): element is HTMLIFrameElement => + element !== null && element.tagName === 'IFRAME'; + +/** + * @description Hook to manage switching Themes + * TradingView only handles 'Dark' | 'Light' themes. + * In order to support our Classic along with Dark/Light, we are directly accessing the within the iFrame. + */ +export const useTradingViewTheme = ({ + tvWidget, + isWidgetReady, +}: { + tvWidget: (IChartingLibraryWidget & { _id?: string; _ready?: boolean }) | null; + isWidgetReady?: boolean; +}) => { + const appTheme = useSelector(getAppTheme); + + useEffect(() => { + if (tvWidget && isWidgetReady) { + tvWidget + .changeTheme?.( + { + [AppTheme.Classic]: '', + [AppTheme.Dark]: 'Dark', + [AppTheme.Light]: 'Light', + }[appTheme] as ThemeName + ) + .then(() => { + const tvChartId = tvWidget?._id; + + if (tvChartId) { + const frame = document?.getElementById(tvChartId); + + if (isIFrame(frame) && frame.contentWindow) { + const innerHtml = frame.contentWindow.document.documentElement; + + if (appTheme === AppTheme.Classic) { + innerHtml?.classList.remove('theme-dark', 'theme-light'); + } + } + } + + const { overrides, studies_overrides } = getWidgetOverrides(appTheme); + tvWidget?.applyOverrides(overrides); + tvWidget?.applyStudiesOverrides(studies_overrides); + }); + } + }, [appTheme]); +}; diff --git a/src/hooks/useAccountBalance.ts b/src/hooks/useAccountBalance.ts new file mode 100644 index 0000000..c47d9bb --- /dev/null +++ b/src/hooks/useAccountBalance.ts @@ -0,0 +1,110 @@ +import { useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { useBalance } from 'wagmi'; +import { StargateClient } from '@cosmjs/stargate'; +import { useQuery } from 'react-query'; +import { formatUnits } from 'viem'; + +import { CLIENT_NETWORK_CONFIGS } from '@/constants/networks'; +import { QUANTUM_MULTIPLIER } from '@/constants/numbers'; +import { EvmAddress } from '@/constants/wallets'; + +import { convertBech32Address } from '@/lib/addressUtils'; +import { MustBigNumber } from '@/lib/numbers'; + +import { getSelectedNetwork } from '@/state/appSelectors'; + +import { useAccounts } from './useAccounts'; +import { usePollNativeTokenBalance } from './usePollNativeTokenBalance'; +import { usePollUSDCBalance } from './usePollUSDCBalance'; + +type UseAccountBalanceProps = { + // Token Items + addressOrDenom?: string; + assetSymbol?: string; + decimals?: number; + + // Chain Items + chainId?: string | number; + bech32AddrPrefix?: string; + rpc?: string; + + isCosmosChain?: boolean; +}; + +/** + * 0xSquid uses this 0x address as the chain's default token. + * @todo We will need to add additional logic here if we 'useAccountBalance' on non-Squid related forms. + */ +const CHAIN_DEFAULT_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; + +export const useAccountBalance = ({ + addressOrDenom = CHAIN_DEFAULT_TOKEN_ADDRESS, + assetSymbol, + bech32AddrPrefix, + chainId, + decimals = 0, + rpc, + isCosmosChain, +}: UseAccountBalanceProps = {}) => { + const { evmAddress, dydxAddress } = useAccounts(); + + const selectedNetwork = useSelector(getSelectedNetwork); + const evmChainId = Number(CLIENT_NETWORK_CONFIGS[selectedNetwork].ethereumChainId); + + const evmQuery = useBalance({ + enabled: Boolean(!isCosmosChain && addressOrDenom?.startsWith('0x')), + address: evmAddress, + chainId: typeof chainId === 'number' ? chainId : Number(evmChainId), + token: + addressOrDenom === CHAIN_DEFAULT_TOKEN_ADDRESS + ? undefined + : (addressOrDenom as EvmAddress), + watch: true, + }); + + const cosmosQueryFn = useCallback(async () => { + if (dydxAddress && bech32AddrPrefix && rpc && addressOrDenom) { + const address = convertBech32Address({ + address: dydxAddress, + bech32Prefix: bech32AddrPrefix, + }); + + const client = await StargateClient.connect(rpc); + const balanceAsCoin = await client.getBalance(address, addressOrDenom); + await client.disconnect(); + + return formatUnits(BigInt(balanceAsCoin.amount), decimals); + } + }, [addressOrDenom, chainId, rpc]); + + const cosmosQuery = useQuery({ + enabled: Boolean(isCosmosChain && dydxAddress && bech32AddrPrefix && rpc && addressOrDenom), + queryKey: `accountBalances_${chainId}_${addressOrDenom}`, + queryFn: cosmosQueryFn, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + refetchInterval: 10_000, + staleTime: 10_000, + }); + + const { formatted: evmBalance } = evmQuery.data || {}; + const balance = !assetSymbol ? '0' : isCosmosChain ? cosmosQuery.data : evmBalance; + + const nativeTokenCoinBalance = usePollNativeTokenBalance({ dydxAddress }); + const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount) + .div(QUANTUM_MULTIPLIER) + .toNumber(); + + const usdcCoinBalance = usePollUSDCBalance({ dydxAddress }); + const usdcBalance = MustBigNumber(usdcCoinBalance?.amount).div(QUANTUM_MULTIPLIER).toNumber(); + + return { + balance, + nativeTokenBalance, + usdcBalance, + queryStatus: isCosmosChain ? cosmosQuery.status : evmQuery.status, + isQueryFetching: isCosmosChain ? cosmosQuery.isFetching : evmQuery.fetchStatus === 'fetching', + }; +}; diff --git a/src/hooks/useAccounts.tsx b/src/hooks/useAccounts.tsx new file mode 100644 index 0000000..9ac846b --- /dev/null +++ b/src/hooks/useAccounts.tsx @@ -0,0 +1,317 @@ +import { useCallback, useContext, createContext, useEffect, useState, useMemo } from 'react'; + +import { useDispatch } from 'react-redux'; +import { AES, enc } from 'crypto-js'; +import { LocalWallet, USDC_DENOM, type Subaccount } from '@dydxprotocol/v4-client-js'; + +import { OnboardingGuard, OnboardingState, type EvmDerivedAddresses } from '@/constants/account'; +import { LocalStorageKey, LOCAL_STORAGE_VERSIONS } from '@/constants/localStorage'; +import { DydxAddress, EvmAddress, PrivateInformation } from '@/constants/wallets'; + +import { + setOnboardingState, + setOnboardingGuard, +} from '@/state/account'; + +import abacusStateManager from '@/lib/abacus'; +import { log } from '@/lib/telemetry'; + +import { useLocalStorage } from './useLocalStorage'; + +import { useWalletConnection } from './useWalletConnection'; +import { useDydxClient } from './useDydxClient'; + +const AccountsContext = createContext | undefined>(undefined); + +AccountsContext.displayName = 'Accounts'; + +export const AccountsProvider = ({ ...props }) => ( + +); + +export const useAccounts = () => useContext(AccountsContext)!; + +const useAccountsContext = () => { + const dispatch = useDispatch(); + + // Wallet connection + const { + walletType, + walletConnectionType, + selectWalletType, + selectedWalletType, + selectedWalletError, + evmAddress, + signerWagmi, + dydxAddress: connectedDydxAddress, + signerGraz, + } = useWalletConnection(); + + // EVM wallet connection + const [previousEvmAddress, setPreviousEvmAddress] = useState(evmAddress); + + useEffect(() => { + // Wallet accounts switched + if (previousEvmAddress && evmAddress && evmAddress !== previousEvmAddress) { + // Disconnect local wallet + disconnectLocalDydxWallet(); + + // Forget EVM signature + forgetEvmSignature(previousEvmAddress); + } + + if (evmAddress) abacusStateManager.setTransfersSourceAddress(evmAddress); + + setPreviousEvmAddress(evmAddress); + }, [evmAddress]); + + // EVM → dYdX account derivation + + const [evmDerivedAddresses, saveEvmDerivedAddresses] = useLocalStorage({ + key: LocalStorageKey.EvmDerivedAddresses, + defaultValue: {} as EvmDerivedAddresses, + }); + + useEffect(() => { + // Clear data stored with deprecated LocalStorageKey + if (evmDerivedAddresses.version !== LOCAL_STORAGE_VERSIONS[LocalStorageKey.EvmDerivedAddresses]) + saveEvmDerivedAddresses({}); + }, []); + + const saveEvmDerivedAccount = ({ + evmAddress, + dydxAddress, + }: { + evmAddress: EvmAddress; + dydxAddress?: DydxAddress; + }) => { + saveEvmDerivedAddresses({ + ...evmDerivedAddresses, + version: LOCAL_STORAGE_VERSIONS[LocalStorageKey.EvmDerivedAddresses], + [evmAddress]: { + ...evmDerivedAddresses[evmAddress], + dydxAddress, + }, + }); + }; + + const saveEvmSignature = useCallback( + (encryptedSignature: string) => { + evmDerivedAddresses[evmAddress!].encryptedSignature = encryptedSignature; + saveEvmDerivedAddresses(evmDerivedAddresses); + }, + [evmDerivedAddresses, evmAddress] + ); + + const forgetEvmSignature = useCallback( + (_evmAddress = evmAddress) => { + if (_evmAddress) { + delete evmDerivedAddresses[_evmAddress]?.encryptedSignature; + saveEvmDerivedAddresses(evmDerivedAddresses); + } + }, + [evmDerivedAddresses, evmAddress] + ); + + const decryptSignature = (encryptedSignature: string | undefined) => { + const staticEncryptionKey = import.meta.env.VITE_PK_ENCRYPTION_KEY; + + if (!staticEncryptionKey) throw new Error('No decryption key found'); + if (!encryptedSignature) throw new Error('No signature found'); + + const decrypted = AES.decrypt(encryptedSignature, staticEncryptionKey); + const signature = decrypted.toString(enc.Utf8); + return signature; + }; + + // dYdXClient Onboarding & Account Helpers + const { compositeClient, getWalletFromEvmSignature } = useDydxClient(); + // dYdX subaccounts + const [dydxSubaccounts, setDydxSubaccounts] = useState(); + + const { getAccountBalance, getSubaccounts } = useMemo( + () => ({ + getAccountBalance: async ({ + dydxAddress, + denom = USDC_DENOM, + }: { + dydxAddress: DydxAddress; + denom?: string; + }) => await compositeClient?.validatorClient.get.getAccountBalance(dydxAddress, denom), + + getSubaccounts: async ({ dydxAddress }: { dydxAddress: DydxAddress }) => { + try { + const response = await compositeClient?.indexerClient.account.getSubaccounts(dydxAddress); + setDydxSubaccounts(response.subaccounts); + return response.subaccounts; + } catch (error) { + // 404 is expected if the user has no subaccounts + if (error.status === 404) { + return []; + } else { + throw error; + } + } + }, + }), + [compositeClient] + ); + + // dYdX wallet / onboarding state + const [localDydxWallet, setLocalDydxWallet] = useState(); + const [hdKey, setHdKey] = useState(); + + const dydxAccounts = useMemo(() => localDydxWallet?.accounts, [localDydxWallet]); + + const dydxAddress = useMemo( + () => localDydxWallet?.address as DydxAddress | undefined, + [localDydxWallet] + ); + + const setWalletFromEvmSignature = async (signature: string) => { + const { wallet, mnemonic, privateKey, publicKey } = await getWalletFromEvmSignature({ + signature, + }); + setLocalDydxWallet(wallet); + setHdKey({ mnemonic, privateKey, publicKey }); + }; + + useEffect(() => { + if (evmAddress) { + saveEvmDerivedAccount({ evmAddress, dydxAddress }); + } + }, [evmAddress, dydxAddress]); + + useEffect(() => { + (async () => { + if (connectedDydxAddress && signerGraz) { + dispatch(setOnboardingState(OnboardingState.WalletConnected)); + try { + setLocalDydxWallet(await LocalWallet.fromOfflineSigner(signerGraz)); + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } catch (error) { + log('useAccounts/setLocalDydxWallet', error); + } + } else if (evmAddress) { + if (!localDydxWallet) { + dispatch(setOnboardingState(OnboardingState.WalletConnected)); + + const evmDerivedAccount = evmDerivedAddresses[evmAddress]; + + if (evmDerivedAccount?.encryptedSignature) { + try { + const signature = decryptSignature(evmDerivedAccount.encryptedSignature); + + await setWalletFromEvmSignature(signature); + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } catch (error) { + log('useAccounts/decryptSignature', error); + forgetEvmSignature(); + } + } + } else { + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } + } else { + disconnectLocalDydxWallet(); + dispatch(setOnboardingState(OnboardingState.Disconnected)); + } + })(); + }, [evmAddress, evmDerivedAddresses, signerWagmi, connectedDydxAddress, signerGraz]); + + // abacus + // TODO: useAbacus({ dydxAddress }) + useEffect(() => { + if (dydxAddress) abacusStateManager.setAccount(dydxAddress); + else abacusStateManager.attemptDisconnectAccount(); + }, [dydxAddress]); + + // clear subaccounts when no dydxAddress is set + useEffect(() => { + (async () => { + if (!dydxAddress) { + setDydxSubaccounts(undefined); + } + })(); + }, [dydxAddress]); + + // Onboarding conditions + const [hasAcknowledgedTerms, saveHasAcknowledgedTerms] = useLocalStorage({ + key: LocalStorageKey.OnboardingHasAcknowledgedTerms, + defaultValue: false, + }); + + useEffect(() => { + dispatch( + setOnboardingGuard({ + guard: OnboardingGuard.hasAcknowledgedTerms, + value: hasAcknowledgedTerms, + }) + ); + }, [hasAcknowledgedTerms]); + + useEffect(() => { + const hasPreviousTransactions = Boolean(dydxSubaccounts?.length); + + dispatch( + setOnboardingGuard({ + guard: OnboardingGuard.hasPreviousTransactions, + value: hasPreviousTransactions, + }) + ); + }, [dydxSubaccounts]); + + // Disconnect wallet / accounts + const disconnectLocalDydxWallet = () => { + setLocalDydxWallet(undefined); + setHdKey(undefined); + }; + + const disconnect = async () => { + // Disconnect local wallet + disconnectLocalDydxWallet(); + + // Disconnect EVM wallet + forgetEvmSignature(); + selectWalletType(undefined); + }; + + return { + // Wallet connection + walletType, + walletConnectionType, + + // Wallet selection + selectWalletType, + selectedWalletType, + selectedWalletError, + + // Wallet connection (EVM) + evmAddress, + signerWagmi, + + // Wallet connection (Cosmos) + signerGraz, + + // EVM → dYdX account derivation + setWalletFromEvmSignature, + saveEvmSignature, + forgetEvmSignature, + + // dYdX accounts + hdKey, + localDydxWallet, + dydxAccounts, + dydxAddress, + + // Onboarding state + saveHasAcknowledgedTerms, + + // Disconnect wallet / accounts + disconnect, + + // dydxClient Account methods + getAccountBalance, + getSubaccounts, + }; +}; diff --git a/src/hooks/useAnalytics.ts b/src/hooks/useAnalytics.ts new file mode 100644 index 0000000..6dca099 --- /dev/null +++ b/src/hooks/useAnalytics.ts @@ -0,0 +1,213 @@ +import { useEffect, useState } from 'react'; +import { useSelector, shallowEqual } from 'react-redux'; +import { useLocation } from 'react-router-dom'; + +import { AnalyticsEvent, AnalyticsUserProperty } from '@/constants/analytics'; + +import { track, identify } from '@/lib/analytics'; + +import { useApiState } from './useApiState'; +import { useBreakpoints } from './useBreakpoints'; +import { useSelectedNetwork } from './useSelectedNetwork'; +import { useAccounts } from './useAccounts'; +import { useDydxClient } from './useDydxClient'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; +import { getOnboardingState, getSubaccountId } from '@/state/accountSelectors'; +import { calculateOnboardingStep } from '@/state/accountCalculators'; +import { getActiveDialog } from '@/state/dialogsSelectors'; +import type { DialogTypes } from '@/constants/dialogs'; + +import { getSelectedTradeType } from '@/lib/tradeData'; +import { getInputTradeData } from '@/state/inputsSelectors'; + +export const useAnalytics = () => { + const { walletType, walletConnectionType, evmAddress, dydxAddress, selectedWalletType } = useAccounts(); + const { compositeClient } = useDydxClient(); + + /** User properties */ + + // AnalyticsUserProperty.Breakpoint + const breakpointMatches = useBreakpoints(); + + const breakpoint = + breakpointMatches.isMobile ? + 'MOBILE' + : breakpointMatches.isTablet ? + 'TABLET' + : breakpointMatches.isDesktopSmall ? + 'DESKTOP_SMALL' + : breakpointMatches.isDesktopMedium ? + 'DESKTOP_MEDIUM' + : breakpointMatches.isDesktopLarge ? + 'DESKTOP_LARGE' + : + 'UNSUPPORTED'; + + useEffect(() => { + identify(AnalyticsUserProperty.Breakpoint, breakpoint); + }, [breakpoint]); + + // AnalyticsUserProperty.Locale + const selectedLocale = useSelector(getSelectedLocale); + + useEffect(() => { + identify(AnalyticsUserProperty.Locale, selectedLocale); + }, [selectedLocale]); + + // AnalyticsUserProperty.Network + const { selectedNetwork } = useSelectedNetwork(); + + useEffect(() => { + identify(AnalyticsUserProperty.Network, selectedNetwork); + }, [selectedNetwork]); + + // AnalyticsUserProperty.WalletType + useEffect(() => { + identify(AnalyticsUserProperty.WalletType, walletType); + }, [walletType]); + + // AnalyticsUserProperty.WalletConnectionType + useEffect(() => { + identify(AnalyticsUserProperty.WalletConnectionType, walletConnectionType); + }, [walletConnectionType]); + + // AnalyticsUserProperty.WalletAddress + useEffect(() => { + identify(AnalyticsUserProperty.WalletAddress, evmAddress || dydxAddress); + }, [evmAddress, dydxAddress]); + + // AnalyticsUserProperty.DydxAddress + useEffect(() => { + identify(AnalyticsUserProperty.DydxAddress, dydxAddress); + }, [dydxAddress]); + + // AnalyticsUserProperty.SubaccountNumber + const subaccountNumber = useSelector(getSubaccountId); + useEffect(() => { + identify(AnalyticsUserProperty.SubaccountNumber, subaccountNumber); + }, [subaccountNumber]); + + + /** Events */ + + // AnalyticsEvent.AppStart + useEffect(() => { + track(AnalyticsEvent.AppStart); + }, []); + + // AnalyticsEvent.NetworkStatus + const { height, indexerHeight, status } = useApiState(); + + useEffect(() => { + if (status) { + const websocketEndpoint = compositeClient?.indexerClient?.config.websocketEndpoint; + + const lastSuccessfulIndexerRpcQuery = + (websocketEndpoint && + lastSuccessfulWebsocketRequestByOrigin[new URL(websocketEndpoint).origin]) || + undefined; + + track(AnalyticsEvent.NetworkStatus, { + status: status.name, + lastSuccessfulIndexerRpcQuery, + elapsedTime: lastSuccessfulIndexerRpcQuery && Date.now() - lastSuccessfulIndexerRpcQuery, + blockHeight: height ?? undefined, + indexerBlockHeight: indexerHeight ?? undefined, + }); + } + }, [status]); + + // AnalyticsEvent.NavigatePage + const location = useLocation(); + + useEffect(() => { + // Ignore hashchange events from