diff --git a/package.json b/package.json index 1750695406..d8d0779f50 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,12 @@ "@emotion/styled": "^11.11.5", "@hookform/resolvers": "^3.6.0", "@n8tb1t/use-scroll-position": "^2.0.3", + "@radix-ui/react-aspect-ratio": "^1.0.3", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tooltip": "^1.0.7", @@ -84,6 +86,7 @@ "qrcode": "^1.5.3", "react": "18.3.1", "react-children-utilities": "^2.10.0", + "react-day-picker": "^8.10.1", "react-dom": "18.3.1", "react-dropzone": "^14.2.3", "react-hook-form": "7.51.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e941169419..84e948827b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,9 @@ dependencies: '@n8tb1t/use-scroll-position': specifier: ^2.0.3 version: 2.0.3(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-aspect-ratio': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-checkbox': specifier: ^1.0.4 version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -49,6 +52,9 @@ dependencies: '@radix-ui/react-radio-group': specifier: ^1.1.3 version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.0.0 + version: 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.0.3 version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -87,7 +93,7 @@ dependencies: version: 0.1.117 '@thirdweb-dev/react': specifier: 4.7.0 - version: 4.7.0(@babel/core@7.24.7)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@thirdweb-dev/sdk@4.0.93)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0) + version: 4.7.0(@babel/core@7.24.4)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@thirdweb-dev/sdk@4.0.93)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0) '@thirdweb-dev/react-core': specifier: 4.7.0 version: 4.7.0(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0) @@ -153,7 +159,7 @@ dependencies: version: 0.394.0(react@18.3.1) next: specifier: 14.2.4 - version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) next-plausible: specifier: ^3.12.0 version: 3.12.0(next@14.2.4)(react-dom@18.3.1)(react@18.3.1) @@ -196,6 +202,9 @@ dependencies: react-children-utilities: specifier: ^2.10.0 version: 2.10.0(react@18.3.1) + react-day-picker: + specifier: ^8.10.1 + version: 8.10.1(date-fns@3.6.0)(react@18.3.1) react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) @@ -219,7 +228,7 @@ dependencies: version: 3.1.1(react-dom@18.3.1)(react@18.3.1) react-query-v5: specifier: npm:@tanstack/react-query@^5.40.1 - version: /@tanstack/react-query@5.40.1(react@18.3.1) + version: /@tanstack/react-query@5.44.0(react@18.3.1) react-responsive-carousel: specifier: ^3.2.23 version: 3.2.23 @@ -439,13 +448,13 @@ packages: peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/runtime': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.7) + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/runtime': 7.24.4 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + babel-preset-fbjs: 3.4.0(@babel/core@7.24.4) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 @@ -476,26 +485,26 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.0.0 /@babel/compat-data@7.24.7: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.7: - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.5(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -504,6 +513,15 @@ packages: transitivePeerDependencies: - supports-color + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + /@babel/generator@7.24.7: resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} @@ -530,21 +548,21 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -569,14 +587,11 @@ packages: dependencies: '@babel/types': 7.24.7 - /@babel/helper-member-expression-to-functions@7.24.7: - resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.24.0 dev: true /@babel/helper-module-imports@7.24.7: @@ -588,18 +603,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 transitivePeerDependencies: - supports-color @@ -610,33 +625,28 @@ packages: '@babel/types': 7.24.7 dev: true - /@babel/helper-plugin-utils@7.24.7: - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.24.7 - transitivePeerDependencies: - - supports-color dev: true - /@babel/helper-simple-access@7.24.7: - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.24.0 /@babel/helper-skip-transparent-expression-wrappers@7.24.7: resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} @@ -648,6 +658,12 @@ packages: - supports-color dev: true + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + /@babel/helper-split-export-declaration@7.24.7: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} @@ -658,6 +674,10 @@ packages: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -666,12 +686,15 @@ packages: resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.24.7: - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} @@ -680,7 +703,14 @@ packages: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.0.0 + + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 /@babel/parser@7.24.7: resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} @@ -689,21 +719,21 @@ packages: dependencies: '@babel/types': 7.24.7 - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.7): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.7): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.4): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. @@ -711,291 +741,287 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.24.7 - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} + /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==} + /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==} + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) - '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - transitivePeerDependencies: - - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.7 dev: true - /@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==} + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==} + /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7) + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==} + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==} + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==} + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-simple-access': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 dev: true /@babel/runtime-corejs3@7.24.7: @@ -1006,8 +1032,8 @@ packages: regenerator-runtime: 0.14.1 dev: false - /@babel/runtime@7.24.7: - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1020,6 +1046,23 @@ packages: '@babel/parser': 7.24.7 '@babel/types': 7.24.7 + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.5(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + /@babel/traverse@7.24.7: resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} @@ -1037,6 +1080,14 @@ packages: transitivePeerDependencies: - supports-color + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@babel/types@7.24.7: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} @@ -1459,7 +1510,7 @@ packages: framer-motion: 11.2.10(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.10(@types/react@18.3.3)(react@18.3.1) + react-remove-scroll: 2.5.9(@types/react@18.3.3)(react@18.3.1) transitivePeerDependencies: - '@types/react' dev: false @@ -2233,7 +2284,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.4 @@ -2257,7 +2308,7 @@ packages: stylis: 4.2.0 dev: false - /@emotion/css@11.10.5(@babel/core@7.24.7): + /@emotion/css@11.10.5(@babel/core@7.24.4): resolution: {integrity: sha512-maJy0wG82hWsiwfJpc3WrYsyVwUbdu+sdIseKUB+/OLjB8zgc3tqkT6eO0Yt0AhIkJwGGnmMY/xmQwEAgQ4JHA==} peerDependencies: '@babel/core': ^7.0.0 @@ -2265,7 +2316,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 @@ -2298,7 +2349,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 @@ -2336,7 +2387,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) @@ -2359,7 +2410,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) @@ -3091,8 +3142,8 @@ packages: /@fastify/ajv-compiler@3.5.0: resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} dependencies: - ajv: 8.16.0 - ajv-formats: 2.1.1(ajv@8.16.0) + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) fast-uri: 2.4.0 dev: false @@ -3190,9 +3241,9 @@ packages: '@parcel/watcher': optional: true dependencies: - '@babel/generator': 7.24.7 + '@babel/generator': 7.24.4 '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.24.0 '@graphql-codegen/client-preset': 4.2.6(graphql@16.8.1) '@graphql-codegen/core': 4.0.2(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.8.1) @@ -3203,9 +3254,9 @@ packages: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.8.1) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.8.1) '@graphql-tools/load': 8.0.2(graphql@16.8.1) - '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.14.2)(graphql@16.8.1) + '@graphql-tools/prisma-loader': 8.0.3(@types/node@20.14.2)(graphql@16.8.1) '@graphql-tools/url-loader': 8.0.2(@types/node@20.14.2)(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.4.5) @@ -3224,7 +3275,7 @@ packages: string-env-interpolation: 1.0.1 ts-log: 2.2.5 tslib: 2.6.3 - yaml: 2.4.3 + yaml: 2.4.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -3242,7 +3293,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.7 '@graphql-codegen/add': 5.0.2(graphql@16.8.1) '@graphql-codegen/gql-tag-operations': 4.0.7(graphql@16.8.1) @@ -3252,7 +3303,7 @@ packages: '@graphql-codegen/typescript-operations': 4.2.1(graphql@16.8.1) '@graphql-codegen/visitor-plugin-common': 5.2.0(graphql@16.8.1) '@graphql-tools/documents': 1.0.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 @@ -3268,7 +3319,7 @@ packages: dependencies: '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.8.1) '@graphql-tools/schema': 10.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 dev: true @@ -3280,7 +3331,7 @@ packages: dependencies: '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.8.1) '@graphql-codegen/visitor-plugin-common': 5.2.0(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) auto-bind: 4.0.0 graphql: 16.8.1 tslib: 2.6.3 @@ -3322,7 +3373,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) change-case-all: 1.0.15 common-tags: 1.8.2 graphql: 16.8.1 @@ -3337,7 +3388,7 @@ packages: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 dev: true @@ -3438,7 +3489,7 @@ packages: '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.8.1) '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) auto-bind: 4.0.0 change-case-all: 1.0.15 dependency-graph: 0.11.0 @@ -3458,7 +3509,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@whatwg-node/fetch': 0.9.18 graphql: 16.8.1 tslib: 2.6.3 @@ -3472,7 +3523,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.3 @@ -3486,7 +3537,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/graphql-tag-pluck': 8.3.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) globby: 11.1.0 graphql: 16.8.1 tslib: 2.6.3 @@ -3495,8 +3546,8 @@ packages: - supports-color dev: true - /@graphql-tools/delegate@10.0.11(graphql@16.8.1): - resolution: {integrity: sha512-+sKeecdIVXhFB/66e5yjeKYZ3Lpn52yNG637ElVhciuLGgFc153rC6l6zcuNd9yx5wMrNx35U/h3HsMIEI3xNw==} + /@graphql-tools/delegate@10.0.4(graphql@16.8.1): + resolution: {integrity: sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3504,7 +3555,7 @@ packages: '@graphql-tools/batch-execute': 9.0.4(graphql@16.8.1) '@graphql-tools/executor': 1.2.6(graphql@16.8.1) '@graphql-tools/schema': 10.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) dataloader: 2.2.2 graphql: 16.8.1 tslib: 2.6.3 @@ -3527,7 +3578,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@types/ws': 8.5.10 graphql: 16.8.1 graphql-ws: 5.16.0(graphql@16.8.1) @@ -3545,7 +3596,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/fetch': 0.9.18 extract-files: 11.0.0 @@ -3563,7 +3614,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@types/ws': 8.5.10 graphql: 16.8.1 isomorphic-ws: 5.0.0(ws@8.17.0) @@ -3580,7 +3631,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@repeaterjs/repeater': 3.0.6 graphql: 16.8.1 @@ -3595,7 +3646,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/graphql-tag-pluck': 8.3.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 is-glob: 4.0.3 micromatch: 4.0.7 @@ -3614,7 +3665,7 @@ packages: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/executor-http': 1.0.9(@types/node@20.14.2)(graphql@16.8.1) '@graphql-tools/graphql-tag-pluck': 8.3.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@whatwg-node/fetch': 0.9.18 graphql: 16.8.1 tslib: 2.6.3 @@ -3632,7 +3683,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/import': 7.0.1(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) globby: 11.1.0 graphql: 16.8.1 tslib: 2.6.3 @@ -3645,12 +3696,12 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7) - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 transitivePeerDependencies: @@ -3663,7 +3714,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 resolve-from: 5.0.0 tslib: 2.6.3 @@ -3675,7 +3726,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) globby: 11.1.0 graphql: 16.8.1 tslib: 2.6.3 @@ -3689,7 +3740,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/schema': 10.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 p-limit: 3.1.0 tslib: 2.6.3 @@ -3701,7 +3752,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 dev: true @@ -3725,15 +3776,16 @@ packages: tslib: 2.6.3 dev: true - /@graphql-tools/prisma-loader@8.0.4(@types/node@20.14.2)(graphql@16.8.1): - resolution: {integrity: sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==} + /@graphql-tools/prisma-loader@8.0.3(@types/node@20.14.2)(graphql@16.8.1): + resolution: {integrity: sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/url-loader': 8.0.2(@types/node@20.14.2)(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@types/js-yaml': 4.0.9 + '@types/json-stable-stringify': 1.0.36 '@whatwg-node/fetch': 0.9.18 chalk: 4.1.2 debug: 4.3.5(supports-color@8.1.1) @@ -3744,6 +3796,7 @@ packages: https-proxy-agent: 7.0.4 jose: 5.4.0 js-yaml: 4.1.0 + json-stable-stringify: 1.1.1 lodash: 4.17.21 scuid: 1.1.0 tslib: 2.6.3 @@ -3777,7 +3830,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/relay-compiler': 12.0.0(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 transitivePeerDependencies: @@ -3792,7 +3845,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/merge': 9.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.2.2(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 value-or-promise: 1.0.12 @@ -3805,11 +3858,11 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/delegate': 10.0.11(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.4(graphql@16.8.1) '@graphql-tools/executor-graphql-ws': 1.1.2(graphql@16.8.1) '@graphql-tools/executor-http': 1.0.9(@types/node@20.14.2)(graphql@16.8.1) '@graphql-tools/executor-legacy-ws': 1.0.6(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) '@graphql-tools/wrap': 10.0.5(graphql@16.8.1) '@types/ws': 8.5.10 '@whatwg-node/fetch': 0.9.18 @@ -3825,8 +3878,21 @@ packages: - utf-8-validate dev: true - /@graphql-tools/utils@10.2.1(graphql@16.8.1): - resolution: {integrity: sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==} + /@graphql-tools/utils@10.1.3(graphql@16.8.1): + resolution: {integrity: sha512-loco2ctrrMQzdpSHbcOo6+Ecp21BV67cQ2pNGhuVKAexruu01RdLn3LgtK47B9BpLz3cUD6U0u1R0rur7xMOOg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-inspect: 1.0.0 + dset: 3.1.3 + graphql: 16.8.1 + tslib: 2.6.3 + dev: true + + /@graphql-tools/utils@10.2.2(graphql@16.8.1): + resolution: {integrity: sha512-ueoplzHIgFfxhFrF4Mf/niU/tYHuO6Uekm2nCYU72qpI+7Hn9dA2/o5XOBvFXDk27Lp5VSvQY5WfmRbqwVxaYQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3863,9 +3929,9 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/delegate': 10.0.11(graphql@16.8.1) + '@graphql-tools/delegate': 10.0.4(graphql@16.8.1) '@graphql-tools/schema': 10.0.4(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.3 value-or-promise: 1.0.12 @@ -3878,8 +3944,8 @@ packages: dependencies: graphql: 16.8.1 - /@grpc/grpc-js@1.10.9: - resolution: {integrity: sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==} + /@grpc/grpc-js@1.10.6: + resolution: {integrity: sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==} engines: {node: '>=12.10.0'} dependencies: '@grpc/proto-loader': 0.7.13 @@ -3893,7 +3959,7 @@ packages: dependencies: lodash.camelcase: 4.3.0 long: 5.2.3 - protobufjs: 7.3.0 + protobufjs: 7.3.1 yargs: 17.7.2 dev: false @@ -3904,7 +3970,7 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 dependencies: - '@tanstack/react-virtual': 3.5.1(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.4.0(react-dom@18.3.1)(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -4476,8 +4542,8 @@ packages: - typescript dev: true - /@oclif/core@3.27.0: - resolution: {integrity: sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==} + /@oclif/core@3.26.4: + resolution: {integrity: sha512-ntfo2ut7enNtAn/jB/dryMUPBM2Fh8Fydmi3k/Ybo6lCGU/hmsPFkBRjCEJAQMyNkK2yVZARaWogdOrcVgFz+w==} engines: {node: '>=18.0.0'} dependencies: '@types/cli-progress': 3.11.5 @@ -4540,7 +4606,7 @@ packages: resolution: {integrity: sha512-lYNoqoQJz+p4AOMZ9N5k7OkLk/HZJSdaybJ4rWfDZ76pQ7AcrLEPtREi2wLfcwcrzKoBMsrwBoMTf3PnmpW7ZQ==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 3.27.0 + '@oclif/core': 3.26.4 chalk: 5.3.0 debug: 4.3.5(supports-color@8.1.1) npm: 10.2.3 @@ -5204,10 +5270,16 @@ packages: resolution: {integrity: sha512-Vxq944ErPJsdVepjEUhOLO9ApUVOocA63knc+V2TkJ09D/AVOjiMIgkca/7VoYgODcla0qbSIBjje0SMfZMbAw==} dev: false + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.24.4 + dev: false + /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 dev: false /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): @@ -5223,7 +5295,28 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-aspect-ratio@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA==} + 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.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5244,7 +5337,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5272,7 +5365,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -5292,7 +5385,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5306,7 +5399,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5324,7 +5417,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5354,7 +5447,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5372,7 +5465,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -5393,7 +5486,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5411,7 +5504,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5438,7 +5531,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 react: 18.3.1 @@ -5457,7 +5550,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5478,7 +5571,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5513,7 +5606,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5543,7 +5636,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5564,7 +5657,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 @@ -5586,7 +5679,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5607,7 +5700,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5637,7 +5730,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5653,6 +5746,47 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-select@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + 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.24.4 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) + dev: false + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: @@ -5666,7 +5800,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5683,7 +5817,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 react: 18.3.1 @@ -5702,7 +5836,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5730,7 +5864,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) @@ -5758,7 +5892,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5772,7 +5906,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 react: 18.3.1 @@ -5787,7 +5921,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 react: 18.3.1 @@ -5802,7 +5936,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5816,7 +5950,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 react: 18.3.1 dev: false @@ -5830,7 +5964,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/rect': 1.0.1 '@types/react': 18.3.3 react: 18.3.1 @@ -5845,7 +5979,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 react: 18.3.1 @@ -5864,7 +5998,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5875,7 +6009,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 dev: false /@react-icons/all-files@4.1.0(react@18.3.1): @@ -6107,7 +6241,7 @@ packages: resolution: {integrity: sha512-JvxVgsMFmDsU0Dgcx1CeFUC1scxOVSAOzOcE06qKAVm9BZzxHpI53iNfeMOXwVTUolD8LZVIfgOjkiXfwN/UPQ==} engines: {node: '>= 14'} dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 '@sentry/babel-plugin-component-annotate': 2.18.0 '@sentry/cli': 2.32.1 dotenv: 16.4.5 @@ -6236,7 +6370,7 @@ packages: '@sentry/vercel-edge': 8.8.0 '@sentry/webpack-plugin': 2.18.0(webpack@5.92.0) chalk: 3.0.0 - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 resolve: 1.22.8 rollup: 3.29.4 @@ -6584,7 +6718,6 @@ packages: /@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-alpha.5: resolution: {integrity: sha512-aDmcpGikL5JZmDTg7J6EJfLFjtUmX/MfduS4hQeopFCkw91dZsqxO10j7KEiRVVuJBuGStbYoHI5aIsQTlebzA==} - requiresBuild: true dependencies: '@babel/runtime-corejs3': 7.24.7 '@swagger-api/apidom-ast': 1.0.0-alpha.5 @@ -6943,8 +7076,8 @@ packages: resolution: {integrity: sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww==} dev: false - /@tanstack/query-core@5.40.0: - resolution: {integrity: sha512-eD8K8jsOIq0Z5u/QbvOmfvKKE/XC39jA7yv4hgpl/1SRiU+J8QCIwgM/mEHuunQsL87dcvnHqSVLmf9pD4CiaA==} + /@tanstack/query-core@5.44.0: + resolution: {integrity: sha512-Fa1J7iEEyJnjXG1N4+Fz4OXNH/INve3XSn0Htms3X4wgRsXHxMDwqBE2XtDCts7swkwSIs4izEtaFqWVFr/eLQ==} dev: false /@tanstack/query-persist-client-core@4.36.1: @@ -6989,12 +7122,12 @@ packages: react: 18.3.1 dev: false - /@tanstack/react-query@5.40.1(react@18.3.1): - resolution: {integrity: sha512-gOcmu+gpFd2taHrrgMM9RemLYYEDYfsCqszxCC0xtx+csDa4R8t7Hr7SfWXQP13S2sF+mOxySo/+FNXJFYBqcA==} + /@tanstack/react-query@5.44.0(react@18.3.1): + resolution: {integrity: sha512-zmaD6cw8P2cBOfRHhqRmwvDsAi56gqbiwG2CDR6oQOCXSDOvRagvpP6RUStn+RrfcVUrNjKsxBmrgG6Za8p5zg==} peerDependencies: react: ^18.0.0 dependencies: - '@tanstack/query-core': 5.40.0 + '@tanstack/query-core': 5.44.0 react: 18.3.1 dev: false @@ -7010,13 +7143,13 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@tanstack/react-virtual@3.5.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-jIsuhfgy8GqA67PdWqg73ZB2LFE+HD9hjWL1L6ifEIZVyZVAKpYmgUG4WsKQ005aEyImJmbuimPiEvc57IY0Aw==} + /@tanstack/react-virtual@3.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@tanstack/virtual-core': 3.5.1 + '@tanstack/virtual-core': 3.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false @@ -7026,8 +7159,8 @@ packages: engines: {node: '>=12'} dev: false - /@tanstack/virtual-core@3.5.1: - resolution: {integrity: sha512-046+AUSiDru/V9pajE1du8WayvBKeCvJ2NmKPy/mR8/SbKKrqmSbj7LJBfXE+nSq4f5TBXvnCzu0kcYebI9WdQ==} + /@tanstack/virtual-core@3.4.0: + resolution: {integrity: sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q==} dev: false /@thirdweb-dev/auth@4.1.91(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0): @@ -7060,7 +7193,7 @@ packages: ethers: 5.7.2 fastify: 4.27.0 fastify-type-provider-zod: 1.2.0(fastify@4.27.0)(zod@3.23.8) - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) uuid: 9.0.1 zod: 3.23.8 transitivePeerDependencies: @@ -7239,7 +7372,7 @@ packages: - zksync-ethers dev: false - /@thirdweb-dev/react@4.7.0(@babel/core@7.24.7)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@thirdweb-dev/sdk@4.0.93)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0): + /@thirdweb-dev/react@4.7.0(@babel/core@7.24.4)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/properties@5.7.0)(@thirdweb-dev/sdk@4.0.93)(@types/react-dom@18.3.0)(@types/react@18.3.3)(ethers@5.7.2)(fastify@4.27.0)(localforage@1.10.0)(next@14.2.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.4.5)(zksync-ethers@5.8.0): resolution: {integrity: sha512-x2D4w6OYhczLTWgxfjxu8+N64puIurns4yNHsh19lzcHj7VlthzuWjcmULGJ2x6F0I/ELnKELBqgdwd3Cu4FRg==} engines: {node: '>=18'} peerDependencies: @@ -7248,7 +7381,7 @@ packages: react: '>=18.0.0' react-dom: '>=18.0.0' dependencies: - '@emotion/css': 11.10.5(@babel/core@7.24.7) + '@emotion/css': 11.10.5(@babel/core@7.24.4) '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.3.3)(react@18.3.1) '@google/model-viewer': 2.1.1 @@ -7689,8 +7822,8 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: false - /@types/express-serve-static-core@4.19.3: - resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} + /@types/express-serve-static-core@4.19.0: + resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} dependencies: '@types/node': 20.14.2 '@types/qs': 6.9.15 @@ -7702,7 +7835,7 @@ packages: resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.3 + '@types/express-serve-static-core': 4.19.0 '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 dev: false @@ -7735,6 +7868,10 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: false + /@types/json-stable-stringify@1.0.36: + resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -9127,7 +9264,7 @@ packages: - encoding dev: false - /ajv-formats@2.1.1(ajv@8.16.0): + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: ajv: ^8.0.0 @@ -9135,9 +9272,9 @@ packages: ajv: optional: true dependencies: - ajv: 8.16.0 + ajv: 8.12.0 - /ajv-formats@3.0.1(ajv@8.16.0): + /ajv-formats@3.0.1(ajv@8.12.0): resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: ajv: ^8.0.0 @@ -9145,7 +9282,7 @@ packages: ajv: optional: true dependencies: - ajv: 8.16.0 + ajv: 8.12.0 dev: false /ajv-keywords@3.5.2(ajv@6.12.6): @@ -9164,8 +9301,8 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -9495,10 +9632,10 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001629 + caniuse-lite: 1.0.30001632 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 + picocolors: 1.0.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true @@ -9554,7 +9691,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false @@ -9563,38 +9700,38 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.24.7): + /babel-preset-fbjs@3.4.0(@babel/core@7.24.4): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7) + '@babel/core': 7.24.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color @@ -9745,8 +9882,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001629 - electron-to-chromium: 1.4.794 + caniuse-lite: 1.0.30001632 + electron-to-chromium: 1.4.799 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) @@ -9884,9 +10021,6 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001629: - resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} - /caniuse-lite@1.0.30001632: resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} @@ -10443,8 +10577,8 @@ packages: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} dependencies: - ajv: 8.16.0 - ajv-formats: 2.1.1(ajv@8.16.0) + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) atomically: 1.7.0 debounce-fn: 4.0.0 dot-prop: 6.0.1 @@ -11143,7 +11277,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 csstype: 3.1.3 dev: false @@ -11238,15 +11372,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.9.1 + jake: 10.8.7 dev: true - /electron-to-chromium@1.4.794: - resolution: {integrity: sha512-6FApLtsYhDCY0Vglq3AptsdxQ+PJLc6AxlAM0HjEihUAiOPPbkASEsq9gtxUeZY9o0sJIEa3WnF0vVH4VT4iug==} - /electron-to-chromium@1.4.799: resolution: {integrity: sha512-3D3DwWkRTzrdEpntY0hMLYwj7SeBk1138CkPE8sBDSj3WzrzOiG2rHm3luw8jucpf+WiyLBCZyU9lMHyQI9M9Q==} - dev: false /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -11305,12 +11435,21 @@ packages: tapable: 1.1.3 dev: true + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enhanced-resolve@5.17.0: resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: false /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -12144,8 +12283,8 @@ packages: resolution: {integrity: sha512-A4bg6E15QrkuVO3f0SwIASgzMzR6XC4qTyTqhf3hYXy0iazbAdZKwkE+ox4WgzKyzM6ygvbdq3r134UjOaaAnA==} dependencies: '@fastify/merge-json-schemas': 0.1.1 - ajv: 8.16.0 - ajv-formats: 3.0.1(ajv@8.16.0) + ajv: 8.12.0 + ajv-formats: 3.0.1(ajv@8.12.0) fast-deep-equal: 3.1.3 fast-uri: 2.4.0 json-schema-ref-resolver: 1.0.1 @@ -12316,7 +12455,7 @@ packages: app-module-path: 2.2.0 commander: 2.20.3 debug: 4.3.5(supports-color@8.1.1) - enhanced-resolve: 5.17.0 + enhanced-resolve: 5.16.0 is-relative-path: 1.0.2 module-definition: 3.4.0 module-lookup-amd: 7.0.1 @@ -12687,19 +12826,19 @@ packages: foreground-child: 3.2.0 jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.1.2 + minipass: 7.0.4 path-scurry: 1.11.1 dev: true - /glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 3.4.0 + jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.1.2 + minipass: 7.0.4 path-scurry: 1.11.1 /glob@7.2.3: @@ -12801,7 +12940,7 @@ packages: resolution: {integrity: sha512-z3MR+pE6WqU+tnKtkJl4c723EYY7Il4fcSNgEbehzUJpcNWkca9AyoC2pdBWmEa0cda21VRpUBb4s6VSATiUKg==} engines: {node: '>=14'} dependencies: - '@grpc/grpc-js': 1.10.9 + '@grpc/grpc-js': 1.10.6 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 @@ -12845,7 +12984,7 @@ packages: '@graphql-tools/load': 8.0.2(graphql@16.8.1) '@graphql-tools/merge': 9.0.4(graphql@16.8.1) '@graphql-tools/url-loader': 8.0.2(@types/node@20.14.2)(graphql@16.8.1) - '@graphql-tools/utils': 10.2.1(graphql@16.8.1) + '@graphql-tools/utils': 10.1.3(graphql@16.8.1) cosmiconfig: 8.3.6(typescript@5.4.5) graphql: 16.8.1 jiti: 1.21.3 @@ -13801,18 +13940,9 @@ packages: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - - /jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - /jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} hasBin: true dependencies: @@ -13931,6 +14061,16 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + /json-to-pretty-yaml@1.2.2: resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} engines: {node: '>= 0.2.0'} @@ -13959,6 +14099,10 @@ packages: graceful-fs: 4.2.11 dev: true + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -14040,7 +14184,7 @@ packages: jiti: 1.21.3 js-yaml: 4.1.0 minimist: 1.2.8 - picocolors: 1.0.1 + picocolors: 1.0.0 picomatch: 4.0.2 pretty-ms: 9.0.0 resolve: 1.22.8 @@ -15044,8 +15188,8 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} /mipd@0.0.7(typescript@5.4.5): @@ -15247,7 +15391,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false @@ -15259,7 +15403,7 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false @@ -15275,7 +15419,7 @@ packages: '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) dev: true /next-themes@0.3.0(react-dom@18.3.1)(react@18.3.1): @@ -15303,7 +15447,7 @@ packages: - supports-color dev: true - /next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1): + /next@14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==} engines: {node: '>=18.17.0'} hasBin: true @@ -15331,7 +15475,7 @@ packages: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.7)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.4 '@next/swc-darwin-x64': 14.2.4 @@ -15353,7 +15497,7 @@ packages: react: '>= 16.0.0' react-dom: '>= 16.0.0' dependencies: - next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(@babel/core@7.24.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1) nprogress: 0.2.0 prop-types: 15.8.1 react: 18.3.1 @@ -15367,8 +15511,8 @@ packages: tslib: 2.6.3 dev: true - /node-abi@3.63.0: - resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + /node-abi@3.60.0: + resolution: {integrity: sha512-zcGgwoXbzw9NczqbGzAWL/ToDYAxv1V8gL1D67ClbdkIfeeDBbY0GelZtC25ayLvVjr2q2cloHeQV1R0QAWqRQ==} engines: {node: '>=10'} requiresBuild: true dependencies: @@ -15466,7 +15610,7 @@ packages: resolution: {integrity: sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==} engines: {node: '>=6.0'} dependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.24.4 dev: true /normalize-path@2.1.1: @@ -16073,7 +16217,7 @@ packages: engines: {node: '>=16 || 14 >=14.18'} dependencies: lru-cache: 10.2.2 - minipass: 7.1.2 + minipass: 7.0.4 /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -16118,6 +16262,9 @@ packages: postgres-interval: 1.2.0 dev: false + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -16285,7 +16432,7 @@ packages: dependencies: lilconfig: 3.1.1 postcss: 8.4.38 - yaml: 2.4.3 + yaml: 2.4.1 /postcss-nested@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -16320,7 +16467,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.0.0 source-map-js: 1.2.0 /postcss@8.4.38: @@ -16328,7 +16475,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.0.0 source-map-js: 1.2.0 /postgres-array@2.0.0: @@ -16383,7 +16530,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.63.0 + node-abi: 3.60.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -16549,7 +16696,7 @@ packages: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} dependencies: - protobufjs: 7.3.0 + protobufjs: 7.3.1 dev: false /protobufjs@7.3.0: @@ -16759,7 +16906,7 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 react: 18.3.1 dev: false @@ -16773,6 +16920,16 @@ packages: react: 18.3.1 dev: false + /react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + date-fns: 3.6.0 + react: 18.3.1 + dev: false + /react-debounce-input@3.3.0(react@18.3.1): resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} peerDependencies: @@ -16824,7 +16981,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@types/react': 18.3.3 focus-lock: 1.3.5 prop-types: 15.8.1 @@ -16963,8 +17120,8 @@ packages: tslib: 2.6.3 dev: false - /react-remove-scroll@2.5.10(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==} + /react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -16982,8 +17139,8 @@ packages: use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) dev: false - /react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + /react-remove-scroll@2.5.9(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -17015,7 +17172,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@floating-ui/dom': 1.6.5 @@ -17066,7 +17223,7 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 @@ -17088,7 +17245,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -17284,7 +17441,7 @@ packages: /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -17882,7 +18039,7 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.17 dev: false /spdx-exceptions@2.5.0: @@ -17893,11 +18050,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.17 dev: false - /spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: false /split-on-first@1.1.0: @@ -18128,7 +18285,7 @@ packages: inline-style-parser: 0.2.3 dev: false - /styled-jsx@5.1.1(@babel/core@7.24.7)(react@18.3.1): + /styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -18141,7 +18298,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.4 client-only: 0.0.1 react: 18.3.1 @@ -18167,7 +18324,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.4.1 + glob: 10.3.12 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -18311,7 +18468,7 @@ packages: /tailwind-merge@2.3.0: resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.24.4 dev: false /tailwindcss-animate@1.0.7(tailwindcss@3.4.4): @@ -18340,7 +18497,7 @@ packages: micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 + picocolors: 1.0.0 postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) @@ -19756,7 +19913,7 @@ packages: html-escaper: 2.0.2 is-plain-object: 5.0.0 opener: 1.5.2 - picocolors: 1.0.1 + picocolors: 1.0.0 sirv: 2.0.4 ws: 7.5.9 transitivePeerDependencies: @@ -20073,8 +20230,8 @@ packages: engines: {node: '>= 6'} dev: false - /yaml@2.4.3: - resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} hasBin: true diff --git a/src/@/components/ui/CopyAddressButton.tsx b/src/@/components/ui/CopyAddressButton.tsx new file mode 100644 index 0000000000..68bd001f4b --- /dev/null +++ b/src/@/components/ui/CopyAddressButton.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { CheckIcon, CopyIcon } from "lucide-react"; +import { Button } from "./button"; +import { useState } from "react"; +import { cn } from "../../lib/utils"; +import { ToolTipLabel } from "./tooltip"; + +export function CopyAddressButton(props: { + address: string; + className?: string; + iconClassName?: string; + variant?: + | "primary" + | "default" + | "destructive" + | "outline" + | "secondary" + | "ghost"; +}) { + const [isCopied, setIsCopied] = useState(false); + const shortenedAddress = `${props.address.slice(0, 6)}...${props.address.slice(0, 4)}`; + + return ( + + + + ); +} diff --git a/src/@/components/ui/DatePickerWithRange.tsx b/src/@/components/ui/DatePickerWithRange.tsx new file mode 100644 index 0000000000..78b1d38fe2 --- /dev/null +++ b/src/@/components/ui/DatePickerWithRange.tsx @@ -0,0 +1,152 @@ +"use client"; + +import * as React from "react"; +import { format, isBefore } from "date-fns"; +import { + Calendar as CalendarIcon, + CalendarX2Icon, + ChevronDownIcon, +} from "lucide-react"; + +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Calendar } from "@/components/ui/calendar"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { TabButtons } from "./tabs"; +import { DynamicHeight } from "./DynamicHeight"; + +export function DatePickerWithRange(props: { + from: Date; + to: Date; + setFrom: (from: Date) => void; + setTo: (to: Date) => void; + className?: string; + header?: React.ReactNode; + footer?: React.ReactNode; + labelOverride?: string; +}) { + const [screen, setScreen] = React.useState<"from" | "to">("from"); + const { from, to, setFrom, setTo } = props; + + const isValid = React.useMemo(() => isBefore(from, to), [from, to]); + const [isOpen, setIsOpen] = React.useState(false); + + return ( +
+ { + if (!v) { + setScreen("from"); + } + setIsOpen(v); + }} + > + {/* Button */} + + + + + {/* Popover */} + + +
+ {!isValid && ( +

+ + Invalid date range +

+ )} + {props.header} + +
+ setScreen("from"), + isActive: screen === "from", + isEnabled: true, + }, + { + name: "To", + onClick: () => setScreen("to"), + isActive: screen === "to", + isEnabled: true, + }, + ]} + /> +
+ + {screen === "from" && ( + { + if (isBefore(newFrom, to)) { + setFrom(newFrom); + } + }} + classNames={{ + day_range_start: "!bg-inverted", + day_range_end: + "!bg-inverted/20 !text-inverted pointer-events-none", + }} + /> + )} + + {screen === "to" && ( + { + if (isBefore(from, newTo)) { + setTo(newTo); + } + }} + classNames={{ + day_range_end: "!bg-inverted", + day_range_start: + "!bg-inverted/20 !text-inverted pointer-events-none", + }} + /> + )} + {props.footer} +
+
+
+
+
+ ); +} diff --git a/src/@/components/ui/DynamicHeight.tsx b/src/@/components/ui/DynamicHeight.tsx new file mode 100644 index 0000000000..df48a32d8c --- /dev/null +++ b/src/@/components/ui/DynamicHeight.tsx @@ -0,0 +1,58 @@ +/* eslint-disable react/forbid-dom-props */ +"use client"; + +import React, { useState, useRef, useLayoutEffect } from "react"; + +export function DynamicHeight(props: { + children: React.ReactNode; + maxHeight?: string; + transition?: string; +}) { + const { height, elementRef } = useHeightObserver(); + + return ( +
+
+ {props.children} +
+
+ ); +} + +export function useHeightObserver() { + const elementRef = useRef(null); + const [height, setHeight] = useState(); + + useLayoutEffect(() => { + const element = elementRef.current; + if (!element) { + return; + } + + const resizeObserver = new ResizeObserver(() => { + setHeight(element.scrollHeight); + }); + + resizeObserver.observe(element); + + return () => { + resizeObserver.disconnect(); + }; + }, [elementRef]); + + return { height, elementRef }; +} diff --git a/src/@/components/ui/ScrollShadow/ScrollShadow.tsx b/src/@/components/ui/ScrollShadow/ScrollShadow.tsx index 08634f1754..eaa53ba83c 100644 --- a/src/@/components/ui/ScrollShadow/ScrollShadow.tsx +++ b/src/@/components/ui/ScrollShadow/ScrollShadow.tsx @@ -9,6 +9,7 @@ export function ScrollShadow(props: { children: React.ReactNode; className?: string; scrollableClassName?: string; + disableTopShadow?: boolean; }) { const scrollableEl = useRef(null); const shadowTopEl = useRef(null); @@ -79,6 +80,7 @@ export function ScrollShadow(props: { ref={shadowTopEl} style={{ opacity: "0", + display: props.disableTopShadow ? "none" : "block", }} >
; + +function Calendar({ + className, + classNames, + showOutsideDays = true, + ...props +}: CalendarProps) { + return ( + , + IconRight: () => , + }} + {...props} + /> + ); +} +Calendar.displayName = "Calendar"; + +export { Calendar }; diff --git a/src/@/components/ui/select.tsx b/src/@/components/ui/select.tsx new file mode 100644 index 0000000000..4fb729a750 --- /dev/null +++ b/src/@/components/ui/select.tsx @@ -0,0 +1,160 @@ +"use client"; + +import * as React from "react"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown, ChevronUp } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className, + )} + {...props} + > + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +}; diff --git a/src/@/components/ui/skeleton.tsx b/src/@/components/ui/skeleton.tsx index 2cdf440dcb..0c3e66aeaa 100644 --- a/src/@/components/ui/skeleton.tsx +++ b/src/@/components/ui/skeleton.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/forbid-dom-props */ import { cn } from "@/lib/utils"; function Skeleton({ @@ -12,4 +13,35 @@ function Skeleton({ ); } -export { Skeleton }; +function SkeletonContainer(props: { + loadedData?: T; + skeletonData: T; + className?: string; + render: (data: T, isSkeleton: boolean) => React.ReactNode; + style?: React.CSSProperties; +}) { + const isLoading = props.loadedData === undefined; + return ( +
+
+
+ {props.render(props.loadedData ?? props.skeletonData, !isLoading)} +
+
+
+ ); +} + +export { Skeleton, SkeletonContainer }; diff --git a/src/@/components/ui/tabs.tsx b/src/@/components/ui/tabs.tsx index 939fc0a203..a7acbe3435 100644 --- a/src/@/components/ui/tabs.tsx +++ b/src/@/components/ui/tabs.tsx @@ -13,34 +13,8 @@ export function TabLinks(props: { icon?: React.FC<{ className?: string }>; }[]; }) { - const containerRef = useRef(null); - const lineRef = useRef(null); - const [activeTabEl, setActiveTabEl] = useState( - null, - ); - - const activeTabRef = useCallback((el: HTMLAnchorElement | null) => { - setActiveTabEl(el); - }, []); - - useLayoutEffect(() => { - if (activeTabEl && containerRef.current && lineRef.current) { - const containerRect = containerRef.current.getBoundingClientRect(); - const lineEl = lineRef.current; - const rect = activeTabEl.getBoundingClientRect(); - lineEl.style.width = `${rect.width}px`; - lineEl.style.transform = `translateX(${rect.left - containerRect.left}px)`; - setTimeout(() => { - lineEl.style.transition = "transform 0.3s, width 0.3s"; - }, 0); - - activeTabEl.scrollIntoView({ - behavior: "smooth", - block: "nearest", - inline: "center", - }); - } - }, [activeTabEl]); + const { containerRef, lineRef, activeTabRef } = + useUnderline(); return (
@@ -79,3 +53,91 @@ export function TabLinks(props: {
); } + +export function TabButtons(props: { + tabs: { + name: string; + onClick: () => void; + isActive: boolean; + isEnabled?: boolean; + icon?: React.FC<{ className?: string }>; + }[]; + tabClassName?: string; + activeTabClassName?: string; + tabContainerClassName?: string; +}) { + const { containerRef, lineRef, activeTabRef } = + useUnderline(); + + return ( +
+ +
+ {props.tabs.map((tab) => { + return ( + + ); + })} +
+ + {/* Active line */} +
+
+ {/* Bottom line */} +
+
+ ); +} + +function useUnderline() { + const containerRef = useRef(null); + const lineRef = useRef(null); + const [activeTabEl, setActiveTabEl] = useState(null); + + const activeTabRef = useCallback((el: El | null) => { + setActiveTabEl(el); + }, []); + + useLayoutEffect(() => { + if (activeTabEl && containerRef.current && lineRef.current) { + const containerRect = containerRef.current.getBoundingClientRect(); + const lineEl = lineRef.current; + const rect = activeTabEl.getBoundingClientRect(); + lineEl.style.width = `${rect.width}px`; + lineEl.style.transform = `translateX(${rect.left - containerRect.left}px)`; + setTimeout(() => { + lineEl.style.transition = "transform 0.3s, width 0.3s"; + }, 0); + + activeTabEl.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + }, [activeTabEl]); + + return { containerRef, lineRef, activeTabRef }; +} diff --git a/src/@/styles/globals.css b/src/@/styles/globals.css index 96575e7c81..539d8a5df2 100644 --- a/src/@/styles/globals.css +++ b/src/@/styles/globals.css @@ -4,54 +4,89 @@ @layer base { :root { - --background: 0 0% 91.5%; + /* bg - nuetral */ + --background: 0 0% 100%; + --secondary: 0 0% 97%; + --muted: 0 0% 95%; + --accent: 0 0% 92%; + --card: var(--secondary); + --popover: var(--background); + --inverted: var(--foreground); + + /* bg - colorful */ + --primary: 221.21deg 83.19% 53.33%; + --destructive: 0 84.2% 90%; + --success: 142.09 60.56% 80%; + --warning: 40.61deg 96.12% 88%; + --foreground: 0 0% 3.9%; - --card: 0 0% 97%; + --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; - --primary: 221.21deg 83.19% 53.33%; - --primary-foreground: 221.21deg 83.19% 53.33%; - --secondary: 0 0% 94%; + + --primary-foreground: 0 0% 100%; --secondary-foreground: 0 0% 30%; - --muted: 0 0% 96%; + --muted-foreground: 0 0% 40%; - --accent: 0 0% 100%; + --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; + --success-foreground: 142.09 70.56% 35.29%; + --destructive-foreground: 0 84.24% 60.2%; + + /* Borders */ --border: 0 0% 80%; - --input: 0 0% 80%; + --input: var(--border); + --ring: 215.88 100% 60%; --radius: 0.5rem; - --inverted: var(--foreground); + --inverted-foreground: var(--background); --warning-foreground: 40.61deg 96.12% 40.4%; + --link-foreground: 221.21deg 83.19% 53.33%; } .dark { + /* bg - nuetral */ --background: 0 0% 4.5%; + --secondary: 0 0% 7%; + --muted: 0 0% 9%; + --accent: 0 0% 12%; + --card: var(--secondary); + --popover: var(--background); + --inverted: var(--foreground); + + /* bg - colorful */ + --primary: 215.88 100% 60%; + --destructive: 0 62.8% 10%; + --success: 156.2 71.6% 10%; + --warning: 40.61deg 96.12% 8%; + --foreground: 0 0% 98%; - --card: 0 0% 6%; --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; --popover-foreground: 0 0% 98%; - --primary: 215.88 100% 60%; - --primary-foreground: 215.88 100% 65%; - --secondary: 0 0% 6%; + + --primary-foreground: 0 0% 4.5%; + --secondary-foreground: 0 0% 75%; - --muted: 0 0% 8%; + --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 12%; + --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 84.24% 60.2%; + --success-foreground: 156.2 71.6% 66.86%; + + /* Borders */ --border: 0 0% 14.9%; - --input: 0 0% 14.9%; + --input: var(--border); + --ring: 215.88 100% 60%; --warning-foreground: 45.4deg 93.39% 47.45%; + --link-foreground: 215.88 100% 65%; } } diff --git a/src/app/(dashboard)/(chain)/[chain_id]/page.tsx b/src/app/(dashboard)/(chain)/[chain_id]/page.tsx index c6026ed98e..a792f4e786 100644 --- a/src/app/(dashboard)/(chain)/[chain_id]/page.tsx +++ b/src/app/(dashboard)/(chain)/[chain_id]/page.tsx @@ -68,7 +68,7 @@ export default async function Page() { View All diff --git a/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-card.tsx b/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-card.tsx index f37804f5be..a9d97fe0e0 100644 --- a/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-card.tsx +++ b/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-card.tsx @@ -78,14 +78,14 @@ export async function ChainListCard({ <> {chainMetadata?.verified && (
- +

Verified

)} {chainMetadata?.gasSponsored && (
- +

Gas Sponsored

)} diff --git a/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-row.tsx b/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-row.tsx index 86f9f12ef0..cc2bc38e2f 100644 --- a/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-row.tsx +++ b/src/app/(dashboard)/(chain)/chainlist/components/server/chainlist-row.tsx @@ -52,13 +52,13 @@ export async function ChainListRow({ {chainMetadata?.verified && ( - + )} {chainMetadata?.gasSponsored && ( - + )} diff --git a/src/app/(dashboard)/styleguide/page.tsx b/src/app/(dashboard)/styleguide/page.tsx index 48bbdc5e05..496fabe646 100644 --- a/src/app/(dashboard)/styleguide/page.tsx +++ b/src/app/(dashboard)/styleguide/page.tsx @@ -30,6 +30,7 @@ function Colors() { + @@ -46,7 +47,8 @@ function Colors() { - + + @@ -75,7 +77,7 @@ function TextColorPreview(props: { className: string }) { return (

{props.className}

-

+

The quick brown fox jumps over the lazy dog

diff --git a/src/app/components/Header/DashboardHeader.tsx b/src/app/components/Header/DashboardHeader.tsx index e2c6fbd385..ae65407ed8 100644 --- a/src/app/components/Header/DashboardHeader.tsx +++ b/src/app/components/Header/DashboardHeader.tsx @@ -10,7 +10,7 @@ import { CustomConnectWallet } from "@3rdweb-sdk/react/components/connect-wallet export function DashboardHeader() { return ( // the "h-24" avoids layout shift when connecting wallet (connected wallet button is taller than disconnected...) -
+
{/* Left */}
diff --git a/src/app/connect.tsx b/src/app/connect.tsx new file mode 100644 index 0000000000..b7820e7e69 --- /dev/null +++ b/src/app/connect.tsx @@ -0,0 +1,16 @@ +"use client"; + +import { ConnectButton } from "thirdweb/react"; +import { thirdwebClient } from "../lib/thirdweb-client"; +import { useTheme } from "next-themes"; + +export function CustomConnectButton() { + const { theme } = useTheme(); + + return ( + + ); +} diff --git a/src/components/analytics/area-chart.tsx b/src/components/analytics/area-chart.tsx index 87a55ef028..bd3d5076ea 100644 --- a/src/components/analytics/area-chart.tsx +++ b/src/components/analytics/area-chart.tsx @@ -1,5 +1,5 @@ +/* eslint-disable react/forbid-dom-props */ import { CustomToolTip } from "./custom-tooltip"; -import { Box, BoxProps, Center } from "@chakra-ui/react"; import { useEffect, useId, useState } from "react"; import { Area, @@ -9,7 +9,7 @@ import { XAxis, YAxis, } from "recharts"; -import { Text } from "tw-components"; +import { cn } from "../../@/lib/utils"; export type GenericDataType = Record; @@ -18,7 +18,7 @@ type IndexType = "date"; export interface AreaChartProps< TData extends GenericDataType, TIndexKey extends keyof TData, -> extends BoxProps { +> { data: TData[]; index: { id: TIndexKey; @@ -36,6 +36,8 @@ export interface AreaChartProps< showXAxis?: boolean; showYAxis?: boolean; startEndOnly?: boolean; + className?: string; + isAnimationActive?: boolean; } const AreaChart = < @@ -48,7 +50,7 @@ const AreaChart = < showXAxis, showYAxis, startEndOnly, - ...boxProps + className, }: AreaChartProps) => { const id = useId(); @@ -61,7 +63,7 @@ const AreaChart = < } return ( - +
@@ -140,13 +142,10 @@ const AreaChart = < }) : payload } - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", - }} - stroke="var(--chakra-colors-paragraph)" + className="text-xs font-sans" + stroke="hsl(var(--muted-foreground))" tickLine={false} - axisLine={{ stroke: "var(--chakra-colors-borderColor)" }} + axisLine={{ stroke: "hsl(var(--border))" }} interval="preserveStartEnd" minTickGap={5} domain={["dataMin", "dataMax"]} @@ -168,10 +167,7 @@ const AreaChart = < ? category.format(payload) : payload.toString(); }} - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", - }} + className="text-xs font-sans" domain={([dataMin, dataMax]) => [ // start from 0 unless dataMin is below 0 in which case start from dataMin - 10% Math.min(0, dataMin - Math.round(dataMin * 0.1)), @@ -180,14 +176,14 @@ const AreaChart = < ]} tick={{ transform: "translate(-3, 0)" }} type="number" - stroke="var(--chakra-colors-paragraph)" + stroke="hsl(var(--muted-foreground))" tickLine={false} - axisLine={{ stroke: "var(--chakra-colors-borderColor)" }} + axisLine={{ stroke: "hsl(var(--border))" }} interval="preserveStartEnd" /> - +
); }; @@ -206,8 +202,8 @@ function generateFakeData() { return data; } -export const AreaChartLoadingState: React.FC = () => { - const [loadingData, setLoadingData] = useState(generateFakeData()); +export const AreaChartLoadingState = (props: { height?: string }) => { + const [loadingData, setLoadingData] = useState(() => generateFakeData()); // legitimate use case // eslint-disable-next-line no-restricted-syntax @@ -218,26 +214,21 @@ export const AreaChartLoadingState: React.FC = () => { return () => clearInterval(interval); }, []); return ( - -
- - Loading Chart... - -
+
+
+

Loading Chart

+
- +
); }; diff --git a/src/components/analytics/auto-bar-chart.tsx b/src/components/analytics/auto-bar-chart.tsx index 4d059fea60..da227a44b1 100644 --- a/src/components/analytics/auto-bar-chart.tsx +++ b/src/components/analytics/auto-bar-chart.tsx @@ -1,5 +1,5 @@ +import { useTheme } from "next-themes"; import { StackToolTip } from "./stack-tooltip"; -import { Box, BoxProps, useColorMode } from "@chakra-ui/react"; import { useId, useMemo, useState } from "react"; import { Bar, @@ -17,7 +17,7 @@ type IndexType = "date"; interface AutoBarChartProps< TData extends GenericDataType, TIndexKey extends keyof TData, -> extends BoxProps { +> { data: TData[]; index: { id: TIndexKey; @@ -81,19 +81,18 @@ export const AutoBarChart = < showXAxis, showYAxis, stacked, - ...boxProps }: AutoBarChartProps) => { - const { colorMode } = useColorMode(); + const { theme } = useTheme(); const [hoverKey, setHoverKey] = useState(""); const id = useId(); const barColors = useMemo(() => { - if (colorMode === "light") { + if (theme === "light") { return BAR_COLORS_LIGHT; } return BAR_COLORS_DARK; - }, [colorMode]); + }, [theme]); const categories = useMemo(() => { const autoKeys: string[] = []; @@ -131,126 +130,118 @@ export const AutoBarChart = < } return ( - - - - - {categories.map((cat) => ( - - - - - ))} - - + + + {categories.map((cat) => ( - { - setHoverKey(item.tooltipPayload[0].dataKey); - }} - onMouseLeave={() => { - setHoverKey(""); - }} - /> + id={`bar_color_${id}_${cat.id as string}`} + x1="0" + y1="0" + x2="0" + y2="100%" + gradientUnits="userSpaceOnUse" + > + + + ))} - { - if (!active || !payload) { - return null; - } - - const { time, ...values } = payload[0].payload; - return ( - - ); + + + {categories.map((cat) => ( + { + setHoverKey(item.tooltipPayload[0].dataKey); }} - cursor={ - !hoverKey || categories.length <= 1 - ? { - stroke: "#EAEAEA", - fill: "#EAEAEA", - opacity: 0.3, - strokeDasharray: 2, - strokeWidth: 0, - } - : false - } - /> - - - index.format - ? index.format(payload) - : index.type === "date" - ? new Date(payload).toLocaleDateString(undefined, { - day: "2-digit", - month: "2-digit", - year: "2-digit", - }) - : payload - } - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", + onMouseLeave={() => { + setHoverKey(""); }} - stroke="var(--chakra-colors-paragraph)" - tickLine={false} - axisLine={false} - interval="preserveStartEnd" - minTickGap={5} - domain={["dataMin - 86400000", "dataMax + 86400000"]} - type="number" - tick={{ transform: "translate(0, 6)" }} - ticks={[ - sortedData[0][index.id], - sortedData[Math.floor(sortedData.length / 2)][index.id], - sortedData[sortedData.length - 1][index.id], - ]} /> + ))} + { + if (!active || !payload) { + return null; + } - { - return payload.toLocaleString(); - }} - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", - }} - type="number" - stroke="var(--chakra-colors-paragraph)" - tickLine={false} - axisLine={false} - /> - - - + const { time, ...values } = payload[0].payload; + return ( + + ); + }} + cursor={ + !hoverKey || categories.length <= 1 + ? { + stroke: "#EAEAEA", + fill: "#EAEAEA", + opacity: 0.3, + strokeDasharray: 2, + strokeWidth: 0, + } + : false + } + /> + + + index.format + ? index.format(payload) + : index.type === "date" + ? new Date(payload).toLocaleDateString(undefined, { + day: "2-digit", + month: "2-digit", + year: "2-digit", + }) + : payload + } + className="text-xs font-sans" + stroke="hsl(var(--muted-foreground))" + tickLine={false} + axisLine={false} + interval="preserveStartEnd" + minTickGap={5} + domain={["dataMin - 86400000", "dataMax + 86400000"]} + type="number" + tick={{ transform: "translate(0, 6)" }} + ticks={[ + sortedData[0][index.id], + sortedData[Math.floor(sortedData.length / 2)][index.id], + sortedData[sortedData.length - 1][index.id], + ]} + /> + + { + return payload.toLocaleString(); + }} + className="text-xs font-sans" + type="number" + stroke="hsl(var(--muted-foreground))" + tickLine={false} + axisLine={false} + /> + + ); }; diff --git a/src/components/analytics/bar-chart.tsx b/src/components/analytics/bar-chart.tsx index ae71e3d6c3..69ccd239e5 100644 --- a/src/components/analytics/bar-chart.tsx +++ b/src/components/analytics/bar-chart.tsx @@ -1,5 +1,5 @@ +import { useTheme } from "next-themes"; import { CustomToolTip } from "./custom-tooltip"; -import { Box, BoxProps, useColorMode } from "@chakra-ui/react"; import { useId, useMemo } from "react"; import { Bar, @@ -17,7 +17,7 @@ type IndexType = "date"; interface BarChartProps< TData extends GenericDataType, TIndexKey extends keyof TData, -> extends BoxProps { +> { data: TData[]; index: { id: TIndexKey; @@ -46,18 +46,17 @@ export const BarChart = < categories, showXAxis, showYAxis, - ...boxProps }: BarChartProps) => { - const { colorMode } = useColorMode(); + const { theme } = useTheme(); const id = useId(); const defaultBarColor = useMemo(() => { - if (colorMode === "light") { + if (theme === "light") { return "#649CDD"; } return "#3682DA"; - }, [colorMode]); + }, [theme]); if (!data.length) { return null; @@ -68,120 +67,112 @@ export const BarChart = < } return ( - - - - - {categories.map((cat) => ( - - - - - ))} - - + + + {categories.map((cat) => ( - + id={`bar_color_${id}_${cat.id as string}`} + x1="0" + y1="0" + x2="0" + y2="100%" + gradientUnits="userSpaceOnUse" + > + + + ))} - { - const payloadKey = payload?.[0]?.dataKey; - const category = categories.find((cat) => cat.id === payloadKey); - return ( - - ); - }} - cursor={{ - stroke: defaultBarColor, - fill: defaultBarColor, - opacity: 0.2, - strokeDasharray: 2, - strokeWidth: 0, - }} - /> + - - index.format - ? index.format(payload) - : index.type === "date" - ? new Date(payload).toLocaleDateString(undefined, { - day: "2-digit", - month: "2-digit", - year: "2-digit", - }) - : payload - } - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", - }} - stroke="var(--chakra-colors-paragraph)" - tickLine={false} - axisLine={false} - interval="preserveStartEnd" - minTickGap={5} - domain={["dataMin - 86400000", "dataMax + 86400000"]} - type="number" - tick={{ transform: "translate(0, 6)" }} - ticks={[ - data[0][index.id], - data[Math.floor(data.length / 2)][index.id], - data[data.length - 1][index.id], - ]} + {categories.map((cat) => ( + + ))} + { + const payloadKey = payload?.[0]?.dataKey; + const category = categories.find((cat) => cat.id === payloadKey); + return ( + + ); + }} + cursor={{ + stroke: defaultBarColor, + fill: defaultBarColor, + opacity: 0.2, + strokeDasharray: 2, + strokeWidth: 0, + }} + /> - { - const category = categories[0]; - return category?.format - ? category.format(payload) - : payload.toLocaleString(); - }} - style={{ - fontSize: "12px", - fontFamily: "var(--chakra-fonts-body)", - }} - type="number" - stroke="var(--chakra-colors-paragraph)" - tickLine={false} - axisLine={false} - /> - - - + + index.format + ? index.format(payload) + : index.type === "date" + ? new Date(payload).toLocaleDateString(undefined, { + day: "2-digit", + month: "2-digit", + year: "2-digit", + }) + : payload + } + className="font-sans text-xs" + stroke="hsl(var(--muted-foreground))" + tickLine={false} + axisLine={false} + interval="preserveStartEnd" + minTickGap={5} + domain={["dataMin - 86400000", "dataMax + 86400000"]} + type="number" + tick={{ transform: "translate(0, 6)" }} + ticks={[ + data[0][index.id], + data[Math.floor(data.length / 2)][index.id], + data[data.length - 1][index.id], + ]} + /> + + { + const category = categories[0]; + return category?.format + ? category.format(payload) + : payload.toLocaleString(); + }} + className="font-sans text-xs" + stroke="hsl(var(--muted-foreground))" + type="number" + tickLine={false} + axisLine={false} + /> + + ); }; diff --git a/src/components/analytics/chart-container.tsx b/src/components/analytics/chart-container.tsx index f92c84c868..79a24950fb 100644 --- a/src/components/analytics/chart-container.tsx +++ b/src/components/analytics/chart-container.tsx @@ -1,31 +1,35 @@ import { AreaChartLoadingState } from "./area-chart"; -import { AspectRatio, AspectRatioProps, Flex } from "@chakra-ui/react"; import { Suspense } from "react"; import { ComponentWithChildren } from "types/component-with-children"; +import { AspectRatio } from "../../@/components/ui/aspect-ratio"; +import { cn } from "../../@/lib/utils"; type SupportedChartType = "area"; -interface ChartContainerProps extends AspectRatioProps { +interface ChartContainerProps { chartTitle?: JSX.Element; chartType?: SupportedChartType; + ratio: number; + className?: string; } export const ChartContainer: ComponentWithChildren = ({ chartType = "area", chartTitle, + ratio, children, - ...aspectRatioProps + className, }) => { return ( - +
{chartTitle} - + {/* suspense to handle loading state */} }> {children} - +
); }; diff --git a/src/components/analytics/custom-tooltip.tsx b/src/components/analytics/custom-tooltip.tsx index b6c9d8adf1..9dd728324a 100644 --- a/src/components/analytics/custom-tooltip.tsx +++ b/src/components/analytics/custom-tooltip.tsx @@ -1,6 +1,3 @@ -import { Flex } from "@chakra-ui/react"; -import { Heading, Text } from "tw-components"; - type CustomToolTipProps = { valueLabel: string; active?: boolean; @@ -22,47 +19,31 @@ export const CustomToolTip: React.FC = ({ }) => { if (active && payload && payload.length) { return ( - +
{payload[0]?.payload?.time && ( - - +
+ +

{new Date(payload[0].payload.time).toLocaleDateString( undefined, formattingOptions, )} - - +

+
)} - - +
+ +

{valueFormatter ? valueFormatter(payload[0].value) : payload[0].value.toLocaleString()} - - - +

+
+
); } diff --git a/src/components/analytics/stack-tooltip.tsx b/src/components/analytics/stack-tooltip.tsx index bd0a469dcf..f6b0385d6f 100644 --- a/src/components/analytics/stack-tooltip.tsx +++ b/src/components/analytics/stack-tooltip.tsx @@ -1,5 +1,4 @@ -import { Flex, useColorMode } from "@chakra-ui/react"; -import { Heading, Text } from "tw-components"; +import { cn } from "../../@/lib/utils"; type CustomToolTipProps = { time: string; @@ -18,44 +17,25 @@ export const StackToolTip: React.FC = ({ values, hoverKey, }) => { - const { colorMode } = useColorMode(); - return ( - - - - Date - - +
+
+ +

{new Date(time).toLocaleDateString(undefined, formattingOptions)} - - +

+
- +
{Object.entries(values) .reverse() .map(([key, value]) => ( - {hoverKey && key !== hoverKey ? ( `${key}: ` @@ -63,9 +43,9 @@ export const StackToolTip: React.FC = ({ {key}: )} {value.toLocaleString()} - +

))} - - +
+
); }; diff --git a/src/components/pay/PayAnalytics/PayAnalytics.tsx b/src/components/pay/PayAnalytics/PayAnalytics.tsx new file mode 100644 index 0000000000..4f4181f2c6 --- /dev/null +++ b/src/components/pay/PayAnalytics/PayAnalytics.tsx @@ -0,0 +1,189 @@ +/* eslint-disable react/forbid-dom-props */ +import { useState } from "react"; +import { DatePickerWithRange } from "../../../@/components/ui/DatePickerWithRange"; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "../../../@/components/ui/select"; +import { PayNewCustomers } from "./components/PayNewCustomers"; +import { Payouts } from "./components/Payouts"; +import { PaymentsSuccessRate } from "./components/PaymentsSuccessRate"; +import { TotalPayVolume } from "./components/TotalPayVolume"; +import { TotalVolumePieChart } from "./components/TotalVolumePieChart"; +import { ApiKey } from "@3rdweb-sdk/react/hooks/useApi"; +import { format } from "date-fns"; +import { TopPayCustomers } from "./components/TopPayCustomers"; +import { PaymentHistory } from "./components/PaymentHistory"; + +type LastX = "last-7" | "last-30" | "last-60" | "last-120"; + +type Range = { + type: LastX | "custom"; + label?: string; + from: Date; + to: Date; +}; + +export function PayAnalytics(props: { apiKey: ApiKey }) { + const clientId = props.apiKey.key; + const [range, setRange] = useState(() => + getLastNDaysRange("last-120"), + ); + + return ( +
+
+ +
+ +
+ + +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+
+ ); +} + +function getLastNDaysRange(type: LastX) { + const todayDate = new Date(); + const pastDate = new Date(todayDate); + + let days = 0; + let label = ""; + if (type === "last-7") { + days = 7; + label = "Last 7 Days"; + } else if (type === "last-30") { + days = 30; + label = "Last 30 Days"; + } else if (type === "last-60") { + days = 60; + label = "Last 60 Days"; + } else if (type === "last-120") { + days = 120; + label = "Last 120 Days"; + } + + pastDate.setDate(todayDate.getDate() - days); + + const value: Range = { + type, + from: pastDate, + to: todayDate, + label, + }; + + return value; +} + +function Filters(props: { range: Range; setRange: (range: Range) => void }) { + const { range, setRange } = props; + + const presets = ( +
+ +
+ ); + + return ( +
+ + setRange({ + from, + to: range.to, + type: "custom", + }) + } + setTo={(to) => + setRange({ + from: range.from, + to, + type: "custom", + }) + } + header={presets} + labelOverride={range.label} + /> +
+ ); +} + +function GridWithSeparator(props: { children: React.ReactNode }) { + return ( +
+ {props.children} + {/* Desktop - horizontal middle */} +
+
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/ExportToCSVButton.tsx b/src/components/pay/PayAnalytics/components/ExportToCSVButton.tsx new file mode 100644 index 0000000000..ac5ceee23f --- /dev/null +++ b/src/components/pay/PayAnalytics/components/ExportToCSVButton.tsx @@ -0,0 +1,39 @@ +import { DownloadIcon } from "lucide-react"; +import { Button } from "../../../../@/components/ui/button"; + +export function ExportToCSVButton(props: { + getData: () => { header: string[]; rows: string[][] }; + fileName: string; +}) { + return ( + + ); +} + +function exportToCSV( + fileName: string, + data: { header: string[]; rows: string[][] }, +) { + const { header, rows } = data; + const csvContent = `data:text/csv;charset=utf-8,${header.join(",")}\n${rows + .map((e) => e.join(",")) + .join("\n")}`; + + const encodedUri = encodeURI(csvContent); + const link = document.createElement("a"); + link.setAttribute("href", encodedUri); + link.setAttribute("download", `${fileName}.csv`); + document.body.appendChild(link); + + link.click(); + document.body.removeChild(link); +} diff --git a/src/components/pay/PayAnalytics/components/IntervalSelector.tsx b/src/components/pay/PayAnalytics/components/IntervalSelector.tsx new file mode 100644 index 0000000000..5e8da0fcc8 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/IntervalSelector.tsx @@ -0,0 +1,29 @@ +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "@/components/ui/select"; + +export function IntervalSelector(props: { + intervalType: "day" | "week"; + setIntervalType: (intervalType: "day" | "week") => void; +}) { + return ( + + ); +} diff --git a/src/components/pay/PayAnalytics/components/PayNewCustomers.tsx b/src/components/pay/PayAnalytics/components/PayNewCustomers.tsx new file mode 100644 index 0000000000..46f7ac274b --- /dev/null +++ b/src/components/pay/PayAnalytics/components/PayNewCustomers.tsx @@ -0,0 +1,199 @@ +import { useId, useState } from "react"; +import { Area, AreaChart, ResponsiveContainer, Tooltip, XAxis } from "recharts"; +import { usePayNewCustomers } from "../hooks/usePayNewCustomers"; +import { IntervalSelector } from "./IntervalSelector"; +import { + CardHeading, + ChangeBadge, + NoDataAvailable, + chartHeight, +} from "./common"; +import { format } from "date-fns"; +import { SkeletonContainer } from "../../../../@/components/ui/skeleton"; +import { AreaChartLoadingState } from "../../../analytics/area-chart"; + +type GraphDataItem = { + date: string; + value: number; +}; + +type UIData = { + graphData: GraphDataItem[]; + totalNewCustomers: number; + percentChange: number; +}; + +export function PayNewCustomers(props: { + clientId: string; + from: Date; + to: Date; +}) { + const [intervalType, setIntervalType] = useState<"day" | "week">("day"); + const newCustomersQuery = usePayNewCustomers({ + clientId: props.clientId, + from: props.from, + to: props.to, + intervalType, + }); + + function getUIData(): { + data?: UIData; + isError?: boolean; + isLoading?: boolean; + } { + if (newCustomersQuery.isLoading) { + return { isLoading: true }; + } + + if (newCustomersQuery.isError) { + return { isError: true }; + } + + if (newCustomersQuery.data.intervalResults.length === 0) { + return { isError: true }; + } + + const newCusomtersData: GraphDataItem[] = + newCustomersQuery.data.intervalResults.map((x) => { + return { + date: format(new Date(x.interval), "LLL dd"), + value: x.distinctCustomers, + }; + }); + + const totalNewCustomers = + newCustomersQuery.data.aggregate.distinctCustomers; + + return { + data: { + graphData: newCusomtersData, + totalNewCustomers, + percentChange: + newCustomersQuery.data.aggregate.bpsIncreaseFromPriorRange / 100, + }, + }; + } + + const uiData = getUIData(); + + return ( +
+ {/* header */} +
+ New Customers + + {uiData.data && ( + + )} +
+ + {/* Chart */} + {!uiData.isError ? ( + + ) : ( + + )} +
+ ); +} + +function RenderData(props: { + data?: UIData; + intervalType: "day" | "week"; + setIntervalType: (intervalType: "day" | "week") => void; +}) { + const uniqueId = useId(); + + return ( +
+
+ { + return ( +

{v}

+ ); + }} + /> + + { + return ; + }} + /> +
+ +
+ {props.data?.graphData ? ( + + + + + + + + + + { + const payload = x.payload?.[0]?.payload as + | GraphDataItem + | undefined; + return ( +
+

+ {payload?.date} +

+

+ Customers: {payload?.value} +

+
+ ); + }} + /> + + + +
+
+ ) : ( + + )} +
+
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/PaymentHistory.tsx b/src/components/pay/PayAnalytics/components/PaymentHistory.tsx new file mode 100644 index 0000000000..aebc923683 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/PaymentHistory.tsx @@ -0,0 +1,316 @@ +import { + usePayPurchases, + type PayPurchasesData, +} from "../hooks/usePayPurchases"; +import { CardHeading, NoDataAvailable } from "./common"; +import { CopyAddressButton } from "../../../../@/components/ui/CopyAddressButton"; +import { Button } from "@/components/ui/button"; +import { Badge } from "../../../../@/components/ui/badge"; +import { cn } from "../../../../@/lib/utils"; +import { format } from "date-fns"; +import { ScrollShadow } from "../../../../@/components/ui/ScrollShadow/ScrollShadow"; +import { Spinner } from "../../../../@/components/ui/Spinner/Spinner"; +import { ExportToCSVButton } from "./ExportToCSVButton"; +import { Skeleton } from "../../../../@/components/ui/skeleton"; + +type UIData = { + purchases: PayPurchasesData["purchases"]; + showLoadMore: boolean; +}; + +export function PaymentHistory(props: { + clientId: string; + from: Date; + to: Date; +}) { + const purchasesQuery = usePayPurchases({ + clientId: props.clientId, + from: props.from, + to: props.to, + pageSize: 100, + }); + + function getUIData(): { + data?: UIData; + isLoading?: boolean; + isError?: boolean; + } { + if (purchasesQuery.isLoading) { + return { isLoading: true }; + } + if (purchasesQuery.isError) { + return { isError: true }; + } + + const purchases = purchasesQuery.data.pages.flatMap( + (page) => page.pageData.purchases, + ); + + if (purchases.length === 0) { + return { isError: true }; + } + + return { + data: { + purchases, + showLoadMore: !!purchasesQuery.hasNextPage, + }, + }; + } + + const uiData = getUIData(); + const purchases = uiData.data?.purchases; + + return ( +
+
+ Transaction History + {purchases && ( + { + return getCSVData(purchases); + }} + /> + )} +
+ +
+ + {!uiData.isError ? ( + purchasesQuery.fetchNextPage()} + isLoadingMore={purchasesQuery.isFetching} + /> + ) : ( + + )} +
+ ); +} + +function RenderData(props: { + data?: UIData; + loadMore: () => void; + isLoadingMore: boolean; +}) { + return ( + + + + + Amount + Type + Paid + Bought + Status + Recipient + Date + + + + {props.data ? ( + <> + {props.data.purchases.map((purchase) => { + return ( + + ); + })} + + ) : ( + <> + {new Array(20).fill(0).map((_, i) => ( + + ))} + + )} + +
+ + {props.data && ( + <> + {props.data?.showLoadMore ? ( +
+ +
+ ) : ( +

+ No more transactions +

+ )} + + )} +
+ ); +} + +function TableRow(props: { purchase: PayPurchasesData["purchases"][0] }) { + const { purchase } = props; + + return ( + + {/* Amount */} + + {(purchase.toAmountUSDCents / 100).toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} + + + {/* Type */} + + + {purchase.purchaseType === "ONRAMP" ? "Fiat" : "Crypto"} + + + + {/* Paid */} + + {purchase.purchaseType === "SWAP" + ? purchase.fromToken.symbol + : purchase.fromCurrencySymbol} + + + {/* Bought */} + {purchase.toToken.symbol} + + {/* Status */} + + + {purchase.status} + + + + {/* Address */} + + + + + {/* Date */} + +

+ {format(new Date(purchase.updatedAt), "LLL dd, y h:mm a")} +

+
+ + ); +} + +function SkeletonTableRow(props: { rowIndex: number }) { + const skeleton = ( + + ); + + return ( + + {skeleton} + {skeleton} + {skeleton} + {skeleton} + {skeleton} + {skeleton} + {skeleton} + + ); +} + +function TableData({ children }: { children: React.ReactNode }) { + return {children}; +} + +function TableHeading(props: { children: React.ReactNode }) { + return ( + + {props.children} + + ); +} + +function getCSVData(data: PayPurchasesData["purchases"]) { + const header = [ + "Amount", + "Type", + "Status", + // to + "Buy Token address", + "Buy Token chain", + "Buy Token Symbol", + // from + "From Token address", + "From Token chain", + "From Token Symbol", + "From currency", + // status + "Recipient", + // recipient + "Date", + ]; + + const rows: string[][] = data.map((purchase) => [ + // amount + (purchase.toAmountUSDCents / 100).toLocaleString("en-US", { + currency: "USD", + style: "currency", + }), + // type + purchase.purchaseType === "ONRAMP" ? "Fiat" : "Crypto", + // status + purchase.status, + // to + purchase.toToken.tokenAddress, + `${purchase.toToken.chainId}`, + purchase.toToken.symbol, + // from + purchase.purchaseType === "SWAP" ? purchase.fromToken.tokenAddress : "", + purchase.purchaseType === "SWAP" ? `${purchase.fromToken.chainId}` : "", + purchase.purchaseType === "SWAP" ? purchase.fromToken.symbol : "", + purchase.purchaseType === "ONRAMP" ? purchase.fromCurrencySymbol : "", + + // recipient + purchase.toAddress, + format(new Date(purchase.updatedAt), "LLL dd y h:mm a"), + ]); + + return { header, rows }; +} diff --git a/src/components/pay/PayAnalytics/components/PaymentsSuccessRate.tsx b/src/components/pay/PayAnalytics/components/PaymentsSuccessRate.tsx new file mode 100644 index 0000000000..1e13537ee2 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/PaymentsSuccessRate.tsx @@ -0,0 +1,189 @@ +import { useState } from "react"; +import { CardHeading, NoDataAvailable } from "./common"; +import { usePayVolume } from "../hooks/usePayVolume"; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "@/components/ui/select"; +import { SkeletonContainer } from "../../../../@/components/ui/skeleton"; + +type UIData = { + succeeded: number; + failed: number; + rate: number; + total: number; +}; + +/* eslint-disable react/forbid-dom-props */ +export function PaymentsSuccessRate(props: { + clientId: string; + from: Date; + to: Date; +}) { + const [type, setType] = useState<"all" | "crypto" | "fiat">("all"); + const volumeQuery = usePayVolume({ + clientId: props.clientId, + from: props.from, + to: props.to, + intervalType: "day", + }); + + function getUIData(): { + data?: UIData; + isError?: boolean; + isLoading?: boolean; + } { + if (volumeQuery.isLoading) { + return { isLoading: true }; + } + + if (volumeQuery.isError) { + return { isError: true }; + } + + const aggregated = volumeQuery.data.aggregate; + let data: UIData; + + if (type === "all") { + const succeeded = aggregated.sum.succeeded.count; + const failed = aggregated.sum.failed.count; + const total = succeeded + failed; + const rate = (succeeded / (succeeded + failed)) * 100; + data = { succeeded, failed, rate, total }; + } else if (type === "crypto") { + const succeeded = aggregated.buyWithCrypto.succeeded.count; + const failed = aggregated.buyWithCrypto.failed.count; + const total = succeeded + failed; + const rate = (succeeded / (succeeded + failed)) * 100; + data = { succeeded, failed, rate, total }; + } else if (type === "fiat") { + const succeeded = aggregated.buyWithFiat.succeeded.count; + const failed = aggregated.buyWithFiat.failed.count; + const total = succeeded + failed; + const rate = (succeeded / (succeeded + failed)) * 100; + data = { succeeded, failed, rate, total }; + } else { + throw new Error("Invalid tab"); + } + + if (data.total === 0) { + return { + isError: true, + }; + } + + return { data }; + } + + const uiData = getUIData(); + + return ( +
+
+ Payments + {uiData.data && ( + + )} +
+ +
+ {!uiData.isError ? ( + + ) : ( + + )} +
+
+ ); +} + +function RenderData(props: { data?: UIData }) { + return ( +
+
+ } + > + +
+ + + +
+ + +
+ ); +} + +function Bar(props: { rate: number }) { + return ( +
+
+
+
+ ); +} + +function InfoRow(props: { + label: string; + type: "success" | "failure"; + amount?: number; +}) { + return ( +
+
+
+

{props.label}

+
+ { + return ( +

+ {v.toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+ ); + }} + /> +
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/Payouts.tsx b/src/components/pay/PayAnalytics/components/Payouts.tsx new file mode 100644 index 0000000000..e7db0e2314 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/Payouts.tsx @@ -0,0 +1,185 @@ +import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis } from "recharts"; +import { usePayVolume } from "../hooks/usePayVolume"; +import { useState } from "react"; +import { IntervalSelector } from "./IntervalSelector"; +import { + CardHeading, + ChangeBadge, + NoDataAvailable, + chartHeight, +} from "./common"; +import { format } from "date-fns"; +import { useQuery } from "@tanstack/react-query"; +import { SkeletonContainer } from "../../../../@/components/ui/skeleton"; +import { AreaChartLoadingState } from "../../../analytics/area-chart"; + +type GraphData = { + date: string; + value: number; +}; + +type UIQueryData = { + totalPayoutsUSD: number; + graphData: GraphData[]; + percentChange: number; +}; + +export function Payouts(props: { clientId: string; from: Date; to: Date }) { + const [intervalType, setIntervalType] = useState<"day" | "week">("day"); + const payoutsQuery = usePayVolume({ + clientId: props.clientId, + from: props.from, + to: props.to, + intervalType, + }); + + const uiQuery = useQuery({ + queryKey: ["Payouts", payoutsQuery.data], + enabled: !!payoutsQuery.data, + retry: payoutsQuery.isError || false, + queryFn: async () => { + if (!payoutsQuery.data) { + throw new Error("Unexpected"); + } + + if (payoutsQuery.data.intervalResults.length === 0) { + throw new Error("No data available"); + } + + const totalPayoutsUSD = + payoutsQuery.data.aggregate.payouts.amountUSDCents / 100; + + const graphData: GraphData[] = payoutsQuery.data.intervalResults.map( + (result) => ({ + date: format(new Date(result.interval), "LLL dd"), + value: result.payouts.amountUSDCents / 100, + }), + ); + + const percentChange = + payoutsQuery.data.aggregate.payouts.bpsIncreaseFromPriorRange / 100; + + return { totalPayoutsUSD, graphData, percentChange }; + }, + }); + + return ( +
+ {/* header */} +
+ Payouts + + {uiQuery.data && ( + + )} +
+ + {!uiQuery.isError ? ( + + ) : ( + + )} +
+ ); +} + +function RenderData(props: { + data?: UIQueryData; + intervalType: "day" | "week"; + setIntervalType: (intervalType: "day" | "week") => void; +}) { + return ( +
+
+ { + return ( +

+ {value.toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+ ); + }} + /> + + { + return ; + }} + /> +
+ +
+ {props.data?.graphData ? ( + + + { + const payload = x.payload?.[0]?.payload as + | GraphData + | undefined; + return ( +
+

+ {payload?.date} +

+

+ {payload?.value.toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+
+ ); + }} + cursor={{ fill: "hsl(var(--accent))", radius: 8 }} + /> + + + +
+
+ ) : ( + + )} +
+ + {props.data && ( +
+ +
+ )} +
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/TopPayCustomers.tsx b/src/components/pay/PayAnalytics/components/TopPayCustomers.tsx new file mode 100644 index 0000000000..c66b8aa22a --- /dev/null +++ b/src/components/pay/PayAnalytics/components/TopPayCustomers.tsx @@ -0,0 +1,218 @@ +import { CopyAddressButton } from "../../../../@/components/ui/CopyAddressButton"; +import { CardHeading, NoDataAvailable } from "./common"; +import { + usePayTopCustomers, + type PayTopCustomersData, +} from "../hooks/usePayTopCustomers"; +import { Button } from "../../../../@/components/ui/button"; +import { ScrollShadow } from "../../../../@/components/ui/ScrollShadow/ScrollShadow"; +import { ExportToCSVButton } from "./ExportToCSVButton"; +import { SkeletonContainer } from "../../../../@/components/ui/skeleton"; + +type UIData = { + customers: Array<{ + walletAddress: string; + totalSpendUSDCents: number; + }>; + showLoadMore: boolean; +}; + +export function TopPayCustomers(props: { + clientId: string; + from: Date; + to: Date; +}) { + const topCustomersQuery = usePayTopCustomers({ + clientId: props.clientId, + from: props.from, + to: props.to, + pageSize: 100, + }); + + function getUIData(): { + data?: UIData; + isError?: boolean; + isLoading?: boolean; + } { + if (topCustomersQuery.isLoading) { + return { isLoading: true }; + } + + if (topCustomersQuery.isError) { + return { isError: true }; + } + + let customers = topCustomersQuery.data.pages.flatMap( + (x) => x.pageData.customers, + ); + + customers = customers.filter((x) => x.totalSpendUSDCents > 0); + + if (customers.length === 0) { + return { isError: true }; + } + + return { + data: { + customers, + showLoadMore: !!topCustomersQuery.hasNextPage, + }, + }; + } + + const uiData = getUIData(); + const customersData = uiData.data?.customers; + + return ( +
+ {/* header */} +
+ Top customers by spend + {customersData && ( + { + return getCSVData(customersData); + }} + /> + )} +
+ +
+ + {!uiData.isError ? ( + { + topCustomersQuery.fetchNextPage(); + }} + /> + ) : ( + + )} +
+ ); +} + +function RenderData(props: { data?: UIData; loadMore: () => void }) { + return ( + + + + + Wallet Address + Total spend + + + + {props.data ? ( + props.data?.customers.map((customer, i) => { + return ( + + ); + }) + ) : ( + <> + {new Array(5).fill(0).map((_, i) => ( + + ))} + + )} + +
+ + {props.data?.showLoadMore && ( +
+ +
+ )} +
+ ); +} + +function TableRow(props: { + customer?: { + walletAddress: string; + totalSpendUSDCents: number; + }; + rowIndex: number; +}) { + const delayAnim = { + animationDelay: `${props.rowIndex * 100}ms`, + }; + + return ( + + + { + return ( + + ); + }} + /> + + + { + return ( +

+ {(v / 100).toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+ ); + }} + /> +
+ + ); +} + +function TableData({ children }: { children: React.ReactNode }) { + return {children}; +} + +function TableHeading(props: { children: React.ReactNode }) { + return ( + + {props.children} + + ); +} + +function getCSVData(data: PayTopCustomersData["customers"]) { + const header = ["Wallet Address", "Total spend"]; + const rows = data.map((customer) => [ + customer.walletAddress, + (customer.totalSpendUSDCents / 100).toLocaleString("en-US", { + currency: "USD", + style: "currency", + }), + ]); + + return { header, rows }; +} diff --git a/src/components/pay/PayAnalytics/components/TotalPayVolume.tsx b/src/components/pay/PayAnalytics/components/TotalPayVolume.tsx new file mode 100644 index 0000000000..ae8b02ffa8 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/TotalPayVolume.tsx @@ -0,0 +1,201 @@ +/* eslint-disable react/forbid-dom-props */ +import { useId, useState } from "react"; +import { Area, AreaChart, ResponsiveContainer, Tooltip, XAxis } from "recharts"; +import { usePayVolume, type PayVolumeData } from "../hooks/usePayVolume"; +import { CardHeading, NoDataAvailable, chartHeight } from "./common"; +import { IntervalSelector } from "./IntervalSelector"; +import { format } from "date-fns"; +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "@/components/ui/select"; +import { AreaChartLoadingState } from "../../../analytics/area-chart"; + +type GraphData = { + date: string; + value: number; +}; + +export function TotalPayVolume(props: { + clientId: string; + from: Date; + to: Date; +}) { + const [intervalType, setIntervalType] = useState<"day" | "week">("day"); + + const volumeQuery = usePayVolume({ + clientId: props.clientId, + from: props.from, + intervalType, + to: props.to, + }); + + return ( +
+ {!volumeQuery.isError ? ( + + ) : ( + + )} +
+ ); +} + +function RenderData(props: { + data?: PayVolumeData; + intervalType: "day" | "week"; + setIntervalType: (intervalType: "day" | "week") => void; +}) { + const uniqueId = useId(); + const [successType, setSuccessType] = useState<"success" | "fail">("success"); + const [type, setType] = useState<"all" | "crypto" | "fiat">("all"); + + const graphData: GraphData[] | undefined = props.data?.intervalResults.map( + (x) => { + const date = format(new Date(x.interval), "LLL dd"); + + if (type === "crypto") { + return { + date, + value: + x.buyWithCrypto[successType === "success" ? "succeeded" : "failed"] + .amountUSDCents / 100, + }; + } + + if (type === "fiat") { + return { + date, + value: + x.buyWithFiat[successType === "success" ? "succeeded" : "failed"] + .amountUSDCents / 100, + }; + } + + return { + date, + value: + x.sum[successType === "success" ? "succeeded" : "failed"] + .amountUSDCents / 100, + }; + }, + ); + + const chartColor = + successType === "success" + ? "hsl(var(--success-foreground))" + : "hsl(var(--destructive-foreground))"; + + return ( +
+
+ Volume + + {graphData && ( +
+ + + + + +
+ )} +
+ +
+ +
+ {graphData ? ( + + + + + + + + + + { + const payload = x.payload?.[0]?.payload as + | GraphData + | undefined; + return ( +
+

+ {payload?.date} +

+

+ {payload?.value.toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+
+ ); + }} + /> + + + +
+
+ ) : ( + + )} +
+
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/TotalVolumePieChart.tsx b/src/components/pay/PayAnalytics/components/TotalVolumePieChart.tsx new file mode 100644 index 0000000000..ce47466be8 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/TotalVolumePieChart.tsx @@ -0,0 +1,218 @@ +/* eslint-disable react/forbid-dom-props */ +import { Pie, PieChart, Cell } from "recharts"; +import { cn } from "@/lib/utils"; +import { usePayVolume } from "../hooks/usePayVolume"; +import { NoDataAvailable, chartHeight } from "./common"; +import { SkeletonContainer } from "../../../../@/components/ui/skeleton"; + +type VolData = { + name: string; + amount: number; + color: string; +}; + +type UIQueryData = { + totalAmount: number; + cryptoTotalUSD: number; + fiatTotalUSD: number; +}; + +export function TotalVolumePieChart(props: { + clientId: string; + from: Date; + to: Date; +}) { + const volumeQuery = usePayVolume({ + clientId: props.clientId, + from: props.from, + intervalType: "day", + to: props.to, + }); + + function getUIData(): { + data?: UIQueryData; + isError?: boolean; + isLoading?: boolean; + } { + if (volumeQuery.isLoading) { + return { isLoading: true }; + } + + if (volumeQuery.isError) { + return { isError: true }; + } + + if (volumeQuery.data.aggregate.sum.succeeded.amountUSDCents === 0) { + return { isError: true }; + } + + const cryptoTotalUSD = Math.ceil( + volumeQuery.data.aggregate.buyWithCrypto.succeeded.amountUSDCents / 100, + ); + const fiatTotalUSD = Math.ceil( + volumeQuery.data.aggregate.buyWithFiat.succeeded.amountUSDCents / 100, + ); + + const totalAmount = cryptoTotalUSD + fiatTotalUSD; + + const data: UIQueryData = { + totalAmount, + cryptoTotalUSD, + fiatTotalUSD, + }; + + return { data }; + } + + const uiData = getUIData(); + + return ( +
+ {!uiData.isError ? ( + + ) : ( + + )} +
+ ); +} + +function RenderData(props: { data?: UIQueryData }) { + const queryData = props.data; + + const skeletonData: VolData[] = [ + { + name: "Crypto", + amount: 50, + color: "hsl(var(--muted))", + }, + { + name: "Fiat", + amount: 50, + color: "hsl(var(--muted))", + }, + ]; + + const volumeData: VolData[] = queryData + ? [ + { + name: "Crypto", + amount: queryData.cryptoTotalUSD, + color: "hsl(var(--link-foreground))", + }, + { + name: "Fiat", + amount: queryData.fiatTotalUSD, + color: "hsl(var(--foreground))", + }, + ] + : skeletonData; + + return ( +
+ {/* Left */} +
+ + + {volumeData.map((entry, index) => ( + + ))} + + + +
+
+

Total Volume

+ + { + const totalAmount = v.toLocaleString("en-US", { + currency: "USD", + style: "currency", + }); + + return ( +

6 ? "text-3xl" : "text-4xl", + )} + > + {totalAmount} +

+ ); + }} + /> +
+
+
+ + {/* Right */} +
+
+ {volumeData.map((v, i) => ( + + ))} +
+
+
+ ); +} + +function VolumeLegend(props: { + color: string; + label: string; + amount?: number; +}) { + return ( +
+
+
+

+ {props.label} +

+ + { + return ( +

+ {amount.toLocaleString("en-US", { + currency: "USD", + style: "currency", + })} +

+ ); + }} + /> +
+
+ ); +} diff --git a/src/components/pay/PayAnalytics/components/common.tsx b/src/components/pay/PayAnalytics/components/common.tsx new file mode 100644 index 0000000000..a0ba84f845 --- /dev/null +++ b/src/components/pay/PayAnalytics/components/common.tsx @@ -0,0 +1,44 @@ +import { ArrowUpIcon, ArrowDownIcon } from "lucide-react"; +import { Badge } from "@/components/ui/badge"; +import { ToolTipLabel } from "../../../../@/components/ui/tooltip"; + +export function NoDataAvailable() { + return ( +
+

No data available

+
+ ); +} + +export function CardHeading(props: { children: React.ReactNode }) { + return

{props.children}

; +} + +export function ChangeBadge(props: { percent: number }) { + const percentValue = `${props.percent.toFixed(0)}%`; + let label = "No change compared to prior range"; + if (props.percent !== 0) { + label = ` + ${props.percent >= 0 ? "Increase" : "Decrease"} of ${percentValue} compared to prior range + `; + } + return ( + +
+ = 0 ? "success" : "destructive"} + className="text-sm gap-1 px-2 py-1.5" + > + {props.percent >= 0 ? ( + + ) : ( + + )} + {percentValue} + +
+
+ ); +} + +export const chartHeight = 220; diff --git a/src/components/pay/PayAnalytics/hooks/usePayNewCustomers.ts b/src/components/pay/PayAnalytics/hooks/usePayNewCustomers.ts new file mode 100644 index 0000000000..096722420f --- /dev/null +++ b/src/components/pay/PayAnalytics/hooks/usePayNewCustomers.ts @@ -0,0 +1,63 @@ +import { useQuery } from "@tanstack/react-query"; +import { useLoggedInUser } from "../../../../@3rdweb-sdk/react/hooks/useLoggedInUser"; + +export type PayNewCustomersData = { + intervalType: "day" | "week"; + intervalResults: Array<{ + /** + * Date formatted in ISO 8601 format + */ + interval: string; + distinctCustomers: number; + }>; + aggregate: { + // totals in the [fromDate, toDate] range + distinctCustomers: number; + bpsIncreaseFromPriorRange: number; + }; +}; + +type Response = { + result: { + data: PayNewCustomersData; + }; +}; + +export function usePayNewCustomers(options: { + clientId: string; + from: Date; + to: Date; + intervalType: "day" | "week"; +}) { + const { user, isLoggedIn } = useLoggedInUser(); + + return useQuery( + ["usePayNewCustomers", user?.address, options], + async () => { + const endpoint = new URL( + "https://pay.thirdweb-dev.com/stats/aggregate/customers/v1", + ); + endpoint.searchParams.append("intervalType", options.intervalType); + endpoint.searchParams.append("clientId", options.clientId); + endpoint.searchParams.append("fromDate", `${options.from.getTime()}`); + endpoint.searchParams.append("toDate", `${options.to.getTime()}`); + + const res = await fetch(endpoint.toString(), { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!res.ok) { + throw new Error("Failed to fetch new customers"); + } + + const resJSON = (await res.json()) as Response; + + return resJSON.result.data; + }, + { enabled: !!user?.address && isLoggedIn }, + ); +} diff --git a/src/components/pay/PayAnalytics/hooks/usePayPurchases.ts b/src/components/pay/PayAnalytics/hooks/usePayPurchases.ts new file mode 100644 index 0000000000..03429945f0 --- /dev/null +++ b/src/components/pay/PayAnalytics/hooks/usePayPurchases.ts @@ -0,0 +1,111 @@ +import { useInfiniteQuery } from "@tanstack/react-query"; +import { useLoggedInUser } from "../../../../@3rdweb-sdk/react/hooks/useLoggedInUser"; + +export type PayPurchasesData = { + count: number; + purchases: Array< + { + createdAt: string; + estimatedFeesUSDCents: number; + fromAmountUSDCents: number; + fromAmountWei: string; + + purchaseId: string; + + status: "COMPLETED" | "FAILED" | "PENDING"; + toAddress: string; + toAmountUSDCents: number; + toAmountWei: string; + updatedAt: string; + toToken: { + chainId: number; + decimals: number; + symbol: string; + name: string; + tokenAddress: string; + }; + } & ( + | { + purchaseType: "ONRAMP"; + fromCurrencyDecimals: number; + fromCurrencySymbol: string; + } + | { + purchaseType: "SWAP"; + fromToken: { + chainId: number; + decimals: number; + symbol: string; + name: string; + tokenAddress: string; + }; + } + ) + >; +}; + +type Response = { + result: { + data: PayPurchasesData; + }; +}; + +export function usePayPurchases(options: { + clientId: string; + from: Date; + to: Date; + pageSize: number; +}) { + const { user, isLoggedIn } = useLoggedInUser(); + + return useInfiniteQuery({ + queryKey: ["usePayPurchases", user?.address, options], + queryFn: async ({ pageParam = 0 }) => { + const endpoint = new URL( + "https://pay.thirdweb-dev.com/stats/purchases/v1", + ); + + const start = options.pageSize * pageParam; + + endpoint.searchParams.append("skip", `${start}`); + endpoint.searchParams.append("take", `${options.pageSize}`); + + endpoint.searchParams.append("clientId", options.clientId); + endpoint.searchParams.append("fromDate", `${options.from.getTime()}`); + endpoint.searchParams.append("toDate", `${options.to.getTime()}`); + + const res = await fetch(endpoint.toString(), { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!res.ok) { + throw new Error("Failed to fetch pay volume"); + } + + const resJSON = (await res.json()) as Response; + + const pageData = resJSON.result.data; + + const itemsRequested = options.pageSize * (pageParam + 1); + const totalItems = pageData.count; + + let nextPageIndex: number | null = null; + if (itemsRequested < totalItems) { + nextPageIndex = pageParam + 1; + } + + return { + pageData: resJSON.result.data, + nextPageIndex, + }; + }, + enabled: !!user?.address && isLoggedIn, + getNextPageParam: (lastPage) => { + return lastPage.nextPageIndex; + }, + }); +} diff --git a/src/components/pay/PayAnalytics/hooks/usePayTopCustomers.ts b/src/components/pay/PayAnalytics/hooks/usePayTopCustomers.ts new file mode 100644 index 0000000000..6ace0c1c59 --- /dev/null +++ b/src/components/pay/PayAnalytics/hooks/usePayTopCustomers.ts @@ -0,0 +1,74 @@ +import { useInfiniteQuery } from "@tanstack/react-query"; +import { useLoggedInUser } from "../../../../@3rdweb-sdk/react/hooks/useLoggedInUser"; + +export type PayTopCustomersData = { + count: number; + customers: Array<{ + walletAddress: string; + totalSpendUSDCents: number; + }>; +}; + +type Response = { + result: { + data: PayTopCustomersData; + }; +}; + +export function usePayTopCustomers(options: { + clientId: string; + from: Date; + to: Date; + pageSize: number; +}) { + const { user, isLoggedIn } = useLoggedInUser(); + + return useInfiniteQuery({ + queryKey: ["usePayTopCustomers", user?.address, options], + queryFn: async ({ pageParam = 0 }) => { + const endpoint = new URL( + "https://pay.thirdweb-dev.com/stats/customers/v1", + ); + + const start = options.pageSize * pageParam; + endpoint.searchParams.append("skip", `${start}`); + endpoint.searchParams.append("take", `${options.pageSize}`); + + endpoint.searchParams.append("clientId", options.clientId); + endpoint.searchParams.append("fromDate", `${options.from.getTime()}`); + endpoint.searchParams.append("toDate", `${options.to.getTime()}`); + + const res = await fetch(endpoint.toString(), { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!res.ok) { + throw new Error("Failed to fetch pay volume"); + } + + const resJSON = (await res.json()) as Response; + const pageData = resJSON.result.data; + + const itemsRequested = options.pageSize * (pageParam + 1); + const totalItems = pageData.count; + + let nextPageIndex: number | null = null; + if (itemsRequested < totalItems) { + nextPageIndex = pageParam + 1; + } + + return { + pageData: resJSON.result.data, + nextPageIndex, + }; + }, + enabled: !!user?.address && isLoggedIn, + getNextPageParam: (lastPage) => { + return lastPage.nextPageIndex; + }, + }); +} diff --git a/src/components/pay/PayAnalytics/hooks/usePayVolume.ts b/src/components/pay/PayAnalytics/hooks/usePayVolume.ts new file mode 100644 index 0000000000..06ffea20c8 --- /dev/null +++ b/src/components/pay/PayAnalytics/hooks/usePayVolume.ts @@ -0,0 +1,94 @@ +import { useQuery } from "@tanstack/react-query"; +import { useLoggedInUser } from "../../../../@3rdweb-sdk/react/hooks/useLoggedInUser"; + +type AggregatedData = { + succeeded: { + amountUSDCents: number; + count: number; + bpsIncreaseFromPriorRange: number; + }; + failed: { + amountUSDCents: number; + count: number; + }; +}; + +type IntervalResultNode = { + failed: { + amountUSDCents: number; + count: number; + }; + succeeded: { + amountUSDCents: number; + count: number; + }; +}; + +export type PayVolumeData = { + intervalType: "day" | "week"; + intervalResults: Array<{ + interval: string; + buyWithCrypto: IntervalResultNode; + buyWithFiat: IntervalResultNode; + sum: IntervalResultNode; + payouts: { + amountUSDCents: number; + count: number; + }; + }>; + aggregate: { + buyWithCrypto: AggregatedData; + buyWithFiat: AggregatedData; + sum: AggregatedData; + payouts: { + amountUSDCents: number; + count: number; + bpsIncreaseFromPriorRange: number; + }; + }; +}; + +type Response = { + result: { + data: PayVolumeData; + }; +}; + +export function usePayVolume(options: { + clientId: string; + from: Date; + to: Date; + intervalType: "day" | "week"; +}) { + const { user, isLoggedIn } = useLoggedInUser(); + + return useQuery( + ["usePayVolume", user?.address, options], + async () => { + const endpoint = new URL( + "https://pay.thirdweb-dev.com/stats/aggregate/volume/v1", + ); + endpoint.searchParams.append("intervalType", options.intervalType); + endpoint.searchParams.append("clientId", options.clientId); + endpoint.searchParams.append("fromDate", `${options.from.getTime()}`); + endpoint.searchParams.append("toDate", `${options.to.getTime()}`); + + const res = await fetch(endpoint.toString(), { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!res.ok) { + throw new Error("Failed to fetch pay volume"); + } + + const resJSON = (await res.json()) as Response; + + return resJSON.result.data; + }, + { enabled: !!user?.address && isLoggedIn, retry: false }, + ); +} diff --git a/src/components/selects/CustomChainRenderer.tsx b/src/components/selects/CustomChainRenderer.tsx index 008afb0bac..6ccfa39a9a 100644 --- a/src/components/selects/CustomChainRenderer.tsx +++ b/src/components/selects/CustomChainRenderer.tsx @@ -73,7 +73,7 @@ export const CustomChainRenderer = ({ )}
{switching && ( -
+
Confirm in your wallet
diff --git a/src/contract-ui/tabs/analytics/page.tsx b/src/contract-ui/tabs/analytics/page.tsx index b9de6d7aa4..535a4e5a43 100644 --- a/src/contract-ui/tabs/analytics/page.tsx +++ b/src/contract-ui/tabs/analytics/page.tsx @@ -112,7 +112,7 @@ export const ContractAnalyticsPage: React.FC = ({ transaction to this contract. - + = ({ contract. - + = ({ contract. - + = ({ transactions. - + = ({ The breakdown of events emitted by this contract. - + = ({ - + = ({ - + = ({ - + = ({ - + { app each day. - + { each day. - + { Distribution of wallet types used to connect to your app. - + { onChange: (value: "pay" | "checkouts") => setTabOption(value), }); - const { isLoggedIn } = useLoggedInUser(); + const { isLoggedIn, isLoading } = useLoggedInUser(); const { hasApiKeys, hasPayApiKeys, @@ -179,6 +182,14 @@ const DashboardConnectPay: ThirdwebNextPage = () => { } = usePayConfig(); // Pay setting api key configuration + if (isLoading) { + return ( +
+ +
+ ); + } + if (!isLoggedIn) { return ; } @@ -194,7 +205,7 @@ const DashboardConnectPay: ThirdwebNextPage = () => { > - Pay Settings + Pay Configure developer settings for all Pay features, including{" "} @@ -264,25 +275,68 @@ const DashboardConnectPay: ThirdwebNextPage = () => { ) : ( + + )} + + ); +}; + +function PayUI(props: { + hasPayApiKeys: boolean; + hasApiKeys: boolean; + selectedKey: ApiKey | undefined; +}) { + const { hasPayApiKeys, hasApiKeys, selectedKey } = props; + const [activeTab, setActiveTab] = useState<"settings" | "analytics">( + "analytics", + ); + + return ( +
+ {!hasPayApiKeys && ( + + )} + + {hasPayApiKeys && selectedKey && ( <> - {!hasPayApiKeys && ( - - )} + setActiveTab("analytics"), + isEnabled: true, + }, + { + name: "Settings", + isActive: activeTab === "settings", + onClick: () => setActiveTab("settings"), + isEnabled: true, + }, + ]} + /> - {hasPayApiKeys && selectedKey && } +
+ + {activeTab === "settings" && } + {activeTab === "analytics" && } )} - +
); -}; +} DashboardConnectPay.getLayout = (page, props) => ( diff --git a/src/theme/index.ts b/src/theme/index.ts index 7436d801ab..14d5298295 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -73,7 +73,7 @@ const chakraTheme: Theme = extendTheme({ border: "3px solid", borderColor: "transparent", borderRadius: "md", - background: `linear-gradient(${bgColor}, ${bgColor}) padding-box, + background: `linear-gradient(${bgColor}, ${bgColor}) padding-box, linear-gradient(135deg, ${lgFrom}, ${lgTo}, ${lgFrom}) border-box`, transitionProperty: "opacity, background", transitionDuration: "slow", @@ -381,9 +381,18 @@ const chakraTheme: Theme = extendTheme({ // borderColor: { default: "accent.200", _dark: "accent.300" }, bgBlack: { default: "black", _dark: "white" }, bgWhite: { default: "#fff", _dark: "black" }, - backgroundBody: { default: "backgroundLight", _dark: "backgroundDark" }, - backgroundHighlight: { default: "white", _dark: "#131417" }, - backgroundCardHighlight: { default: "white", _dark: "#131417" }, + backgroundBody: { + default: "hsl(var(--background))", + _dark: "hsl(var(--background))", + }, + backgroundHighlight: { + default: "hsl(var(--secondary))", + _dark: "hsl(var(--secondary))", + }, + secondaryCardHighlight: { + default: "hsl(var(--secondary))", + _dark: "hsl(var(--secondary))", + }, wordmark: { default: "#262A36", _dark: "whiteAlpha.900" }, heading: { default: "#262A36", _dark: "#ECECEC" }, paragraph: { default: "rgba(39, 46, 54, 0.9)", _dark: "#b2b2b2" }, diff --git a/tailwind.config.js b/tailwind.config.js index 8226d23890..c516f66e8f 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -33,6 +33,7 @@ module.exports = { foreground: "hsl(var(--destructive-foreground))", }, success: { + DEFAULT: "hsl(var(--success))", foreground: "hsl(var(--success-foreground))", }, muted: { @@ -56,8 +57,12 @@ module.exports = { foreground: "hsl(var(--inverted-foreground))", }, warning: { + DEFAULT: "hsl(var(--warning))", foreground: "hsl(var(--warning-foreground))", }, + link: { + foreground: "hsl(var(--link-foreground))", + }, }, borderRadius: { lg: "var(--radius)",