From 55aecccc25592e7ae9f0923d51e92134d9959129 Mon Sep 17 00:00:00 2001 From: v1rtl Date: Mon, 11 Nov 2024 18:24:24 +0200 Subject: [PATCH] smarter search (#641) * start working on the search * wip name search * wip * wip * add box api * add invalid status * use ens app * status borders * support emojis * fix indicator colors * properly validate names * fix mobile invalid label * fix text * add arrows * refactor * set fmt to match ens-app-v3 * unused dep * fix * bump all deps * fix * allow single character names * fix * fix url * use external link for .eth names * Revert "use external link for .eth names" This reverts commit 309bedffbec52f8d8f50ea57d00988514e719790. * fmt * use external link for .eth names --------- Co-authored-by: sugh01 <19183308+sugh01@users.noreply.github.com> --- .vscode/settings.json | 2 +- eslint.config.mjs | 88 +- fonts.ts | 158 +- locales/en/translation.json | 7 +- next-env.d.ts | 2 +- package.json | 38 +- pnpm-lock.yaml | 1786 ++++++++++------- public/assets/spinner.svg | 6 + src/app/(root)/brand/page.tsx | 572 +++--- src/app/(root)/developers/page.tsx | 318 +-- src/app/(root)/ecosystem/page.tsx | 214 +- src/app/(root)/governance/page.tsx | 410 ++-- src/app/(root)/layout.tsx | 224 +-- src/app/(root)/page.tsx | 448 +++-- .../AnimatedSquare/AnimatedSquare.tsx | 10 +- src/components/Carousel/Carousel.tsx | 24 +- src/components/ColorCards/ColorCards.tsx | 80 +- .../FeaturePreview/FeaturePreview.tsx | 164 +- src/components/Footer/Footer.tsx | 73 +- src/components/Header/Header.tsx | 98 +- .../LanguageSwitcher/LanguageSwitcher.tsx | 88 +- src/components/LinkList/LinkList.tsx | 62 +- src/components/Navbar/Navbar.tsx | 210 +- src/components/Navbar/NavbarFade.tsx | 28 +- .../ResponsiveImage/ResponsiveImage.tsx | 32 +- .../SearchInput/SearchInput.module.css | 143 +- src/components/SearchInput/SearchInput.tsx | 332 ++- .../SectionWithPreview/SectionWithPreview.tsx | 70 +- .../SmallLinkList/SmallLinkList.tsx | 66 +- src/components/TwoCol/TwoCol.tsx | 92 +- src/components/animation/StatsCounter.tsx | 66 +- src/components/brand/AssetDownloadButton.tsx | 46 +- src/components/brand/BrandColor.tsx | 84 +- .../developers/header/HeroContent.tsx | 86 +- src/components/ecosystem/EcosystemList.tsx | 66 +- src/components/governance/HeroContent.tsx | 120 +- .../home/PartnersList/PartnersList.tsx | 42 +- .../CrossFadeImage/CrossFadeImage.tsx | 140 +- .../DappsAnimation/DappsAnimation.tsx | 616 +++--- .../MessageAnimation/MessageAnimation.tsx | 64 +- .../animations/StatsCounter/StatsCounter.tsx | 80 +- .../home/header/HeroContent/HeroContent.tsx | 212 +- src/components/icons.tsx | 377 ++-- src/i18n/langPrefix.tsx | 16 +- src/i18n/settings.ts | 90 +- src/i18n/useCurrentLanguage.ts | 10 +- src/i18n/useTranslation.ts | 56 +- src/utils/available.ts | 28 + src/utils/getStatic.ts | 14 +- src/utils/types.ts | 68 +- src/utils/useDebounce.ts | 17 + src/utils/useEventListener.ts | 122 +- src/utils/useIntersectionObserver.ts | 236 +-- src/utils/useMq.ts | 100 +- 54 files changed, 4647 insertions(+), 3954 deletions(-) create mode 100644 public/assets/spinner.svg create mode 100644 src/utils/available.ts create mode 100644 src/utils/useDebounce.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index a42326c3..34bead09 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ "locales" ], "i18n-ally.keystyle": "nested", - "eslint.experimental.useFlatConfig": true, + "eslint.useFlatConfig": true, "editor.codeActionsOnSave": { "source.fixAll": "explicit" }, diff --git a/eslint.config.mjs b/eslint.config.mjs index 2360d97b..88873661 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,49 +1,49 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; -import nextPlugin from '@next/eslint-plugin-next'; -import stylistic from '@stylistic/eslint-plugin'; -import react from '@eslint-react/eslint-plugin'; -import { fixupPluginRules } from '@eslint/compat'; -import globals from 'globals'; +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' +import nextPlugin from '@next/eslint-plugin-next' +import stylistic from '@stylistic/eslint-plugin' +import react from '@eslint-react/eslint-plugin' +import { fixupPluginRules } from '@eslint/compat' +import globals from 'globals' const config = tseslint.config( - { - files: ['src/**/*.ts', 'src/*.tsx'], - ignores: ['node_modules', 'dist', '.next'], - languageOptions: { - globals: { - ...globals.node, - ...globals.browser, - }, - }, + { + files: ['src/**/*.ts', 'src/*.tsx'], + ignores: ['node_modules', 'dist', '.next'], + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, }, - eslint.configs.recommended, - ...tseslint.configs.recommended, - react.configs.recommended, - stylistic.configs.customize({ - indent: 4, - quotes: 'single', - jsx: true, - semi: true, - }), - { - settings: { - react: { - version: 'detect', - }, - }, - plugins: { - '@next/next': fixupPluginRules(nextPlugin), - stylistic, - react, - }, - rules: { - // Next.js - ...nextPlugin.configs.recommended.rules, - '@next/next/no-img-element': 'off', - 'stylistic/no-multiple-empty-lines': ['error', { max: 1 }], - }, + }, + eslint.configs.recommended, + ...tseslint.configs.recommended, + react.configs.recommended, + stylistic.configs.customize({ + indent: 2, + quotes: 'single', + jsx: true, + semi: false, + }), + { + settings: { + react: { + version: 'detect', + }, }, -); + plugins: { + '@next/next': fixupPluginRules(nextPlugin), + stylistic, + react, + }, + rules: { + // Next.js + ...nextPlugin.configs.recommended.rules, + '@next/next/no-img-element': 'off', + 'stylistic/no-multiple-empty-lines': ['error', { max: 1 }], + }, + }, +) -export default config; +export default config diff --git a/fonts.ts b/fonts.ts index d4b32043..68cde833 100644 --- a/fonts.ts +++ b/fonts.ts @@ -1,92 +1,92 @@ -import { Inter, EB_Garamond } from 'next/font/google'; -import localFont from 'next/font/local'; +import { Inter, EB_Garamond } from 'next/font/google' +import localFont from 'next/font/local' const inter = Inter({ - weight: 'variable', - variable: '--ens-sans-fb', - subsets: ['cyrillic'], -}); + weight: 'variable', + variable: '--ens-sans-fb', + subsets: ['cyrillic'], +}) const ebGaramond = EB_Garamond({ - weight: 'variable', - variable: '--ens-serif-fb', - subsets: ['cyrillic'], -}); + weight: 'variable', + variable: '--ens-serif-fb', + subsets: ['cyrillic'], +}) const ABCMonumentGrotesk = localFont({ - src: './fonts/variable.woff2', - variable: '--ens-sans', - fallback: ['var(--ens-sans-fb)', 'sans-serif'], -}); + src: './fonts/variable.woff2', + variable: '--ens-sans', + fallback: ['var(--ens-sans-fb)', 'sans-serif'], +}) const ABCMonumentGroteskMono = localFont({ - src: [ - { - weight: '400', - path: './fonts/mono/regular.woff2', - style: 'normal', - }, - { - weight: '400', - path: './fonts/mono/italic.woff2', - style: 'italic', - }, - { - weight: '500', - path: './fonts/mono/medium.woff2', - style: 'normal', - }, - { - weight: '500', - path: './fonts/mono/medium-italic.woff2', - style: 'italic', - }, - ], - variable: '--ens-mono', -}); + src: [ + { + weight: '400', + path: './fonts/mono/regular.woff2', + style: 'normal', + }, + { + weight: '400', + path: './fonts/mono/italic.woff2', + style: 'italic', + }, + { + weight: '500', + path: './fonts/mono/medium.woff2', + style: 'normal', + }, + { + weight: '500', + path: './fonts/mono/medium-italic.woff2', + style: 'italic', + }, + ], + variable: '--ens-mono', +}) const ABCMonumentGroteskSemiMono = localFont({ - src: [ - { - weight: '400', - path: './fonts/semi-mono/regular.woff2', - style: 'normal', - }, - { - weight: '400', - path: './fonts/semi-mono/italic.woff2', - style: 'italic', - }, - { - weight: '500', - path: './fonts/semi-mono/medium.woff2', - style: 'normal', - }, - { - weight: '500', - path: './fonts/semi-mono/medium-italic.woff2', - style: 'italic', - }, - ], - variable: '--ens-semi-mono', - fallback: ['monospace'], -}); + src: [ + { + weight: '400', + path: './fonts/semi-mono/regular.woff2', + style: 'normal', + }, + { + weight: '400', + path: './fonts/semi-mono/italic.woff2', + style: 'italic', + }, + { + weight: '500', + path: './fonts/semi-mono/medium.woff2', + style: 'normal', + }, + { + weight: '500', + path: './fonts/semi-mono/medium-italic.woff2', + style: 'italic', + }, + ], + variable: '--ens-semi-mono', + fallback: ['monospace'], +}) const ABCMarist = localFont({ - src: [ - { - weight: '400', - path: './fonts/serif/regular.woff2', - style: 'normal', - }, - { - weight: '400', - path: './fonts/serif/italic.woff2', - style: 'italic', - }, - ], - variable: '--ens-serif', - fallback: ['var(--ens-serif-fb)', 'serif'], -}); + src: [ + { + weight: '400', + path: './fonts/serif/regular.woff2', + style: 'normal', + }, + { + weight: '400', + path: './fonts/serif/italic.woff2', + style: 'italic', + }, + ], + variable: '--ens-serif', + fallback: ['var(--ens-serif-fb)', 'serif'], +}) -export { inter, ebGaramond, ABCMarist, ABCMonumentGrotesk, ABCMonumentGroteskSemiMono, ABCMonumentGroteskMono }; +export { inter, ebGaramond, ABCMarist, ABCMonumentGrotesk, ABCMonumentGroteskSemiMono, ABCMonumentGroteskMono } diff --git a/locales/en/translation.json b/locales/en/translation.json index 73cb0dc0..f5d68864 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -13,8 +13,11 @@ "subtitle": "New Internet", "text": "For every dreamer, creator, and change-maker tired of the old internet, Web3 is here. ENS is more than a protocol - it's a commitment to a better web, built for everyone.", "input": { - "caption": "Register your .eth name today", - "placeholder": "Find your .eth" + "caption": "Register your name today", + "placeholder": "Find your name", + "register": "Register", + "view": "View", + "invalid": "Invalid" } }, "features": { diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03d..40c3d680 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/package.json b/package.json index 2ef4333a..fa3cc368 100644 --- a/package.json +++ b/package.json @@ -13,34 +13,34 @@ "lint:css": "stylelint -c stylelint.config.mjs './src/**/*.css'" }, "dependencies": { + "@ensdomains/ensjs": "4.0.1-alpha.0", "clsx": "^2.1.1", "dune-api-client": "^1.0.1", - "i18next": "^23.11.5", + "i18next": "^23.16.0", "i18next-resources-to-backend": "^1.2.1", - "next": "^14.2.4", - "next-i18next": "^15.3.0", + "next": "^14.2.15", "react": "^18.3.1", "react-countup": "^6.5.3", "react-dom": "^18.3.1", "react-external-link": "^2.3.1", - "react-i18next": "^14.1.2", - "typescript": "^5.5.3" + "react-i18next": "^15.0.3", + "typescript": "^5.6.3", + "viem": "^2.21.28" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.5.22", - "@eslint/compat": "^1.1.0", - "@eslint/js": "^9.6.0", - "@next/eslint-plugin-next": "^14.2.4", - "@stylistic/eslint-plugin": "^2.3.0", - "@stylistic/stylelint-plugin": "^2.1.2", - "@types/node": "^20.14.9", - "@types/react": "^18.3.3", - "@types/react-helmet": "^6.1.11", - "eslint": "^9.6.0", - "globals": "^15.8.0", + "@eslint-react/eslint-plugin": "^1.15.0", + "@eslint/compat": "^1.2.0", + "@eslint/js": "^9.12.0", + "@next/eslint-plugin-next": "^14.2.15", + "@stylistic/eslint-plugin": "^2.9.0", + "@stylistic/stylelint-plugin": "^3.1.1", + "@types/node": "^22.7.6", + "@types/react": "^18.3.11", + "eslint": "^9.12.0", + "globals": "^15.11.0", "i18next-locales-sync": "^2.1.0", - "stylelint": "^16.6.1", - "typescript-eslint": "^7.15.0" + "stylelint": "^16.10.0", + "typescript-eslint": "^8.9.0" }, "repository": { "type": "git", @@ -49,5 +49,5 @@ "bugs": { "url": "https://github.com/ensdomains/ensdomains-landing/issues" }, - "packageManager": "pnpm@9.0.6" + "packageManager": "pnpm@9.3.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 013c657b..54fef733 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@ensdomains/ensjs': + specifier: 4.0.1-alpha.0 + version: 4.0.1-alpha.0(typescript@5.6.3)(viem@2.21.28(typescript@5.6.3)) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -15,17 +18,14 @@ importers: specifier: ^1.0.1 version: 1.0.1 i18next: - specifier: ^23.11.5 - version: 23.11.5 + specifier: ^23.16.0 + version: 23.16.0 i18next-resources-to-backend: specifier: ^1.2.1 version: 1.2.1 next: - specifier: ^14.2.4 - version: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-i18next: - specifier: ^15.3.0 - version: 15.3.0(i18next@23.11.5)(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-i18next@14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: ^14.2.15 + version: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -39,232 +39,293 @@ importers: specifier: ^2.3.1 version: 2.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-i18next: - specifier: ^14.1.2 - version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.0.3 + version: 15.0.3(i18next@23.16.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) typescript: - specifier: ^5.5.3 - version: 5.5.3 + specifier: ^5.6.3 + version: 5.6.3 + viem: + specifier: ^2.21.28 + version: 2.21.28(typescript@5.6.3) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.5.22 - version: 1.5.22(eslint@9.6.0)(typescript@5.5.3) + specifier: ^1.15.0 + version: 1.15.0(eslint@9.12.0)(typescript@5.6.3) '@eslint/compat': - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^1.2.0 + version: 1.2.0(eslint@9.12.0) '@eslint/js': - specifier: ^9.6.0 - version: 9.6.0 + specifier: ^9.12.0 + version: 9.12.0 '@next/eslint-plugin-next': - specifier: ^14.2.4 - version: 14.2.4 + specifier: ^14.2.15 + version: 14.2.15 '@stylistic/eslint-plugin': - specifier: ^2.3.0 - version: 2.3.0(eslint@9.6.0)(typescript@5.5.3) + specifier: ^2.9.0 + version: 2.9.0(eslint@9.12.0)(typescript@5.6.3) '@stylistic/stylelint-plugin': - specifier: ^2.1.2 - version: 2.1.2(stylelint@16.6.1(typescript@5.5.3)) + specifier: ^3.1.1 + version: 3.1.1(stylelint@16.10.0(typescript@5.6.3)) '@types/node': - specifier: ^20.14.9 - version: 20.14.9 + specifier: ^22.7.6 + version: 22.7.6 '@types/react': - specifier: ^18.3.3 - version: 18.3.3 - '@types/react-helmet': - specifier: ^6.1.11 - version: 6.1.11 + specifier: ^18.3.11 + version: 18.3.11 eslint: - specifier: ^9.6.0 - version: 9.6.0 + specifier: ^9.12.0 + version: 9.12.0 globals: - specifier: ^15.8.0 - version: 15.8.0 + specifier: ^15.11.0 + version: 15.11.0 i18next-locales-sync: specifier: ^2.1.0 version: 2.1.0 stylelint: - specifier: ^16.6.1 - version: 16.6.1(typescript@5.5.3) + specifier: ^16.10.0 + version: 16.10.0(typescript@5.6.3) typescript-eslint: - specifier: ^7.15.0 - version: 7.15.0(eslint@9.6.0)(typescript@5.5.3) + specifier: ^8.9.0 + version: 8.9.0(eslint@9.12.0)(typescript@5.6.3) packages: - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@babel/code-frame@7.25.7': + resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/highlight@7.25.7': + resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + '@babel/runtime@7.25.7': + resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} - '@csstools/css-parser-algorithms@2.7.0': - resolution: {integrity: sha512-qvBMcOU/uWFCH/VO0MYe0AMs0BGMWAt6FTryMbFIKYtZtVnqTZtT8ktv5o718llkaGZWomJezJZjq3vJDHeJNQ==} - engines: {node: ^14 || ^16 || >=18} + '@csstools/css-parser-algorithms@3.0.2': + resolution: {integrity: sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==} + engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^2.3.2 + '@csstools/css-tokenizer': ^3.0.2 - '@csstools/css-tokenizer@2.3.3': - resolution: {integrity: sha512-fTaF0vRcXVJ4cmwg8nHofydDjitKMDBzC8cCu+O/Lg13C4PdkC15GVjGpbmWauOOnhomVSTg5I5LpLJFJE2Hfw==} - engines: {node: ^14 || ^16 || >=18} + '@csstools/css-tokenizer@3.0.2': + resolution: {integrity: sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==} + engines: {node: '>=18'} - '@csstools/media-query-list-parser@2.1.12': - resolution: {integrity: sha512-t1/CdyVJzOQUiGUcIBXRzTAkWTFPxiPnoKwowKW2z9Uj78c2bBWI/X94BeVfUwVq1xtCjD7dnO8kS6WONgp8Jw==} - engines: {node: ^14 || ^16 || >=18} + '@csstools/media-query-list-parser@3.0.1': + resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} + engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^2.7.0 - '@csstools/css-tokenizer': ^2.3.2 + '@csstools/css-parser-algorithms': ^3.0.1 + '@csstools/css-tokenizer': ^3.0.1 - '@csstools/selector-specificity@3.1.1': - resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} - engines: {node: ^14 || ^16 || >=18} + '@csstools/selector-specificity@4.0.0': + resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} + engines: {node: '>=18'} peerDependencies: - postcss-selector-parser: ^6.0.13 + postcss-selector-parser: ^6.1.0 '@dual-bundle/import-meta-resolve@4.1.0': resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@ensdomains/address-encoder@1.0.0-rc.3': + resolution: {integrity: sha512-8o6zH69rObIqDY4PusEWuN9jvVOct+9jj9AOPO7ifc3ev8nmsly0e8TE1sHkhk0iKFbd3DlSsUnJ+yuRWmdLCQ==} + + '@ensdomains/address-encoder@1.1.1': + resolution: {integrity: sha512-yg7s+suCuKRhaGsgLu57W/jxIs/Lnqs/SU7jT7UwS4ATSnW94jbUCbmyyZ82CQwKsmwaUE8uYvvVb4N6lfz29A==} + + '@ensdomains/content-hash@3.1.0-rc.1': + resolution: {integrity: sha512-OzdkXgdFmduzcJKU4KRkkJkQHnm5p7m7FkX8k+bHOEoOIzc0ueGT/Jay4nnb60wNk1wSHRmzY+hHBMpFDiGReg==} + + '@ensdomains/dnsprovejs@0.5.1': + resolution: {integrity: sha512-nfm4ggpK5YBVwVwLZKF9WPjRGRTL9aUxX2O4pqv/AnQCz3WeGHsW7VhVFLj2s4EoWSzCXwR1E6nuqgUwnH692w==} + engines: {node: '>=16.8'} + + '@ensdomains/ensjs@4.0.1-alpha.0': + resolution: {integrity: sha512-IGaxCfvEibLKhPDhEC6zYUnhXgHFalZLsoZq0R58KmuzmJbWkQ1jwzbhVPXBfMYuGwcr4iz/4auiNT0x5aS7Zg==} + peerDependencies: + viem: ^2.9.2 + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.5.22': - resolution: {integrity: sha512-Aiae+VizJkUEh1Co3cZ3ltE7PtMkVCke/ztXYBKTM2DADLQvlb7GVEwfmyCkK0LuUxFUzuk56DdpliA/nIQHtg==} + '@eslint-react/ast@1.15.0': + resolution: {integrity: sha512-7rOLLfGER82FQJy7pCFNs4j/47RYTEiPDfMFGAu4W7yerJrvU2rRNqjSwwm1Iq0DrrasBV8a3IVtPYQoDOqycg==} - '@eslint-react/core@1.5.22': - resolution: {integrity: sha512-AlKxsZsGlu43VGKAs3AOrS11jope2E77DPbAfotxXUFKzuKaAqWuYfJG9ztQH/JX0gui6k8fKV9tzgxrUD6Hog==} + '@eslint-react/core@1.15.0': + resolution: {integrity: sha512-T7KirkdempegOxQznW1xclZtv5hQRChgbeYqisPRENkNg90w3uY7ia5iPf6FEZntkja/NF00VUnUetIw4rO0og==} - '@eslint-react/eslint-plugin@1.5.22': - resolution: {integrity: sha512-l3gsLNiMnn8CHDxD1VJ4Vb5d/Th1Lb0x83P+PWQKVnh8seDJvh6tOgUD8Too4xHxaU5XwHKj6quC9bcgywLW+g==} + '@eslint-react/eslint-plugin@1.15.0': + resolution: {integrity: sha512-5cuu7gNBgwQwgDX1YJugL7ujay0NT27g3UN0qtJAON9WLBv/ESq+qLMxddGwPSljV/XGxhwbbys09Jgww/fy8A==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - '@eslint-react/jsx@1.5.22': - resolution: {integrity: sha512-CXPuvRWx2gJB02lZgJWGa6I2yOYWkhHEsBYNyC1Txz2vss8n7Dq1N+Rf0Cr2ACCpSo6RPmD0pF5fJl2QMzchKA==} + '@eslint-react/jsx@1.15.0': + resolution: {integrity: sha512-VZy8RWPx+2PUuBKaXPtu2qWnWN9SpkdgY3ohkZoGdoqkEYkYaXjvABNByQLwvk2+Ewqt0K+1f8r7QoQi47pQmw==} - '@eslint-react/shared@1.5.22': - resolution: {integrity: sha512-56S3GTgOR29lhcmu2KIZbWnJ47SMNjSircfrMtTj3seiykJGN8beh/PI7BsWLkIv0mVGF0vYLjLzLm0NT69ZYQ==} + '@eslint-react/shared@1.15.0': + resolution: {integrity: sha512-LRgcKKhNePEJzuwICe3rgUC5KVd4ZhlKys91gMxmUob3RCiUj4BjfAURJMqzwsPGF32WQeHkipw1hWNGpQNdlw==} - '@eslint-react/tools@1.5.22': - resolution: {integrity: sha512-HH/v0SyaIFk1jfVZTmHuJ/WQidsz2eYvaN8768qyBXA8RG85H2kUwHSo7vepnbT2AKT0m1tR20q9Yma9kYFIDg==} + '@eslint-react/tools@1.15.0': + resolution: {integrity: sha512-zdd2K3EV2tWaCzNH60wD159HuX904kWzv+X87yqzZ0Nf2OBUDJ4a561NoDX3Pn8A3E6hFdu666zpIGdeaej9eg==} - '@eslint-react/types@1.5.22': - resolution: {integrity: sha512-QHohpuH9KIghb6lvxe1lR4ARDidnyBrwHI/EVsMR/Bjk0ZcENtdz4IiWtb25W50PA0bzqt78SoLSLIarl0JeRQ==} + '@eslint-react/types@1.15.0': + resolution: {integrity: sha512-bajL6xIUxZp36fezn5HEhQpL0eJM923hwfRj6cym2Xl0Jn2YgahSztHorsOpId71MYBgn9ERy9yXItcnrz0rsQ==} - '@eslint-react/var@1.5.22': - resolution: {integrity: sha512-yGoHyYddv5jy497IxfbZXL9zLCcOgt5BrZ6/m6G60zTsqzieCX6GFiThiMAr6OVvK1BhneLvDD94KVfikd49LQ==} + '@eslint-react/var@1.15.0': + resolution: {integrity: sha512-/QycKnbgZRygM/lhHtUFQrvvrswdOyaXfVxwtIFVEYoPHP9q7NaUn0mrBu4VWkXQC9zPk1nWQeC3rZMUxzretg==} - '@eslint/compat@1.1.0': - resolution: {integrity: sha512-s9Wi/p25+KbzxKlDm3VshQdImhWk+cbdblhwGNnyCU5lpSwtWa4v7VQCxSki0FAUrGA3s8nCWgYzAH41mwQVKQ==} + '@eslint/compat@1.2.0': + resolution: {integrity: sha512-CkPWddN7J9JPrQedEr2X7AjK9y1jaMJtxZ4A/+jTMFA2+n5BWhcKHW/EbJyARqg2zzQfgtWUtVmG3hrG6+nGpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/config-array@0.17.0': - resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.12.0': + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + 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 || ^17.0.0 + + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@next/env@14.2.4': - resolution: {integrity: sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==} + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@next/eslint-plugin-next@14.2.4': - resolution: {integrity: sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==} + '@next/env@14.2.15': + resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} - '@next/swc-darwin-arm64@14.2.4': - resolution: {integrity: sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==} + '@next/eslint-plugin-next@14.2.15': + resolution: {integrity: sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ==} + + '@next/swc-darwin-arm64@14.2.15': + resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.4': - resolution: {integrity: sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==} + '@next/swc-darwin-x64@14.2.15': + resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.4': - resolution: {integrity: sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==} + '@next/swc-linux-arm64-gnu@14.2.15': + resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.4': - resolution: {integrity: sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==} + '@next/swc-linux-arm64-musl@14.2.15': + resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.4': - resolution: {integrity: sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==} + '@next/swc-linux-x64-gnu@14.2.15': + resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.4': - resolution: {integrity: sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==} + '@next/swc-linux-x64-musl@14.2.15': + resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.4': - resolution: {integrity: sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==} + '@next/swc-win32-arm64-msvc@14.2.15': + resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.4': - resolution: {integrity: sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==} + '@next/swc-win32-ia32-msvc@14.2.15': + resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.4': - resolution: {integrity: sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==} + '@next/swc-win32-x64-msvc@14.2.15': + resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -281,40 +342,26 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@stylistic/eslint-plugin-js@2.3.0': - resolution: {integrity: sha512-lQwoiYb0Fs6Yc5QS3uT8+T9CPKK2Eoxc3H8EnYJgM26v/DgtW+1lvy2WNgyBflU+ThShZaHm3a6CdD9QeKx23w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - '@stylistic/eslint-plugin-jsx@2.3.0': - resolution: {integrity: sha512-tsQ0IEKB195H6X9A4iUSgLLLKBc8gUBWkBIU8tp1/3g2l8stu+PtMQVV/VmK1+3bem5FJCyvfcZIQ/WF1fsizA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-plus@2.3.0': - resolution: {integrity: sha512-xboPWGUU5yaPlR+WR57GwXEuY4PSlPqA0C3IdNA/+1o2MuBi95XgDJcZiJ9N+aXsqBXAPIpFFb+WQ7QEHo4f7g==} - peerDependencies: - eslint: '*' + '@scure/bip32@1.5.0': + resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} - '@stylistic/eslint-plugin-ts@2.3.0': - resolution: {integrity: sha512-wqOR38/uz/0XPnHX68ftp8sNMSAqnYGjovOTN7w00xnjS6Lxr3Sk7q6AaxWWqbMvOj7V2fQiMC5HWAbTruJsCg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - '@stylistic/eslint-plugin@2.3.0': - resolution: {integrity: sha512-rtiz6u5gRyyEZp36FcF1/gHJbsbT3qAgXZ1qkad6Nr/xJ9wrSJkiSFFQhpYVTIZ7FJNRJurEcumZDCwN9dEI4g==} + '@stylistic/eslint-plugin@2.9.0': + resolution: {integrity: sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/stylelint-plugin@2.1.2': - resolution: {integrity: sha512-JsSqu0Y3vsX+PBl+DwULxC0cIv9C1yIcq1MXkx7pBOGtTqU26a75I8MPYMiEYvrsXgsKLi65xVgy1iLVSZquJA==} + '@stylistic/stylelint-plugin@3.1.1': + resolution: {integrity: sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==} engines: {node: ^18.12 || >=20.9} peerDependencies: - stylelint: ^16.0.2 + stylelint: ^16.8.0 '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -322,110 +369,111 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/hoist-non-react-statics@3.3.5': - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + '@types/node@22.7.6': + resolution: {integrity: sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - '@types/react-helmet@6.1.11': - resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} + '@types/react@18.3.11': + resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - - '@typescript-eslint/eslint-plugin@7.15.0': - resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.9.0': + resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.15.0': - resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.9.0': + resolution: {integrity: sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.15.0': - resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.9.0': + resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.15.0': - resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/type-utils@8.9.0': + resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.15.0': - resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.9.0': + resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.15.0': - resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.9.0': + resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.15.0': - resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.9.0': + resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@7.15.0': - resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.9.0': + resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.13.0: + resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -457,6 +505,9 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -475,8 +526,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001640: - resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==} + caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -516,9 +567,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - core-js@3.37.1: - resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} - cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -531,16 +579,19 @@ packages: countup.js@2.8.0: resolution: {integrity: sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==} + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - css-functions-list@3.2.2: - resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} engines: {node: '>=12 || >=16'} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + css-tree@3.0.0: + resolution: {integrity: sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} cssesc@3.0.0: @@ -551,8 +602,8 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -567,6 +618,10 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dune-api-client@1.0.1: resolution: {integrity: sha512-ubScpqTdbX5yHiiAL9x7wqC2Zr7s9lpMORdgsDOpgJKixxtax8tHWaVYnyxScRa8U317n9BPgfm0c0nltjtJdQ==} @@ -586,8 +641,11 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + error-stack-parser@1.3.6: + resolution: {integrity: sha512-xhuSYd8wLgOXwNgjcPeXMPL/IiiA1Huck+OPvClpJViVNNlJVtM41o+1emp7bPvlCJwCatFX2DWc05/DgfbWzA==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -598,79 +656,94 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-react-debug@1.5.22: - resolution: {integrity: sha512-eOhqVLXDRXd7U4nto6sMfPqJDujFixKOsGB/zVmi7pISMYiAUU/b1UGbLzeV4Vr2jrdj5r+kHRwcwSSykX+h9Q==} + eslint-plugin-react-debug@1.15.0: + resolution: {integrity: sha512-zD5WOVPwKNnO4897gz2yjZZcvdGIObKEi4QURDammVEc3sCU0evHcAPEknTC1WEd7T8A4Zu7Vt7sDaUz/DALnA==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-dom@1.15.0: + resolution: {integrity: sha512-P8IdPfiEpDR8SHZdnYJzfdSkV++0hHzOJQhLW9eACyuGCBuzLj2gglmPR5gH2RG44R+Iq5+hsUVNv7sklThvRg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - eslint-plugin-react-dom@1.5.22: - resolution: {integrity: sha512-LVNsypBQOX/M+ATUTfEp0sRrYZ6y0bVeInxr+UdbdpierLvRuUmYEiqz2l4wGtY/FIb7TcG8G7+P2fXPdi8Pdw==} + eslint-plugin-react-hooks-extra@1.15.0: + resolution: {integrity: sha512-guIcax3c4Z/iWyDwZdo5b0qzqpJrhH4svYIfj+wEpfjRdIwpAvL0xM1uqJKdz8Hbgw1D+6dePSau4zmVkuaMqA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - eslint-plugin-react-hooks-extra@1.5.22: - resolution: {integrity: sha512-0X53hl6o8knK7Czx3AeS5F36RnBg+2M3xaxymz7dLd3xO9ISRjk9xZXDoqCMAM9P7/OAaOoWV08FpFZagiPoGA==} + eslint-plugin-react-naming-convention@1.15.0: + resolution: {integrity: sha512-XjbkBFEsaGvhDUKCxDCdJ34dsr/XnQu5a7hq6h2aNpnu05VGCAW6CXf3VuyI/sKfj3Em+aX/9eHdcRi12+dmLg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - eslint-plugin-react-naming-convention@1.5.22: - resolution: {integrity: sha512-krziXID2hyfm1Y8+5iFXMPpHztIfZQleifVRUiZDP/GDqAJsvfJmER32n8jCFPg8zu6fSHp2H5eRtAWCUkzYhQ==} + eslint-plugin-react-web-api@1.15.0: + resolution: {integrity: sha512-LUwzKumBApdKzUgl+9F5/TyJbYGQIOy450s6kr3rLPrc9tk8GQrBmSQKmWh2g7C1x7DIoMNFXeUuAD1q/1AKnw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - eslint-plugin-react-x@1.5.22: - resolution: {integrity: sha512-rihfTMt2E2UUWjY7xcU8EB4ZCDrcBY+x73uhL4H6D6QxH9SzxsXm9trBu7oU6TlKXmnMBJ9TapeCtyG3CSLXPw==} + eslint-plugin-react-x@1.15.0: + resolution: {integrity: sha512-TIZVElFYVXvybmMBVzHPF2hmsaG7greytHd80efUPopxlr+JGjKba6zA3cJAURn+yzN1x2zPJzss2BkB8/48aQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ^5.3.3 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.6.0: - resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} + eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -698,6 +771,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -705,10 +781,10 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.1.1: - resolution: {integrity: sha512-QfKBVg453Dyn3mr0Q0O+Tkr1r79lOTAKSi9f/Ot4+qVEwxWhav2Z+SudrG9vQjM2aYRMQQZ2/Q1zdA8ACM1pDg==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: - picomatch: 3.x + picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true @@ -717,8 +793,8 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-entry-cache@9.0.0: - resolution: {integrity: sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==} + file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} engines: {node: '>=18'} fill-range@7.1.1: @@ -740,8 +816,8 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} fs-extra@10.1.0: @@ -777,8 +853,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.8.0: - resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} engines: {node: '>=18'} globby@11.1.0: @@ -794,6 +870,15 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-request@6.1.0: + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -802,9 +887,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -812,9 +894,6 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} - i18next-fs-backend@2.3.1: - resolution: {integrity: sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg==} - i18next-locales-sync@2.1.0: resolution: {integrity: sha512-83TLJMD0368y3pLhQshYpO0kWYW0YTIg/vwI5IlB9ZaSTKA9stubTBJHFBugOg3TLc3ps+Qo6X9RIs2DTP+rHA==} engines: {node: '>=12'} @@ -823,11 +902,15 @@ packages: i18next-resources-to-backend@1.2.1: resolution: {integrity: sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==} - i18next@23.11.5: - resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} + i18next@23.16.0: + resolution: {integrity: sha512-Ni3CG6c14teOogY19YNRl+kYaE/Rb59khy0VyHVn4uOZ97E2E/Yziyi6r3C3s9+wacjdLZiq/LLYyx+Cgd+FCw==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -856,8 +939,8 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-immutable-type@4.0.0: - resolution: {integrity: sha512-gyFBCXv+NikTs8/PGZhgjbMmFZQ5jvHGZIsVu6+/9Bk4K7imlWBIDN7hTr9fNioGzFg71I4YM3z8f0aKXarTAw==} + is-immutable-type@5.0.0: + resolution: {integrity: sha512-mcvHasqbRBWJznuPqqHRKiJgYAz60sZ0mvO3bN70JbkuK7ksfmgc489aKZYxMEjIbRvyOseaTjaRZLRF/xFeRA==} peerDependencies: eslint: '*' typescript: '>=4.7.4' @@ -866,10 +949,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -877,6 +956,11 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -913,8 +997,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.31.0: - resolution: {integrity: sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==} + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -937,15 +1021,14 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.3.0: - resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.10.0: + resolution: {integrity: sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -955,10 +1038,14 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -970,8 +1057,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -981,17 +1068,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next-i18next@15.3.0: - resolution: {integrity: sha512-bq7Cc9XJFcmGOCLnyEtHaeJ3+JJNsI/8Pkj9BaHAnhm4sZ9vNNC4ZsaqYnlRZ7VH5ypSo73fEqLK935jLsmCvQ==} - engines: {node: '>=14'} - peerDependencies: - i18next: '>= 23.7.13' - next: '>= 12.0.0' - react: '>= 17.0.2' - react-i18next: '>= 13.5.0' - - next@14.2.4: - resolution: {integrity: sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==} + next@14.2.15: + resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -1008,6 +1086,15 @@ packages: sass: optional: true + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1024,6 +1111,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1048,8 +1138,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1059,17 +1149,17 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - postcss-resolve-nested-selector@0.1.1: - resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - postcss-safe-parser@7.0.0: - resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -1079,8 +1169,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1110,8 +1200,8 @@ packages: react: ^17.0 || ^18.0 react-dom: ^17.0 || ^18.0 - react-i18next@14.1.2: - resolution: {integrity: sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==} + react-i18next@15.0.3: + resolution: {integrity: sha512-BlO1P+oLKjjIxDBQ0GkAIMacgjfMbnvops+3Y5nZXF7UJ99v4KCWr0Na1azJXC8AMiNWp4kgUcFCJM7U9ZsUDg==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -1123,9 +1213,6 @@ packages: react-native: optional: true - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -1159,8 +1246,8 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -1172,6 +1259,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + short-unique-id@5.2.0: + resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + hasBin: true + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1184,10 +1275,29 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + + stack-generator@1.1.0: + resolution: {integrity: sha512-sZDVjwC56vZoo+a5t0LH/1sMQLWYLi/r+Z2ztyCAOhOX3QBP34GWxK0FWf2eU1TIU2CJKCKBAtDZycUh/ZKMlw==} + + stackframe@0.3.1: + resolution: {integrity: sha512-XmoiF4T5nuWEp2x2w92WdGjdHGY/cZa6LIbRsDRQR/Xlk4uW0PAUlH1zJYVffocwKpCdwyuypIp25xsSXEtZHw==} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-gps@2.4.4: + resolution: {integrity: sha512-msFhuMEEklQLUtaJ+GeCDjzUN+PamfHWQiK3C1LnbHjoxSeF5dAxiE+aJkptNMmMNOropGFJ7G3ZT7dPZHgDaQ==} + + stacktrace-js@1.3.1: + resolution: {integrity: sha512-b+5voFnXqg9TWdOE50soXL+WuOreYUm1Ukg9U7rzEWGL4+gcVxIcFasNBtOffVX0I1lYqVZj0PZXZvTt5e3YRQ==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -1231,8 +1341,8 @@ packages: babel-plugin-macros: optional: true - stylelint@16.6.1: - resolution: {integrity: sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==} + stylelint@16.10.0: + resolution: {integrity: sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -1244,8 +1354,8 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-hyperlinks@3.0.0: - resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} engines: {node: '>=14.18'} svg-tags@1.0.0: @@ -1262,41 +1372,49 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - ts-declaration-location@1.0.1: - resolution: {integrity: sha512-bCWJovNLBiS34rMD1o6AX+INI5n6ujtB9bPp/1a/opc9ExycJKpB/XcgIsVs66RH7SxAbsYcJBkrLrnLcDF0TA==} + ts-declaration-location@1.0.4: + resolution: {integrity: sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg==} peerDependencies: typescript: '>=4.0.0' - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + ts-pattern@5.5.0: + resolution: {integrity: sha512-jqbIpTsa/KKTJYWgPNsFNbLVpwCgzXfFJ1ukNn4I8hMwyQzHMJnk/BqWzggB0xpkILuKzaO/aMYhS0SkaJyKXg==} + + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@7.15.0: - resolution: {integrity: sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==} - engines: {node: ^18.18.0 || >=20.0.0} + typescript-eslint@8.9.0: + resolution: {integrity: sha512-AuD/FXGYRQyqyOBCpNLldMlsCGvmDNxptQ3Dp58/NXeB+FqyvTfXmMyba3PYa0Vi9ybnj7G8S/yd/4Cw8y47eA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript-logging@1.0.1: + resolution: {integrity: sha512-zp28ABme0m5q/nXabBaY9Hv/35N8lMH4FsvhpUO0zVi4vFs3uKlb5br2it61HAZF5k+U0aP6E67j0VD0IzXGpQ==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -1308,13 +1426,27 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - valibot@0.35.0: - resolution: {integrity: sha512-+i2aCRkReTrd5KBN/dW2BrPOvFnU5LXTV2xjZnjnqUIO8YUx6P2+MgRrkwF2FhkexgyKq/NIZdPdknhHf5A/Ww==} + viem@2.21.28: + resolution: {integrity: sha512-CbS2Ldq+SdZYYSG+P4oNLi1s6xq7JnZoJsIkMhFcZUMRz3w2J1OvC1izUp6E1/Zp/XXo3wt6g/Ae+f3SGzup2A==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -1340,6 +1472,18 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1358,163 +1502,221 @@ packages: snapshots: - '@babel/code-frame@7.24.7': + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.0': {} + + '@babel/code-frame@7.25.7': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/highlight': 7.25.7 + picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} - '@babel/highlight@7.24.7': + '@babel/highlight@7.25.7': dependencies: - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-validator-identifier': 7.25.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 - '@babel/runtime@7.24.7': + '@babel/runtime@7.25.7': dependencies: regenerator-runtime: 0.14.1 - '@csstools/css-parser-algorithms@2.7.0(@csstools/css-tokenizer@2.3.3)': + '@csstools/css-parser-algorithms@3.0.2(@csstools/css-tokenizer@3.0.2)': dependencies: - '@csstools/css-tokenizer': 2.3.3 + '@csstools/css-tokenizer': 3.0.2 - '@csstools/css-tokenizer@2.3.3': {} + '@csstools/css-tokenizer@3.0.2': {} - '@csstools/media-query-list-parser@2.1.12(@csstools/css-parser-algorithms@2.7.0(@csstools/css-tokenizer@2.3.3))(@csstools/css-tokenizer@2.3.3)': + '@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.2(@csstools/css-tokenizer@3.0.2))(@csstools/css-tokenizer@3.0.2)': dependencies: - '@csstools/css-parser-algorithms': 2.7.0(@csstools/css-tokenizer@2.3.3) - '@csstools/css-tokenizer': 2.3.3 + '@csstools/css-parser-algorithms': 3.0.2(@csstools/css-tokenizer@3.0.2) + '@csstools/css-tokenizer': 3.0.2 - '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.0)': + '@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2)': dependencies: - postcss-selector-parser: 6.1.0 + postcss-selector-parser: 6.1.2 '@dual-bundle/import-meta-resolve@4.1.0': {} - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@ensdomains/address-encoder@1.0.0-rc.3': + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + + '@ensdomains/address-encoder@1.1.1': + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + + '@ensdomains/content-hash@3.1.0-rc.1': + dependencies: + '@ensdomains/address-encoder': 1.0.0-rc.3 + '@noble/curves': 1.6.0 + '@scure/base': 1.1.9 + + '@ensdomains/dnsprovejs@0.5.1': + dependencies: + '@noble/hashes': 1.5.0 + dns-packet: 5.6.1 + typescript-logging: 1.0.1 + + '@ensdomains/ensjs@4.0.1-alpha.0(typescript@5.6.3)(viem@2.21.28(typescript@5.6.3))': + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@ensdomains/address-encoder': 1.1.1 + '@ensdomains/content-hash': 3.1.0-rc.1 + '@ensdomains/dnsprovejs': 0.5.1 + abitype: 1.0.6(typescript@5.6.3) + dns-packet: 5.6.1 + graphql: 16.9.0 + graphql-request: 6.1.0(graphql@16.9.0) + pako: 2.1.0 + viem: 2.21.28(typescript@5.6.3) + transitivePeerDependencies: + - encoding + - typescript + - zod + + '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': dependencies: - eslint: 9.6.0 + eslint: 9.12.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.11.1': {} - '@eslint-react/ast@1.5.22(eslint@9.6.0)(typescript@5.5.3)': + '@eslint-react/ast@1.15.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + birecord: 0.1.1 + string-ts: 2.2.0 + ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.5.22(eslint@9.6.0)(typescript@5.5.3)': - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/var': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/core@1.15.0(eslint@9.12.0)(typescript@5.6.3)': + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + birecord: 0.1.1 + short-unique-id: 5.2.0 + ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/eslint-plugin@1.5.22(eslint@9.6.0)(typescript@5.5.3)': - dependencies: - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 - eslint-plugin-react-debug: 1.5.22(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-react-dom: 1.5.22(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-react-hooks-extra: 1.5.22(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-react-naming-convention: 1.5.22(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-react-x: 1.5.22(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/eslint-plugin@1.15.0(eslint@9.12.0)(typescript@5.6.3)': + dependencies: + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + eslint-plugin-react-debug: 1.15.0(eslint@9.12.0)(typescript@5.6.3) + eslint-plugin-react-dom: 1.15.0(eslint@9.12.0)(typescript@5.6.3) + eslint-plugin-react-hooks-extra: 1.15.0(eslint@9.12.0)(typescript@5.6.3) + eslint-plugin-react-naming-convention: 1.15.0(eslint@9.12.0)(typescript@5.6.3) + eslint-plugin-react-web-api: 1.15.0(eslint@9.12.0)(typescript@5.6.3) + eslint-plugin-react-x: 1.15.0(eslint@9.12.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.5.22(eslint@9.6.0)(typescript@5.5.3)': + '@eslint-react/jsx@1.15.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/var': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.5.22(eslint@9.6.0)(typescript@5.5.3)': + '@eslint-react/shared@1.15.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - valibot: 0.35.0 + '@eslint-react/tools': 1.15.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + picomatch: 4.0.2 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/tools@1.5.22': {} + '@eslint-react/tools@1.15.0': {} - '@eslint-react/types@1.5.22(eslint@9.6.0)(typescript@5.5.3)': + '@eslint-react/types@1.15.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.5.22 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/tools': 1.15.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.5.22(eslint@9.6.0)(typescript@5.5.3)': + '@eslint-react/var@1.15.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint/compat@1.1.0': {} + '@eslint/compat@1.2.0(eslint@9.12.0)': + optionalDependencies: + eslint: 9.12.0 - '@eslint/config-array@0.17.0': + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.5 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + '@eslint/core@0.6.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 - espree: 10.1.0 + debug: 4.3.7 + espree: 10.2.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1522,13 +1724,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.12.0': {} '@eslint/object-schema@2.1.4': {} + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.9.0)': + dependencies: + graphql: 16.9.0 + + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': + dependencies: + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} '@isaacs/cliui@8.0.2': dependencies: @@ -1539,39 +1756,47 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@next/env@14.2.4': {} + '@leichtgewicht/ip-codec@2.0.5': {} + + '@next/env@14.2.15': {} - '@next/eslint-plugin-next@14.2.4': + '@next/eslint-plugin-next@14.2.15': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@14.2.4': + '@next/swc-darwin-arm64@14.2.15': optional: true - '@next/swc-darwin-x64@14.2.4': + '@next/swc-darwin-x64@14.2.15': optional: true - '@next/swc-linux-arm64-gnu@14.2.4': + '@next/swc-linux-arm64-gnu@14.2.15': optional: true - '@next/swc-linux-arm64-musl@14.2.4': + '@next/swc-linux-arm64-musl@14.2.15': optional: true - '@next/swc-linux-x64-gnu@14.2.4': + '@next/swc-linux-x64-gnu@14.2.15': optional: true - '@next/swc-linux-x64-musl@14.2.4': + '@next/swc-linux-x64-musl@14.2.15': optional: true - '@next/swc-win32-arm64-msvc@14.2.4': + '@next/swc-win32-arm64-msvc@14.2.15': optional: true - '@next/swc-win32-ia32-msvc@14.2.4': + '@next/swc-win32-ia32-msvc@14.2.15': optional: true - '@next/swc-win32-x64-msvc@14.2.4': + '@next/swc-win32-x64-msvc@14.2.15': optional: true + '@noble/curves@1.6.0': + dependencies: + '@noble/hashes': 1.5.0 + + '@noble/hashes@1.5.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1587,186 +1812,154 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@stylistic/eslint-plugin-js@2.3.0(eslint@9.6.0)': - dependencies: - '@types/eslint': 8.56.10 - acorn: 8.12.1 - eslint: 9.6.0 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + '@scure/base@1.1.9': {} - '@stylistic/eslint-plugin-jsx@2.3.0(eslint@9.6.0)': + '@scure/bip32@1.5.0': dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) - '@types/eslint': 8.56.10 - eslint: 9.6.0 - estraverse: 5.3.0 - picomatch: 4.0.2 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 - '@stylistic/eslint-plugin-plus@2.3.0(eslint@9.6.0)(typescript@5.5.3)': + '@scure/bip39@1.4.0': dependencies: - '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 - transitivePeerDependencies: - - supports-color - - typescript + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 - '@stylistic/eslint-plugin-ts@2.3.0(eslint@9.6.0)(typescript@5.5.3)': + '@stylistic/eslint-plugin@2.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) - '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin@2.3.0(eslint@9.6.0)(typescript@5.5.3)': - dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) - '@stylistic/eslint-plugin-jsx': 2.3.0(eslint@9.6.0) - '@stylistic/eslint-plugin-plus': 2.3.0(eslint@9.6.0)(typescript@5.5.3) - '@stylistic/eslint-plugin-ts': 2.3.0(eslint@9.6.0)(typescript@5.5.3) - '@types/eslint': 8.56.10 - eslint: 9.6.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 + estraverse: 5.3.0 + picomatch: 4.0.2 transitivePeerDependencies: - supports-color - typescript - '@stylistic/stylelint-plugin@2.1.2(stylelint@16.6.1(typescript@5.5.3))': + '@stylistic/stylelint-plugin@3.1.1(stylelint@16.10.0(typescript@5.6.3))': dependencies: - '@csstools/css-parser-algorithms': 2.7.0(@csstools/css-tokenizer@2.3.3) - '@csstools/css-tokenizer': 2.3.3 - '@csstools/media-query-list-parser': 2.1.12(@csstools/css-parser-algorithms@2.7.0(@csstools/css-tokenizer@2.3.3))(@csstools/css-tokenizer@2.3.3) + '@csstools/css-parser-algorithms': 3.0.2(@csstools/css-tokenizer@3.0.2) + '@csstools/css-tokenizer': 3.0.2 + '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.2(@csstools/css-tokenizer@3.0.2))(@csstools/css-tokenizer@3.0.2) is-plain-object: 5.0.0 - postcss-selector-parser: 6.1.0 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 style-search: 0.1.0 - stylelint: 16.6.1(typescript@5.5.3) + stylelint: 16.10.0(typescript@5.6.3) '@swc/counter@0.1.3': {} '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.3 - - '@types/eslint@8.56.10': - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.5': {} + tslib: 2.8.0 - '@types/hoist-non-react-statics@3.3.5': - dependencies: - '@types/react': 18.3.3 - hoist-non-react-statics: 3.3.2 + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} - '@types/node@20.14.9': + '@types/node@22.7.6': dependencies: - undici-types: 5.26.5 - - '@types/prop-types@15.7.12': {} + undici-types: 6.19.8 - '@types/react-helmet@6.1.11': - dependencies: - '@types/react': 18.3.3 + '@types/prop-types@15.7.13': {} - '@types/react@18.3.3': + '@types/react@18.3.11': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 - eslint: 9.6.0 + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.9.0 + eslint: 9.12.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 - debug: 4.3.5 - eslint: 9.6.0 + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.9.0 + debug: 4.3.7 + eslint: 9.12.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.15.0': + '@typescript-eslint/scope-manager@8.9.0': dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/visitor-keys': 8.9.0 - '@typescript-eslint/type-utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 9.6.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + debug: 4.3.7 + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.15.0': {} + '@typescript-eslint/types@8.9.0': {} - '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@8.9.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 - debug: 4.3.5 - globby: 11.1.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/visitor-keys': 8.9.0 + debug: 4.3.7 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.3) + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - eslint: 9.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + eslint: 9.12.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.15.0': + '@typescript-eslint/visitor-keys@8.9.0': dependencies: - '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/types': 8.9.0 eslint-visitor-keys: 3.4.3 - acorn-jsx@5.3.2(acorn@8.12.1): + abitype@1.0.6(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + acorn-jsx@5.3.2(acorn@8.13.0): dependencies: - acorn: 8.12.1 + acorn: 8.13.0 - acorn@8.12.1: {} + acorn@8.13.0: {} ajv@6.12.6: dependencies: @@ -1775,16 +1968,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.16.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -1806,6 +1999,8 @@ snapshots: balanced-match@2.0.0: {} + birecord@0.1.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -1825,7 +2020,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001640: {} + caniuse-lite@1.0.30001669: {} chalk@2.4.2: dependencies: @@ -1864,39 +2059,43 @@ snapshots: concat-map@0.0.1: {} - core-js@3.37.1: {} - - cosmiconfig@9.0.0(typescript@5.5.3): + cosmiconfig@9.0.0(typescript@5.6.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 countup.js@2.8.0: {} + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css-functions-list@3.2.2: {} + css-functions-list@3.2.3: {} - css-tree@2.3.1: + css-tree@3.0.0: dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.0 + mdn-data: 2.10.0 + source-map-js: 1.2.1 cssesc@3.0.0: {} csstype@3.1.3: {} - debug@4.3.5: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 deep-is@0.1.4: {} @@ -1904,6 +2103,10 @@ snapshots: dependencies: path-type: 4.0.0 + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + dune-api-client@1.0.1: {} eastasianwidth@0.2.0: {} @@ -1918,161 +2121,192 @@ snapshots: dependencies: is-arrayish: 0.2.1 - escalade@3.1.2: {} + error-stack-parser@1.3.6: + dependencies: + stackframe: 0.3.1 + + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-plugin-react-debug@1.5.22(eslint@9.6.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/core': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + eslint-plugin-react-debug@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 string-ts: 2.2.0 + ts-pattern: 5.5.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.5.22(eslint@9.6.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/core': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/var': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + eslint-plugin-react-dom@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + ts-pattern: 5.5.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.5.22(eslint@9.6.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/core': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/var': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + eslint-plugin-react-hooks-extra@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + ts-pattern: 5.5.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@1.5.22(eslint@9.6.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/core': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + eslint-plugin-react-naming-convention@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + ts-pattern: 5.5.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.5.22(eslint@9.6.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/core': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/shared': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/tools': 1.5.22 - '@eslint-react/types': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@eslint-react/var': 1.5.22(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 - is-immutable-type: 4.0.0(eslint@9.6.0)(typescript@5.5.3) + eslint-plugin-react-web-api@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + birecord: 0.1.1 + eslint: 9.12.0 + ts-pattern: 5.5.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-scope@8.0.1: + eslint-plugin-react-x@1.15.0(eslint@9.12.0)(typescript@5.6.3): + dependencies: + '@eslint-react/ast': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/core': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/jsx': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/shared': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/tools': 1.15.0 + '@eslint-react/types': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@eslint-react/var': 1.15.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + is-immutable-type: 5.0.0(eslint@9.12.0)(typescript@5.6.3) + ts-pattern: 5.5.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.1.0: {} - eslint@9.6.0: + eslint@9.12.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@eslint-community/regexpp': 4.11.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.6.0 + '@eslint/js': 9.12.0 + '@eslint/plugin-kit': 0.2.0 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 + debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 - esquery: 1.5.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@10.1.0: + espree@10.2.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + acorn: 8.13.0 + acorn-jsx: 5.3.2(acorn@8.13.0) + eslint-visitor-keys: 4.1.0 - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -2092,19 +2326,21 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.3: {} + fastest-levenshtein@1.0.16: {} fastq@1.17.1: dependencies: reusify: 1.0.4 - fdir@6.1.1(picomatch@4.0.2): + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -2112,7 +2348,7 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-entry-cache@9.0.0: + file-entry-cache@9.1.0: dependencies: flat-cache: 5.0.0 @@ -2137,7 +2373,7 @@ snapshots: flatted@3.3.1: {} - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -2160,7 +2396,7 @@ snapshots: glob@10.3.10: dependencies: - foreground-child: 3.2.1 + foreground-child: 3.3.0 jackspeak: 2.3.6 minimatch: 9.0.5 minipass: 7.1.2 @@ -2178,14 +2414,14 @@ snapshots: globals@14.0.0: {} - globals@15.8.0: {} + globals@15.11.0: {} globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -2195,39 +2431,45 @@ snapshots: graphemer@1.4.0: {} + graphql-request@6.1.0(graphql@16.9.0): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + cross-fetch: 3.1.8 + graphql: 16.9.0 + transitivePeerDependencies: + - encoding + + graphql@16.9.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 html-tags@3.3.1: {} - i18next-fs-backend@2.3.1: {} - i18next-locales-sync@2.1.0: dependencies: chalk: 4.1.2 - fdir: 6.1.1(picomatch@4.0.2) + fdir: 6.4.2(picomatch@4.0.2) fs-extra: 10.1.0 picomatch: 4.0.2 yargs: 17.7.2 i18next-resources-to-backend@1.2.1: dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.25.7 - i18next@23.11.5: + i18next@23.16.0: dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.25.7 - ignore@5.3.1: {} + ignore@5.3.2: {} + + ignore@6.0.2: {} import-fresh@3.3.0: dependencies: @@ -2248,24 +2490,26 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@4.0.0(eslint@9.6.0)(typescript@5.5.3): + is-immutable-type@5.0.0(eslint@9.12.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - ts-declaration-location: 1.0.1(typescript@5.5.3) - typescript: 5.5.3 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + eslint: 9.12.0 + ts-api-utils: 1.3.0(typescript@5.6.3) + ts-declaration-location: 1.0.4(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-object@5.0.0: {} isexe@2.0.0: {} + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 @@ -2300,7 +2544,7 @@ snapshots: kind-of@6.0.3: {} - known-css-properties@0.31.0: {} + known-css-properties@0.34.0: {} levn@0.4.1: dependencies: @@ -2321,21 +2565,25 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.3.0: {} + lru-cache@10.4.3: {} mathml-tag-names@2.1.3: {} - mdn-data@2.0.30: {} + mdn-data@2.10.0: {} meow@13.2.0: {} merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2346,49 +2594,41 @@ snapshots: minipass@7.1.2: {} - ms@2.1.2: {} + ms@2.1.3: {} nanoid@3.3.7: {} natural-compare@1.4.0: {} - next-i18next@15.3.0(i18next@23.11.5)(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-i18next@14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.24.7 - '@types/hoist-non-react-statics': 3.3.5 - core-js: 3.37.1 - hoist-non-react-statics: 3.3.2 - i18next: 23.11.5 - i18next-fs-backend: 2.3.1 - next: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-i18next: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.4 + '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001640 + caniuse-lite: 1.0.30001669 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.4 - '@next/swc-darwin-x64': 14.2.4 - '@next/swc-linux-arm64-gnu': 14.2.4 - '@next/swc-linux-arm64-musl': 14.2.4 - '@next/swc-linux-x64-gnu': 14.2.4 - '@next/swc-linux-x64-musl': 14.2.4 - '@next/swc-win32-arm64-msvc': 14.2.4 - '@next/swc-win32-ia32-msvc': 14.2.4 - '@next/swc-win32-x64-msvc': 14.2.4 + '@next/swc-darwin-arm64': 14.2.15 + '@next/swc-darwin-x64': 14.2.15 + '@next/swc-linux-arm64-gnu': 14.2.15 + '@next/swc-linux-arm64-musl': 14.2.15 + '@next/swc-linux-x64-gnu': 14.2.15 + '@next/swc-linux-x64-musl': 14.2.15 + '@next/swc-win32-arm64-msvc': 14.2.15 + '@next/swc-win32-ia32-msvc': 14.2.15 + '@next/swc-win32-x64-msvc': 14.2.15 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + normalize-path@3.0.0: {} optionator@0.9.4: @@ -2408,13 +2648,15 @@ snapshots: dependencies: p-limit: 3.1.0 + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.25.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -2425,24 +2667,24 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.3.0 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.2: {} - postcss-resolve-nested-selector@0.1.1: {} + postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.0(postcss@8.4.39): + postcss-safe-parser@7.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.39 + postcss: 8.4.47 - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -2452,14 +2694,14 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 - postcss@8.4.39: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -2483,17 +2725,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-i18next@14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-i18next@15.0.3(i18next@23.16.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.25.7 html-parse-stringify: 3.0.1 - i18next: 23.11.5 + i18next: 23.16.0 react: 18.3.1 optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-is@16.13.1: {} - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -2518,7 +2758,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - semver@7.6.2: {} + semver@7.6.3: {} shebang-command@2.0.0: dependencies: @@ -2526,6 +2766,8 @@ snapshots: shebang-regex@3.0.0: {} + short-unique-id@5.2.0: {} + signal-exit@4.1.0: {} slash@3.0.0: {} @@ -2536,7 +2778,28 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + + source-map@0.5.6: {} + + stack-generator@1.1.0: + dependencies: + stackframe: 1.3.4 + + stackframe@0.3.1: {} + + stackframe@1.3.4: {} + + stacktrace-gps@2.4.4: + dependencies: + source-map: 0.5.6 + stackframe: 0.3.1 + + stacktrace-js@1.3.1: + dependencies: + error-stack-parser: 1.3.6 + stack-generator: 1.1.0 + stacktrace-gps: 2.4.4 streamsearch@1.1.0: {} @@ -2560,7 +2823,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-json-comments@3.1.1: {} @@ -2571,44 +2834,43 @@ snapshots: client-only: 0.0.1 react: 18.3.1 - stylelint@16.6.1(typescript@5.5.3): + stylelint@16.10.0(typescript@5.6.3): dependencies: - '@csstools/css-parser-algorithms': 2.7.0(@csstools/css-tokenizer@2.3.3) - '@csstools/css-tokenizer': 2.3.3 - '@csstools/media-query-list-parser': 2.1.12(@csstools/css-parser-algorithms@2.7.0(@csstools/css-tokenizer@2.3.3))(@csstools/css-tokenizer@2.3.3) - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) + '@csstools/css-parser-algorithms': 3.0.2(@csstools/css-tokenizer@3.0.2) + '@csstools/css-tokenizer': 3.0.2 + '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.2(@csstools/css-tokenizer@3.0.2))(@csstools/css-tokenizer@3.0.2) + '@csstools/selector-specificity': 4.0.0(postcss-selector-parser@6.1.2) '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.5.3) - css-functions-list: 3.2.2 - css-tree: 2.3.1 - debug: 4.3.5 + cosmiconfig: 9.0.0(typescript@5.6.3) + css-functions-list: 3.2.3 + css-tree: 3.0.0 + debug: 4.3.7 fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 - file-entry-cache: 9.0.0 + file-entry-cache: 9.1.0 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 5.3.1 + ignore: 6.0.2 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.31.0 + known-css-properties: 0.34.0 mathml-tag-names: 2.1.3 meow: 13.2.0 - micromatch: 4.0.7 + micromatch: 4.0.8 normalize-path: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.39 - postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 7.0.0(postcss@8.4.39) - postcss-selector-parser: 6.1.0 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.4.47) + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 - strip-ansi: 7.1.0 - supports-hyperlinks: 3.0.0 + supports-hyperlinks: 3.1.0 svg-tags: 1.0.0 table: 6.8.2 write-file-atomic: 5.0.1 @@ -2624,7 +2886,7 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.0.0: + supports-hyperlinks@3.1.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 @@ -2633,7 +2895,7 @@ snapshots: table@6.8.2: dependencies: - ajv: 8.16.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -2645,35 +2907,43 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@5.5.3): + tr46@0.0.3: {} + + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.5.3 + typescript: 5.6.3 - ts-declaration-location@1.0.1(typescript@5.5.3): + ts-declaration-location@1.0.4(typescript@5.6.3): dependencies: - minimatch: 9.0.5 - typescript: 5.5.3 + minimatch: 10.0.1 + typescript: 5.6.3 + + ts-pattern@5.5.0: {} - tslib@2.6.3: {} + tslib@2.8.0: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript-eslint@7.15.0(eslint@9.6.0)(typescript@5.5.3): + typescript-eslint@8.9.0(eslint@9.12.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - typescript@5.5.3: {} + typescript-logging@1.0.1: + dependencies: + stacktrace-js: 1.3.1 + + typescript@5.6.3: {} - undici-types@5.26.5: {} + undici-types@6.19.8: {} universalify@2.0.1: {} @@ -2683,10 +2953,38 @@ snapshots: util-deprecate@1.0.2: {} - valibot@0.35.0: {} + viem@2.21.28(typescript@5.6.3): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/bip32': 1.5.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.6(typescript@5.6.3) + isows: 1.0.6(ws@8.18.0) + webauthn-p256: 0.0.10 + ws: 8.18.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod void-elements@3.1.0: {} + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@1.3.1: dependencies: isexe: 2.0.0 @@ -2714,6 +3012,8 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@8.18.0: {} + y18n@5.0.8: {} yargs-parser@21.1.1: {} @@ -2721,7 +3021,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/public/assets/spinner.svg b/public/assets/spinner.svg new file mode 100644 index 00000000..a61e62f6 --- /dev/null +++ b/public/assets/spinner.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/app/(root)/brand/page.tsx b/src/app/(root)/brand/page.tsx index fc1a95f7..2285ecc6 100644 --- a/src/app/(root)/brand/page.tsx +++ b/src/app/(root)/brand/page.tsx @@ -1,307 +1,307 @@ -import { clsx } from 'clsx'; -import { readdir } from 'node:fs/promises'; -import { useTranslation } from '~/i18n/useTranslation'; -import ui from '~/styles/ui.module.css'; -import styles from './page.module.css'; -import { BrandColorObject, PageProps } from '~/utils/types'; -import { AssetDownloadButton } from '~/components/brand/AssetDownloadButton'; -import type { Metadata } from 'next'; -import { LinkList } from '~/components/LinkList/LinkList'; -import { BrandColor } from '~/components/brand/BrandColor'; -import { ExternalLink } from 'react-external-link'; +import { clsx } from 'clsx' +import { readdir } from 'node:fs/promises' +import { useTranslation } from '~/i18n/useTranslation' +import ui from '~/styles/ui.module.css' +import styles from './page.module.css' +import { BrandColorObject, PageProps } from '~/utils/types' +import { AssetDownloadButton } from '~/components/brand/AssetDownloadButton' +import type { Metadata } from 'next' +import { LinkList } from '~/components/LinkList/LinkList' +import { BrandColor } from '~/components/brand/BrandColor' +import { ExternalLink } from 'react-external-link' -const common = './public/assets/brand'; +const common = './public/assets/brand' const primaryPalette: BrandColorObject[] = [ - { - name: 'ENS Blue', - hex: '#0080BC', - RGB: '0, 128, 188', - textColor: 'white', - CMYK: '84%, 41%, 5%, 0%', - }, - { - name: 'Light Blue', - hex: '#CEE1E8', - RGB: '206, 255, 232', - textColor: 'black', - CMYK: '18%, 4%, 6%, 0%', - }, - { - name: 'Dark Blue', - hex: '#011A25', - RGB: '1, 26, 37', - textColor: 'white', - CMYK: '88%, 71%, 59%, 72%', - }, - { - name: 'White', - hex: '#f6f6f6', - RGB: '255, 255, 255', - textColor: 'black', - CMYK: '2%, 2%, 2%, 0%', - }, -]; + { + name: 'ENS Blue', + hex: '#0080BC', + RGB: '0, 128, 188', + textColor: 'white', + CMYK: '84%, 41%, 5%, 0%', + }, + { + name: 'Light Blue', + hex: '#CEE1E8', + RGB: '206, 255, 232', + textColor: 'black', + CMYK: '18%, 4%, 6%, 0%', + }, + { + name: 'Dark Blue', + hex: '#011A25', + RGB: '1, 26, 37', + textColor: 'white', + CMYK: '88%, 71%, 59%, 72%', + }, + { + name: 'White', + hex: '#f6f6f6', + RGB: '255, 255, 255', + textColor: 'black', + CMYK: '2%, 2%, 2%, 0%', + }, +] const extendedPalette: BrandColorObject[] = [ - { - name: 'Green', - hex: '#007C23', - RGB: '44, 24, 172', - CMYK: '88%, 26%, 100%, 15%', - textColor: 'white', - }, - { - name: 'Magenta', - hex: '#F53293', - RGB: '218, 94, 204', - CMYK: '0%, 92%, 1%, 0%', - textColor: 'white', - }, - { - name: 'Yellow', - hex: '#FFF72F', - RGB: '240, 223, 19', - CMYK: '4%, 0%, 87%, 0%', - textColor: 'black', - }, - { - name: 'Dark Brown', - hex: '#674D49', - RGB: '103, 77, 73', - CMYK: '50%, 63%, 61%, 34%', - textColor: 'white', - }, - { - name: 'Light Green', - hex: '#C5DDCC', - RGB: '197, 221, 204', - CMYK: '23%, 3%, 22%, 0%', - textColor: 'black', - }, - { - name: 'Light Magenta', - hex: '#F2C4DA', - RGB: '242, 196, 218', - CMYK: '2%, 27%, 1%, 0%', - textColor: 'black', - }, - { - name: 'Light Yellow', - hex: '#F8F6D6', - RGB: '248, 246, 214', - CMYK: '3%, 1%, 19%, 0%', - textColor: 'black', - }, - { - name: 'Midnight Blue', - hex: '#093C52', - RGB: '9, 60, 82', - CMYK: '89%, 27%, 0%, 68%', - textColor: 'white', - }, - { - name: 'Gray', - hex: '#4A5C63', - RGB: '74, 92, 99', - CMYK: '26%, 7%, 0%, 61%', - textColor: 'white', - }, - { - name: 'Gray 3', - hex: '#C4C7C8', - RGB: '196, 199, 200', - CMYK: '2%, 0%, 0%, 22%', - textColor: 'black', - }, - { - name: 'Gray 2', - hex: '#E5E5E5', - RGB: '229, 229, 229', - CMYK: '9%, 6%, 7%, 0%', - textColor: 'black', - }, -]; + { + name: 'Green', + hex: '#007C23', + RGB: '44, 24, 172', + CMYK: '88%, 26%, 100%, 15%', + textColor: 'white', + }, + { + name: 'Magenta', + hex: '#F53293', + RGB: '218, 94, 204', + CMYK: '0%, 92%, 1%, 0%', + textColor: 'white', + }, + { + name: 'Yellow', + hex: '#FFF72F', + RGB: '240, 223, 19', + CMYK: '4%, 0%, 87%, 0%', + textColor: 'black', + }, + { + name: 'Dark Brown', + hex: '#674D49', + RGB: '103, 77, 73', + CMYK: '50%, 63%, 61%, 34%', + textColor: 'white', + }, + { + name: 'Light Green', + hex: '#C5DDCC', + RGB: '197, 221, 204', + CMYK: '23%, 3%, 22%, 0%', + textColor: 'black', + }, + { + name: 'Light Magenta', + hex: '#F2C4DA', + RGB: '242, 196, 218', + CMYK: '2%, 27%, 1%, 0%', + textColor: 'black', + }, + { + name: 'Light Yellow', + hex: '#F8F6D6', + RGB: '248, 246, 214', + CMYK: '3%, 1%, 19%, 0%', + textColor: 'black', + }, + { + name: 'Midnight Blue', + hex: '#093C52', + RGB: '9, 60, 82', + CMYK: '89%, 27%, 0%, 68%', + textColor: 'white', + }, + { + name: 'Gray', + hex: '#4A5C63', + RGB: '74, 92, 99', + CMYK: '26%, 7%, 0%, 61%', + textColor: 'white', + }, + { + name: 'Gray 3', + hex: '#C4C7C8', + RGB: '196, 199, 200', + CMYK: '2%, 0%, 0%, 22%', + textColor: 'black', + }, + { + name: 'Gray 2', + hex: '#E5E5E5', + RGB: '229, 229, 229', + CMYK: '9%, 6%, 7%, 0%', + textColor: 'black', + }, +] -const filesToPaths = (files: string[], dir: string) => files.filter(x => x.endsWith('.svg')).map(x => `${common.replace('./public', '')}/${dir}/${x}`); -const filenameToVariantName = (file: string) => file.slice(file.lastIndexOf('-') + 1, file.indexOf('.svg')).replace('_', ' '); +const filesToPaths = (files: string[], dir: string) => files.filter(x => x.endsWith('.svg')).map(x => `${common.replace('./public', '')}/${dir}/${x}`) +const filenameToVariantName = (file: string) => file.slice(file.lastIndexOf('-') + 1, file.indexOf('.svg')).replace('_', ' ') const getStaticProps = async () => { - const logoFiles = filesToPaths(await readdir(`${common}/logo`), 'logo'); - const markLogoFiles = filesToPaths(await readdir(`${common}/mark`), 'mark'); + const logoFiles = filesToPaths(await readdir(`${common}/logo`), 'logo') + const markLogoFiles = filesToPaths(await readdir(`${common}/mark`), 'mark') - const logos = Object.fromEntries(logoFiles.map(file => ([filenameToVariantName(file), file]))); - const markLogos = Object.fromEntries(markLogoFiles.map(file => ([filenameToVariantName(file), file]))); + const logos = Object.fromEntries(logoFiles.map(file => ([filenameToVariantName(file), file]))) + const markLogos = Object.fromEntries(markLogoFiles.map(file => ([filenameToVariantName(file), file]))) - return { logos, markLogos }; -}; + return { logos, markLogos } +} export const generateMetadata = async ({ params }: PageProps): Promise => { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return { - title: `${t('brand.header.title')} | ENS`, - description: t('brand.header.description'), - }; -}; + return { + title: `${t('brand.header.title')} | ENS`, + description: t('brand.header.description'), + } +} export default async function Brand({ params }: PageProps) { - const { t } = await useTranslation(params.lang, 'translation'); - - const { markLogos, logos } = await getStaticProps(); + const { t } = await useTranslation(params.lang, 'translation') - return ( -
-
-

{t('brand.header.title')}

- -
-
-
-

{t('brand.assets.title')}

-

{t('brand.assets.description')}

-
-
- {t('brand.button')} -
{t('brand.assets.symbol.title')}
-

{t('brand.assets.symbol.description')}

-
-
- {Object.entries(markLogos).map(([name, url]) => ( -
- - -
{name}
-
- ))} -
-
-
- Logo Blueprint -
-
-
{t('brand.assets.space.title')}
-

{t('brand.assets.space.description')}

-
-
-
-
- Logo Blueprint - -
-
-
{t('brand.assets.token.title')}
-

{t('brand.assets.token.description')}

-
-
-
-
- {t('brand.button')} -
{t('brand.assets.lockup.title')}
-

{t('brand.assets.lockup.description')}

-
-
- {Object.entries(logos).map(([name, url]) => ( -
- - -
{name}
-
- ))} -
-
-
- Logo with text blueprint -
-
-
{t('brand.assets.space.title')}
-

{t('brand.assets.space.description')}

-
-
-
-
+ const { markLogos, logos } = await getStaticProps() -
-
-

{t('brand.assets.palette.title')}

-

{t('brand.assets.palette.description')}

-
-
-
{t('brand.assets.palette.primary.title')}
-

{t('brand.assets.palette.primary.description')}

-
-
- {primaryPalette.map(color => )} -
-
-
{t('brand.assets.palette.secondary.title')}
-

{t('brand.assets.palette.secondary.description')}

-
-
- {extendedPalette.map(color => )} -
-
- -
- -
{t('brand.assets.guidelines.description')}
- - {t('brand.assets.guidelines.button')} - -
- ), - }, - { - title: t('brand.extra.partnerships.title'), - description: ( - <> - {t('brand.extra.partnerships.description')} -
    -
  • {t('brand.extra.partnerships.list.1')}
  • -
  • {t('brand.extra.partnerships.list.2')}
  • -
  • {t('brand.extra.partnerships.list.3')}
  • -
- {t('brand.extra.partnerships.extra')} - ), - }, - { - title: t('brand.extra.ecosystem.title'), - description: ( - <> - {t('brand.extra.ecosystem.description')} -
    -
  • {t('brand.extra.ecosystem.list.1')}
  • -
  • {t('brand.extra.ecosystem.list.2')}
  • -
- {t('brand.extra.ecosystem.extra')} - ), - }, + return ( +
+
+

{t('brand.header.title')}

+ +
+
+
+

{t('brand.assets.title')}

+

{t('brand.assets.description')}

+
+
+ {t('brand.button')} +
{t('brand.assets.symbol.title')}
+

{t('brand.assets.symbol.description')}

+
+
+ {Object.entries(markLogos).map(([name, url]) => ( +
+ + +
{name}
+
+ ))} +
+
+
+ Logo Blueprint +
+
+
{t('brand.assets.space.title')}
+

{t('brand.assets.space.description')}

+
+
+
+
+ Logo Blueprint + +
+
+
{t('brand.assets.token.title')}
+

{t('brand.assets.token.description')}

+
+
+
+
+ {t('brand.button')} +
{t('brand.assets.lockup.title')}
+

{t('brand.assets.lockup.description')}

+
+
+ {Object.entries(logos).map(([name, url]) => ( +
+ + -
+
{name}
+ + ))} +
+
+
+ Logo with text blueprint +
+
+
{t('brand.assets.space.title')}
+

{t('brand.assets.space.description')}

+
+
+ + + +
+
+

{t('brand.assets.palette.title')}

+

{t('brand.assets.palette.description')}

+
+
+
{t('brand.assets.palette.primary.title')}
+

{t('brand.assets.palette.primary.description')}

- ); +
+ {primaryPalette.map(color => )} +
+
+
{t('brand.assets.palette.secondary.title')}
+

{t('brand.assets.palette.secondary.description')}

+
+
+ {extendedPalette.map(color => )} +
+
+ +
+ +
{t('brand.assets.guidelines.description')}
+ + {t('brand.assets.guidelines.button')} + + + ), + }, + { + title: t('brand.extra.partnerships.title'), + description: ( + <> + {t('brand.extra.partnerships.description')} +
    +
  • {t('brand.extra.partnerships.list.1')}
  • +
  • {t('brand.extra.partnerships.list.2')}
  • +
  • {t('brand.extra.partnerships.list.3')}
  • +
+ {t('brand.extra.partnerships.extra')} + ), + }, + { + title: t('brand.extra.ecosystem.title'), + description: ( + <> + {t('brand.extra.ecosystem.description')} +
    +
  • {t('brand.extra.ecosystem.list.1')}
  • +
  • {t('brand.extra.ecosystem.list.2')}
  • +
+ {t('brand.extra.ecosystem.extra')} + ), + }, + ]} + /> +
+ + ) } diff --git a/src/app/(root)/developers/page.tsx b/src/app/(root)/developers/page.tsx index dec2ec26..68f7075f 100644 --- a/src/app/(root)/developers/page.tsx +++ b/src/app/(root)/developers/page.tsx @@ -1,172 +1,172 @@ -import { clsx } from 'clsx'; -import { CSSProperties } from 'react'; -import type { Metadata } from 'next'; +import { clsx } from 'clsx' +import { CSSProperties } from 'react' +import type { Metadata } from 'next' -import { Header } from '~/components/Header/Header'; -import { LinkList } from '~/components/LinkList/LinkList'; -import { TwoCol } from '~/components/TwoCol/TwoCol'; -import { useTranslation } from '~/i18n/useTranslation'; -import ui from '~/styles/ui.module.css'; -import styles from './page.module.css'; -import { HeroContent } from '~/components/developers/header/HeroContent'; -import { SectionWithPreview } from '~/components/SectionWithPreview/SectionWithPreview'; -import { PageProps } from '~/utils/types'; -import { StatsCounter } from '~/components/animation/StatsCounter'; +import { Header } from '~/components/Header/Header' +import { LinkList } from '~/components/LinkList/LinkList' +import { TwoCol } from '~/components/TwoCol/TwoCol' +import { useTranslation } from '~/i18n/useTranslation' +import ui from '~/styles/ui.module.css' +import styles from './page.module.css' +import { HeroContent } from '~/components/developers/header/HeroContent' +import { SectionWithPreview } from '~/components/SectionWithPreview/SectionWithPreview' +import { PageProps } from '~/utils/types' +import { StatsCounter } from '~/components/animation/StatsCounter' -import stats from '~/stats/grants.json'; -import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage'; +import stats from '~/stats/grants.json' +import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage' export const generateMetadata = async ({ params }: PageProps): Promise => { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return { - title: `${t('developers.hero.tag')} | ENS`, - description: t('developers.hero.text'), - }; -}; + return { + title: `${t('developers.hero.tag')} | ENS`, + description: t('developers.hero.text'), + } +} export default async function Developers({ - params, + params, }: PageProps) { - const { t } = await useTranslation(params.lang, 'translation'); - - return ( -
+ const { t } = await useTranslation(params.lang, 'translation') -
- -
+ return ( +
-
-
-

- {t('developers.resources.title')} -

- -
-
- -
- - - - - - - +
+ +
-
-
+
+
+

+ {t('developers.resources.title')} +

+ +
+
+
- ); + + + + + + + + + +
+
+ ) } diff --git a/src/app/(root)/ecosystem/page.tsx b/src/app/(root)/ecosystem/page.tsx index 156ab70d..fa493869 100644 --- a/src/app/(root)/ecosystem/page.tsx +++ b/src/app/(root)/ecosystem/page.tsx @@ -1,122 +1,122 @@ -import { clsx } from 'clsx'; -import { CSSProperties } from 'react'; +import { clsx } from 'clsx' +import { CSSProperties } from 'react' -import { ColorCards } from '~/components/ColorCards/ColorCards'; -import { Header } from '~/components/Header/Header'; -import { LinkList } from '~/components/LinkList/LinkList'; -import { SmallLinkList } from '~/components/SmallLinkList/SmallLinkList'; -import { useTranslation } from '~/i18n/useTranslation'; +import { ColorCards } from '~/components/ColorCards/ColorCards' +import { Header } from '~/components/Header/Header' +import { LinkList } from '~/components/LinkList/LinkList' +import { SmallLinkList } from '~/components/SmallLinkList/SmallLinkList' +import { useTranslation } from '~/i18n/useTranslation' -import styles from './page.module.css'; -import ui from '~/styles/ui.module.css'; -import { EcosystemList } from '~/components/ecosystem/EcosystemList'; -import type { Metadata } from 'next'; -import type { PageProps } from '~/utils/types'; +import styles from './page.module.css' +import ui from '~/styles/ui.module.css' +import { EcosystemList } from '~/components/ecosystem/EcosystemList' +import type { Metadata } from 'next' +import type { PageProps } from '~/utils/types' export const generateMetadata = async ({ params }: PageProps): Promise => { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return { - title: `${t('ecosystem.hero.tag')} | ENS`, - description: t('ecosystem.hero.text'), - }; -}; + return { + title: `${t('ecosystem.hero.tag')} | ENS`, + description: t('ecosystem.hero.text'), + } +} export default async function Ecosystem({ - params, + params, }: PageProps) { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return ( -
-
- -
-
-
-

{t('ecosystem.integration.title')}

- +
+ +
+
+
+

{t('ecosystem.integration.title')}

+ -
+ }, + ]} + /> +
-
-
-

{t('ecosystem.partner.title')}

-

- {t('ecosystem.partner.description')} -

-
- +
+

{t('ecosystem.partner.title')}

+

+ {t('ecosystem.partner.description')} +

+
+ -
+ color: 'ens-blue', + link: 'mailto:support@ens.domains', + }, + ]} + /> +
-
-

Featured Partners

- -
- +
+

Featured Partners

+
- ); + +
+ ) } diff --git a/src/app/(root)/governance/page.tsx b/src/app/(root)/governance/page.tsx index abcd5242..43061ef3 100644 --- a/src/app/(root)/governance/page.tsx +++ b/src/app/(root)/governance/page.tsx @@ -1,222 +1,222 @@ -import { clsx } from 'clsx'; -import { CSSProperties } from 'react'; +import { clsx } from 'clsx' +import { CSSProperties } from 'react' -import { ColorCards } from '~/components/ColorCards/ColorCards'; -import { Header } from '~/components/Header/Header'; -import { LinkList } from '~/components/LinkList/LinkList'; -import { Language } from '~/i18n/settings'; -import { useTranslation } from '~/i18n/useTranslation'; +import { ColorCards } from '~/components/ColorCards/ColorCards' +import { Header } from '~/components/Header/Header' +import { LinkList } from '~/components/LinkList/LinkList' +import { Language } from '~/i18n/settings' +import { useTranslation } from '~/i18n/useTranslation' -import ui from '~/styles/ui.module.css'; -import styles from './page.module.css'; -import { TwoCol } from '~/components/TwoCol/TwoCol'; -import { SectionWithPreview } from '~/components/SectionWithPreview/SectionWithPreview'; -import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage'; -import { HeroContent } from '~/components/governance/HeroContent'; -import type { PageProps } from '~/utils/types'; -import type { Metadata } from 'next'; -import { StatsCounter } from '~/components/animation/StatsCounter'; -import stats from '~/stats/grants.json'; +import ui from '~/styles/ui.module.css' +import styles from './page.module.css' +import { TwoCol } from '~/components/TwoCol/TwoCol' +import { SectionWithPreview } from '~/components/SectionWithPreview/SectionWithPreview' +import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage' +import { HeroContent } from '~/components/governance/HeroContent' +import type { PageProps } from '~/utils/types' +import type { Metadata } from 'next' +import { StatsCounter } from '~/components/animation/StatsCounter' +import stats from '~/stats/grants.json' export const generateMetadata = async ({ params }: PageProps): Promise => { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return { - title: `${t('governance.hero.tag')} | ENS`, - description: t('governance.hero.text'), - }; -}; + return { + title: `${t('governance.hero.tag')} | ENS`, + description: t('governance.hero.text'), + } +} export default async function Governance({ - params, + params, }: { - params: { lang: Language }; + params: { lang: Language } }) { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return ( -
-
- -
+ return ( +
+
+ +
-
-
-

- {t('governance.extra.title')} -

- - - - - - - - - -
+
+
+

+ {t('governance.extra.title')} +

+ + + + + + + + + +
-
-

{t('governance.extra.resources.title')}

- -
+
+

{t('governance.extra.resources.title')}

+ +
-
-
-

{t('governance.join.title')}

-

- {t('governance.join.text')} -

-
- +
+

{t('governance.join.title')}

+

+ {t('governance.join.text')} +

+
+ -
- - -
+ color: 'ens-magenta', + link: 'https://delegate.ens.domains', + }, + ]} + />
- ); + + + +
+ ) } diff --git a/src/app/(root)/layout.tsx b/src/app/(root)/layout.tsx index b7bda766..a7fb9786 100644 --- a/src/app/(root)/layout.tsx +++ b/src/app/(root)/layout.tsx @@ -1,127 +1,127 @@ -import '~/styles/global.css'; +import '~/styles/global.css' -import { clsx } from 'clsx'; -import { inter, ebGaramond, ABCMonumentGrotesk, ABCMonumentGroteskMono, ABCMonumentGroteskSemiMono, ABCMarist } from 'fonts'; -import { Metadata } from 'next'; -import { ReactNode } from 'react'; -import { Language } from '~/i18n/settings'; -import { dir } from 'i18next'; -import { useTranslation } from '~/i18n/useTranslation'; -import { PageProps } from '~/utils/types'; -import { Navbar } from '~/components/Navbar/Navbar'; -import { Footer } from '~/components/Footer/Footer'; -export { generateStaticParams } from '~/utils/getStatic'; +import { clsx } from 'clsx' +import { inter, ebGaramond, ABCMonumentGrotesk, ABCMonumentGroteskMono, ABCMonumentGroteskSemiMono, ABCMarist } from 'fonts' +import { Metadata } from 'next' +import { ReactNode } from 'react' +import { Language } from '~/i18n/settings' +import { dir } from 'i18next' +import { useTranslation } from '~/i18n/useTranslation' +import { PageProps } from '~/utils/types' +import { Navbar } from '~/components/Navbar/Navbar' +import { Footer } from '~/components/Footer/Footer' +export { generateStaticParams } from '~/utils/getStatic' export const generateMetadata = async ({ params }: PageProps): Promise => { - const { t } = await useTranslation(params.lang, 'translation'); + const { t } = await useTranslation(params.lang, 'translation') - return { - title: 'ENS', - description: t('seo.description'), - applicationName: 'ENS', - openGraph: { - url: 'https://ens.domains', - type: 'website', - title: 'ENS', - siteName: 'ENS', - description: t('seo.description'), - images: 'http://ens.domains/og-image.png', - }, - }; -}; + return { + title: 'ENS', + description: t('seo.description'), + applicationName: 'ENS', + openGraph: { + url: 'https://ens.domains', + type: 'website', + title: 'ENS', + siteName: 'ENS', + description: t('seo.description'), + images: 'http://ens.domains/og-image.png', + }, + } +} -export default async function RootLayout({ children, params: { lang = 'en' } }: { children: ReactNode ; params: { lang?: Language } }) { - const { t } = await useTranslation(lang, 'translation'); +export default async function RootLayout({ children, params: { lang = 'en' } }: { children: ReactNode, params: { lang?: Language } }) { + const { t } = await useTranslation(lang, 'translation') - const footerItems = [ + const footerItems = [ + { + title: t('footer.community'), + entries: [ + { title: t('footer.blog'), link: 'https://blog.ens.domains' }, + { title: t('footer.feedback'), link: 'https://ens.canny.io/' }, + { + title: t('footer.discord'), + link: 'https://chat.ens.domains', + }, + { + title: t('footer.twitter'), + link: 'https://x.com/ensdomains', + }, + { + title: t('footer.github'), + link: 'https://github.com/ensdomains', + }, + { + title: t('footer.youtube'), + link: 'https://youtube.com/ensdomains', + }, + { + title: t('footer.forums'), + link: 'https://discuss.ens.domains', + }, + ], + }, + { + title: t('footer.help'), + entries: [ { - title: t('footer.community'), - entries: [ - { title: t('footer.blog'), link: 'https://blog.ens.domains' }, - { title: t('footer.feedback'), link: 'https://ens.canny.io/' }, - { - title: t('footer.discord'), - link: 'https://chat.ens.domains', - }, - { - title: t('footer.twitter'), - link: 'https://x.com/ensdomains', - }, - { - title: t('footer.github'), - link: 'https://github.com/ensdomains', - }, - { - title: t('footer.youtube'), - link: 'https://youtube.com/ensdomains', - }, - { - title: t('footer.forums'), - link: 'https://discuss.ens.domains', - }, - ], + title: t('footer.support'), + link: 'https://support.ens.domains', }, + { title: t('footer.contact'), link: 'mailto:support@ens.domains' }, + ], + }, + { + title: t('footer.ens'), + entries: [ + { title: t('footer.privacy-policy'), link: 'https://app.ens.domains/legal/privacy-policy' }, + { title: t('footer.tou'), link: 'https://app.ens.domains/legal/terms-of-use' }, { - title: t('footer.help'), - entries: [ - { - title: t('footer.support'), - link: 'https://support.ens.domains', - }, - { title: t('footer.contact'), link: 'mailto:support@ens.domains' }, - ], + title: t('footer.bugs'), + link: 'https://immunefi.com/bug-bounty/ens/', }, { - title: t('footer.ens'), - entries: [ - { title: t('footer.privacy-policy'), link: 'https://app.ens.domains/legal/privacy-policy' }, - { title: t('footer.tou'), link: 'https://app.ens.domains/legal/terms-of-use' }, - { - title: t('footer.bugs'), - link: 'https://immunefi.com/bug-bounty/ens/', - }, - { - title: t('footer.brand'), - link: '/brand', - }, - ], + title: t('footer.brand'), + link: '/brand', }, - ]; + ], + }, + ] - return ( - + + + + + +
+ - - - - - -
- - {children} -
-
- - - ); + /> + {children} +
+
+ + + ) } diff --git a/src/app/(root)/page.tsx b/src/app/(root)/page.tsx index 2923409b..37072f38 100644 --- a/src/app/(root)/page.tsx +++ b/src/app/(root)/page.tsx @@ -1,235 +1,241 @@ -import { clsx } from 'clsx'; +import { clsx } from 'clsx' -import { Carousel } from '~/components/Carousel/Carousel'; -import { ColorCards } from '~/components/ColorCards/ColorCards'; -import { FeaturePreview } from '~/components/FeaturePreview/FeaturePreview'; -import { Header } from '~/components/Header/Header'; -import { DappsAnimation } from '~/components/home/animations/DappsAnimation/DappsAnimation'; -import { MessageAnimation } from '~/components/home/animations/MessageAnimation/MessageAnimation'; -import { HeroContent } from '~/components/home/header/HeroContent/HeroContent'; -import { SearchInput } from '~/components/SearchInput/SearchInput'; -import { TwoCol } from '~/components/TwoCol/TwoCol'; -import { fallbackLng, Language } from '~/i18n/settings'; -import { useTranslation } from '~/i18n/useTranslation'; +import { Carousel } from '~/components/Carousel/Carousel' +import { ColorCards } from '~/components/ColorCards/ColorCards' +import { FeaturePreview } from '~/components/FeaturePreview/FeaturePreview' +import { Header } from '~/components/Header/Header' +import { DappsAnimation } from '~/components/home/animations/DappsAnimation/DappsAnimation' +import { MessageAnimation } from '~/components/home/animations/MessageAnimation/MessageAnimation' +import { HeroContent } from '~/components/home/header/HeroContent/HeroContent' +import { SearchInput } from '~/components/SearchInput/SearchInput' +import { TwoCol } from '~/components/TwoCol/TwoCol' +import { fallbackLng, Language } from '~/i18n/settings' +import { useTranslation } from '~/i18n/useTranslation' -import ui from '~/styles/ui.module.css'; -import styles from './page.module.css'; -import { PartnersList } from '~/components/home/PartnersList/PartnersList'; -import { PartnerEntry } from '~/utils/types'; -import { StatsCounter } from '~/components/home/animations/StatsCounter/StatsCounter'; -import Link from 'next/link'; -import { getLangPrefix } from '~/i18n/langPrefix'; -import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage'; +import ui from '~/styles/ui.module.css' +import styles from './page.module.css' +import { PartnersList } from '~/components/home/PartnersList/PartnersList' +import { PartnerEntry } from '~/utils/types' +import { StatsCounter } from '~/components/home/animations/StatsCounter/StatsCounter' +import Link from 'next/link' +import { getLangPrefix } from '~/i18n/langPrefix' +import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage' const partners: PartnerEntry[] = [ - /* temporary */ - { - name: 'Coinbase Wallet', - icon: 'coinbase.svg', - category: 'wallet', - }, - { - name: 'Rainbow', - icon: 'rainbow.svg', - category: 'wallet', - }, - { - name: 'Brave', - icon: 'brave.svg', - category: 'browser', - }, - { - name: 'GoDaddy', - icon: 'godaddy.svg', - category: 'service', - }, - { - name: 'Etherscan', - icon: 'etherscan.svg', - category: 'service', - }, - { - name: 'Uniswap', - icon: 'uniswap.svg', - category: 'dApp', - }, -]; + /* temporary */ + { + name: 'Coinbase Wallet', + icon: 'coinbase.svg', + category: 'wallet', + }, + { + name: 'Rainbow', + icon: 'rainbow.svg', + category: 'wallet', + }, + { + name: 'Brave', + icon: 'brave.svg', + category: 'browser', + }, + { + name: 'GoDaddy', + icon: 'godaddy.svg', + category: 'service', + }, + { + name: 'Etherscan', + icon: 'etherscan.svg', + category: 'service', + }, + { + name: 'Uniswap', + icon: 'uniswap.svg', + category: 'dApp', + }, +] export default async function Home({ params: { lang = fallbackLng } }: { params: { lang?: Language } }) { - const { t } = await useTranslation(lang, 'translation'); + const { t } = await useTranslation(lang, 'translation') - return ( - <> + return ( + <> -
+ +
+
+ +
+
+

{t('home.features.title')}

+

{t('home.features.text')}

+
+ + - - -
- -
-
-

{t('home.features.title')}

-

{t('home.features.text')}

-
- - - - - - - - - - - -
-
-
-

{t('home.gyow.title')}

-

- {t('home.gyow.description')} -

-
-
- -
-
-
+ + + + + + + + +
+
+
+

{t('home.gyow.title')}

+

+ {t('home.gyow.description')} +

+
+
+ +
+
+
-
-

{t('home.gateway.title')}

-

- {t('home.gateway.description')} -

-
+ ui.flex, + ui['flex-col'], + styles.gtwSection, + )} + > +
+

{t('home.gateway.title')}

+

+ {t('home.gateway.description')} +

+
-
-
{t('home.partners.tag')}
+
+
{t('home.partners.tag')}
-

- {t('home.partners.description')} -

- +

+ {t('home.partners.description')} +

+ - - {t('home.partners.button')} - -
-
- - -
- - ); + + {t('home.partners.button')} + +
+ + + +
+ + ) } diff --git a/src/components/AnimatedSquare/AnimatedSquare.tsx b/src/components/AnimatedSquare/AnimatedSquare.tsx index 564713a7..fd18d52e 100644 --- a/src/components/AnimatedSquare/AnimatedSquare.tsx +++ b/src/components/AnimatedSquare/AnimatedSquare.tsx @@ -1,7 +1,7 @@ -import { clsx } from 'clsx'; -import styles from './AnimatedSquare.module.css'; -import { HTMLAttributes } from 'react'; +import { clsx } from 'clsx' +import styles from './AnimatedSquare.module.css' +import { HTMLAttributes } from 'react' export const AnimatedSquare = ({ className, ...props }: HTMLAttributes) => ( -
-); +
+) diff --git a/src/components/Carousel/Carousel.tsx b/src/components/Carousel/Carousel.tsx index 60052e42..3025459e 100644 --- a/src/components/Carousel/Carousel.tsx +++ b/src/components/Carousel/Carousel.tsx @@ -1,14 +1,14 @@ -import { clsx } from 'clsx'; -import { FC, ReactNode } from 'react'; +import { clsx } from 'clsx' +import { FC, ReactNode } from 'react' -import ui from '~/styles/ui.module.css'; -import styles from './Carousel.module.css'; +import ui from '~/styles/ui.module.css' +import styles from './Carousel.module.css' -export const Carousel: FC<{ children: ReactNode[]; className?: string }> = ({ children, className }) => { - // later will be a real carousel - return ( -
- {children} -
- ); -}; +export const Carousel: FC<{ children: ReactNode[], className?: string }> = ({ children, className }) => { + // later will be a real carousel + return ( +
+ {children} +
+ ) +} diff --git a/src/components/ColorCards/ColorCards.tsx b/src/components/ColorCards/ColorCards.tsx index 8c007ad1..dc2d37c7 100644 --- a/src/components/ColorCards/ColorCards.tsx +++ b/src/components/ColorCards/ColorCards.tsx @@ -1,47 +1,47 @@ -import { CSSProperties, FC } from 'react'; +import { CSSProperties, FC } from 'react' -import styles from './ColorCards.module.css'; -import ui from '~/styles/ui.module.css'; +import styles from './ColorCards.module.css' +import ui from '~/styles/ui.module.css' -import type { Color } from '~/utils/types'; -import { clsx } from 'clsx'; -import { ExternalLink } from 'react-external-link'; +import type { Color } from '~/utils/types' +import { clsx } from 'clsx' +import { ExternalLink } from 'react-external-link' const getSquareVars = (color: Color): CSSProperties => { - switch (color) { - case 'ens-green': - return { - '--img': 'url("/assets/cards/green-normal.svg")', - '--img-hover': 'url("/assets/cards/green-hover.svg")', - } as CSSProperties; - case 'ens-blue': - return { - '--img': 'url("/assets/cards/blue-normal.svg")', - '--img-hover': 'url("/assets/cards/blue-hover.svg")', - } as CSSProperties; - case 'ens-magenta': - return { - '--img': 'url("/assets/cards/pink-normal.svg")', - '--img-hover': 'url("/assets/cards/pink-hover.svg")', - } as CSSProperties; - } -}; + switch (color) { + case 'ens-green': + return { + '--img': 'url("/assets/cards/green-normal.svg")', + '--img-hover': 'url("/assets/cards/green-hover.svg")', + } as CSSProperties + case 'ens-blue': + return { + '--img': 'url("/assets/cards/blue-normal.svg")', + '--img-hover': 'url("/assets/cards/blue-hover.svg")', + } as CSSProperties + case 'ens-magenta': + return { + '--img': 'url("/assets/cards/pink-normal.svg")', + '--img-hover': 'url("/assets/cards/pink-hover.svg")', + } as CSSProperties + } +} export const ColorCards: FC<{ - cards: { title: string; description: string; color: Color; link: string }[]; + cards: { title: string, description: string, color: Color, link: string }[] }> = ({ cards }) => { - return ( -
- {cards.map(({ title, description, color, link }) => ( - -
{title}
-
{description}
-
- - ))} -
- ); -}; + return ( +
+ {cards.map(({ title, description, color, link }) => ( + +
{title}
+
{description}
+
+ + ))} +
+ ) +} diff --git a/src/components/FeaturePreview/FeaturePreview.tsx b/src/components/FeaturePreview/FeaturePreview.tsx index 43ca142e..e29fe3ef 100644 --- a/src/components/FeaturePreview/FeaturePreview.tsx +++ b/src/components/FeaturePreview/FeaturePreview.tsx @@ -1,92 +1,92 @@ -import { clsx } from 'clsx'; -import { CSSProperties, FC, HTMLAttributes, ReactNode } from 'react'; +import { clsx } from 'clsx' +import { CSSProperties, FC, HTMLAttributes, ReactNode } from 'react' -import ui from '~/styles/ui.module.css'; -import type { Color } from '../../utils/types'; -import styles from './FeaturePreview.module.css'; +import ui from '~/styles/ui.module.css' +import type { Color } from '../../utils/types' +import styles from './FeaturePreview.module.css' const Indicator = ({ - indicatorColor, - isCurrent, + indicatorColor, + isCurrent, }: { - indicatorColor: Color; - isCurrent: boolean; + indicatorColor: Color + isCurrent: boolean }) => { - return ( -
-
- ); -}; + return ( +
+
+ ) +} export const FeaturePreview: FC< - { - title: string; - text: string; - backgroundColor: Color; - textColor: Color; - position: 0 | 1 | 2; - indicatorColor: Color; - gridSrc: string; - children: ReactNode; - } & Omit, 'title' | 'children'> + { + title: string + text: string + backgroundColor: Color + textColor: Color + position: 0 | 1 | 2 + indicatorColor: Color + gridSrc: string + children: ReactNode + } & Omit, 'title' | 'children'> > = ({ - title, - text, - children, - className, - backgroundColor, - indicatorColor, - textColor, - style, - position: currentPosition, - gridSrc, - ...props + title, + text, + children, + className, + backgroundColor, + indicatorColor, + textColor, + style, + position: currentPosition, + gridSrc, + ...props }) => { - return ( -
-
-
- {[0, 1, 2].map(position => ( - - ))} -
-
-

{title}

-

{text}

-
-
-
- {children} -
+ return ( +
+
+
+ {[0, 1, 2].map(position => ( + + ))} +
+
+

{title}

+

{text}

- ); -}; +
+
+ {children} +
+
+ ) +} diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index ef618c55..e8fd4961 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -1,38 +1,41 @@ -import { clsx } from 'clsx'; -import React, { FC } from 'react'; +import { clsx } from 'clsx' +import React, { FC } from 'react' -import ui from '~/styles/ui.module.css'; -import styles from './Footer.module.css'; -import { ExternalLink } from 'react-external-link'; +import ui from '~/styles/ui.module.css' +import styles from './Footer.module.css' +import { ExternalLink } from 'react-external-link' -export const Footer: FC<{ footerItems: { - title: string; +export const Footer: FC<{ + footerItems: { + title: string entries: { - title: string; - link: string; - }[]; -}[]; copyrightNotice: string; }> = ({ footerItems, copyrightNotice }) => { - return ( - <> -
- ENS -
- {footerItems.map(list => ( -
    -
    {list.title}
    - {list.entries.map(entry => ( -
  • - - {entry.title} - -
  • - ))} -
- ))} -
-
{copyrightNotice}
-
-
- - ); -}; + title: string + link: string + }[] + }[] + copyrightNotice: string +}> = ({ footerItems, copyrightNotice }) => { + return ( + <> +
+ ENS +
+ {footerItems.map(list => ( +
    +
    {list.title}
    + {list.entries.map(entry => ( +
  • + + {entry.title} + +
  • + ))} +
+ ))} +
+
{copyrightNotice}
+
+
+ + ) +} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 11483e2d..338d43cf 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,54 +1,54 @@ -import { clsx } from 'clsx'; -import { FC, HTMLAttributes, PropsWithChildren } from 'react'; +import { clsx } from 'clsx' +import { FC, HTMLAttributes, PropsWithChildren } from 'react' -import ui from '~/styles/ui.module.css'; -import styles from './Header.module.css'; +import ui from '~/styles/ui.module.css' +import styles from './Header.module.css' export const Header: FC< - PropsWithChildren<{ - title: string; - subtitle?: string; - description?: string; - tag?: string; - cta?: [string, string][]; + PropsWithChildren<{ + title: string + subtitle?: string + description?: string + tag?: string + cta?: [string, string][] - } & HTMLAttributes> + } & HTMLAttributes> > = ({ title, subtitle, tag, description, children, cta, className, ...props }) => { - return ( -
- {tag &&
{tag}
} -
-

- {title} - {subtitle && ( - <> -
- {subtitle} - - )} -

- {description &&

{description}

} -
{children}
-
- {cta && ( -
- {cta.map(([text, url]) => ( - - {text} - - ))} -
- )} -
- ); -}; + return ( +
+ {tag &&
{tag}
} +
+

+ {title} + {subtitle && ( + <> +
+ {subtitle} + + )} +

+ {description &&

{description}

} +
{children}
+
+ {cta && ( +
+ {cta.map(([text, url]) => ( + + {text} + + ))} +
+ )} +
+ ) +} diff --git a/src/components/LanguageSwitcher/LanguageSwitcher.tsx b/src/components/LanguageSwitcher/LanguageSwitcher.tsx index efa735f4..36138af0 100644 --- a/src/components/LanguageSwitcher/LanguageSwitcher.tsx +++ b/src/components/LanguageSwitcher/LanguageSwitcher.tsx @@ -1,51 +1,51 @@ -'use client'; +'use client' -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; -import { FC } from 'react'; +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { FC } from 'react' -import { getLangPrefix } from '~/i18n/langPrefix'; -import { Language, languageNames, languages } from '~/i18n/settings'; +import { getLangPrefix } from '~/i18n/langPrefix' +import { Language, languageNames, languages } from '~/i18n/settings' -import styles from './LanguageSwitcher.module.css'; -import { clsx } from 'clsx'; +import styles from './LanguageSwitcher.module.css' +import { clsx } from 'clsx' export const LanguageSwitcher: FC<{ lang: Language }> = ({ lang }) => { - const path = usePathname(); + const path = usePathname() - return ( -
- - - {languageNames[lang]} - {lang} - - -
    - {languages.map((language) => { - const languagePrefix = getLangPrefix(language); - const oldLanguagePrefix = getLangPrefix(lang); - const url - = path.replace(oldLanguagePrefix, languagePrefix) || '/'; + return ( +
    + + + {languageNames[lang]} + {lang} + + +
      + {languages.map((language) => { + const languagePrefix = getLangPrefix(language) + const oldLanguagePrefix = getLangPrefix(lang) + const url + = path.replace(oldLanguagePrefix, languagePrefix) || '/' - return ( -
    • - - {languageNames[language]} - {' '} - ( - {language.toUpperCase()} - ) -
      - -
    • - ); - })} -
    -
    - ); -}; + return ( +
  • + + {languageNames[language]} + {' '} + ( + {language.toUpperCase()} + ) +
    + +
  • + ) + })} +
+
+ ) +} diff --git a/src/components/LinkList/LinkList.tsx b/src/components/LinkList/LinkList.tsx index be008b26..457dd585 100644 --- a/src/components/LinkList/LinkList.tsx +++ b/src/components/LinkList/LinkList.tsx @@ -1,37 +1,37 @@ -import type { FC, ReactNode } from 'react'; +import type { FC, ReactNode } from 'react' -import ui from '~/styles/ui.module.css'; -import styles from './LinkList.module.css'; -import { ExternalLink } from 'react-external-link'; -import { clsx } from 'clsx'; +import ui from '~/styles/ui.module.css' +import styles from './LinkList.module.css' +import { ExternalLink } from 'react-external-link' +import { clsx } from 'clsx' export type ILink = { - title: string; - href?: string; - description: ReactNode; -}; + title: string + href?: string + description: ReactNode +} export const LinkList: FC<{ links: ILink[] }> = ({ links }) => { - return ( -
    - {links.map(({ title, href, description }) => ( -
  • - {href - ? ( - - {title} - - - - - ) - : ( - {title} - )} -

    {description}

    -
  • - ))} -
+ return ( +
    + {links.map(({ title, href, description }) => ( +
  • + {href + ? ( + + {title} + + + + + ) + : ( + {title} + )} +

    {description}

    +
  • + ))} +
- ); -}; + ) +} diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index 020f00b2..ac33db8c 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -1,120 +1,120 @@ -'use client'; +'use client' -import { clsx } from 'clsx'; -import Link from 'next/link'; -import { CSSProperties, FC, useState } from 'react'; -import { ExternalLink } from 'react-external-link'; +import { clsx } from 'clsx' +import Link from 'next/link' +import { CSSProperties, FC, useState } from 'react' +import { ExternalLink } from 'react-external-link' -import { getLangPrefix } from '~/i18n/langPrefix'; -import { fallbackLng, Language } from '~/i18n/settings'; +import { getLangPrefix } from '~/i18n/langPrefix' +import { fallbackLng, Language } from '~/i18n/settings' -import ui from '~/styles/ui.module.css'; +import ui from '~/styles/ui.module.css' // import { LanguageSwitcher } from '../LanguageSwitcher/LanguageSwitcher'; -import styles from './Navbar.module.css'; -import { NavbarFade } from './NavbarFade'; -import { EnsNavIcon } from '../icons'; -import { usePathname } from 'next/navigation'; +import styles from './Navbar.module.css' +import { NavbarFade } from './NavbarFade' +import { EnsNavIcon } from '../icons' +import { usePathname } from 'next/navigation' type Links = { - blog: string; - roadmap: string; - developers: string; - ecosystem: string; - governance: string; - launch: string; -}; + blog: string + roadmap: string + developers: string + ecosystem: string + governance: string + launch: string +} -export const Navbar: FC<{ lang: Language; links: Links }> = ({ - links, - lang = fallbackLng, +export const Navbar: FC<{ lang: Language, links: Links }> = ({ + links, + lang = fallbackLng, }) => { - const langPrefix = getLangPrefix((lang as Language) || fallbackLng); + const langPrefix = getLangPrefix((lang as Language) || fallbackLng) - const items = Object.entries(links).filter(([k]) => !['blog', 'roadmap', 'launch'].includes(k)); + const items = Object.entries(links).filter(([k]) => !['blog', 'roadmap', 'launch'].includes(k)) - const [isOpen, setOpen] = useState(false); + const [isOpen, setOpen] = useState(false) - const pathname = usePathname(); + const pathname = usePathname() - return ( - + ) +} diff --git a/src/components/Navbar/NavbarFade.tsx b/src/components/Navbar/NavbarFade.tsx index 4289d33d..753b2fe5 100644 --- a/src/components/Navbar/NavbarFade.tsx +++ b/src/components/Navbar/NavbarFade.tsx @@ -1,19 +1,19 @@ -'use client'; +'use client' -import { useEventListener } from '~/utils/useEventListener'; +import { useEventListener } from '~/utils/useEventListener' export const NavbarFade = () => { - useEventListener('scroll', () => { - const nav = document.getElementById('nav'); + useEventListener('scroll', () => { + const nav = document.getElementById('nav') - const isOpaque = nav.getAttribute('data-opaque'); - if (window.scrollY > 25 && !isOpaque) { - nav.setAttribute('data-opaque', 'true'); - } - else if (window.scrollY < 25 && isOpaque) { - nav.removeAttribute('data-opaque'); - } - }); + const isOpaque = nav.getAttribute('data-opaque') + if (window.scrollY > 25 && !isOpaque) { + nav.setAttribute('data-opaque', 'true') + } + else if (window.scrollY < 25 && isOpaque) { + nav.removeAttribute('data-opaque') + } + }) - return <>; -}; + return <> +} diff --git a/src/components/ResponsiveImage/ResponsiveImage.tsx b/src/components/ResponsiveImage/ResponsiveImage.tsx index e7774a25..e08c9eaf 100644 --- a/src/components/ResponsiveImage/ResponsiveImage.tsx +++ b/src/components/ResponsiveImage/ResponsiveImage.tsx @@ -1,23 +1,23 @@ -import { FC, HTMLAttributes, ImgHTMLAttributes, SourceHTMLAttributes } from 'react'; -import { Dimension } from '~/utils/useMq'; -import styles from './ResponsiveImage.module.css'; +import { FC, HTMLAttributes, ImgHTMLAttributes, SourceHTMLAttributes } from 'react' +import { Dimension } from '~/utils/useMq' +import styles from './ResponsiveImage.module.css' -type DesktopWithTablet = Exclude; +type DesktopWithTablet = Exclude type Props = HTMLAttributes & { - sources: Partial> & { mobile: string }; - sourceProps?: Partial>> & { mobile: ImgHTMLAttributes }; - alt?: string; -}; + sources: Partial> & { mobile: string } + sourceProps?: Partial>> & { mobile: ImgHTMLAttributes } + alt?: string +} -const defaultSourceProps = { desktop: {}, mobile: {}, tablet: {} } as const; +const defaultSourceProps = { desktop: {}, mobile: {}, tablet: {} } as const export const ResponsiveImage: FC = ( - { sources, alt = '', sourceProps = defaultSourceProps, ...props }, + { sources, alt = '', sourceProps = defaultSourceProps, ...props }, ) => ( - - {sources.desktop && } - {sources.tablet && } - - -); + + {sources.desktop && } + {sources.tablet && } + + +) diff --git a/src/components/SearchInput/SearchInput.module.css b/src/components/SearchInput/SearchInput.module.css index c9469071..ce8db60f 100644 --- a/src/components/SearchInput/SearchInput.module.css +++ b/src/components/SearchInput/SearchInput.module.css @@ -1,7 +1,6 @@ .input { display: block; width: 100%; - background-color: var(--ens-light-blue); color: var(--ens-dark-blue); border-style: none; border-radius: 4px; @@ -9,19 +8,27 @@ line-height: 96%; box-sizing: border-box; font-family: var(--ens-mono), monospace; + border: 2px solid var(--ens-light-blue); + background-color: var(--ens-white); font-size: 24px; padding: 20px; + outline: none; } -.inputSuffix { - color: var(--ens-dark-blue); - position: absolute; - left: calc(var(--left) + 1.5rem); - font-family: var(--ens-mono), monospace; +.input:placeholder-shown { + background-color: var(--ens-light-blue); - font-size: 24px; - top: calc(50% - 15px); + border-color: var(--ens-blue) !important; +} + +.input:focus-visible { + background-color: var(--ens-white); + border-color: var(--ens-blue); +} + +.input-invalid { + border-color: var(--ens-magenta) !important; } .icon { @@ -44,6 +51,13 @@ margin-top: 50px; } +.captionContainer { + display: flex; + flex-direction: row; + gap: 40px; + align-items: center; +} + .caption { font-weight: 500; font-family: var(--ens-mono); @@ -54,10 +68,6 @@ line-height: 96%; } -.input::after { - content: '.eth'; -} - .searchboxContainer { gap: 10px; width: 100%; @@ -69,16 +79,75 @@ width: 100%; } +.tlds { + display: flex; + flex-direction: row; + gap: 10px; +} + +.tlds > a { + padding: 12px; + border-radius: 4px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + + width: 100%; + margin-top: 10px; +} + +.tlds > a.registered { + background-color: var(--ens-light-blue); +} + +.tlds > a.available { + background-color: var(--ens-light-green); +} + +.tlds > a > span:first-child { + font-weight: 500; + color: var(--ens-dark-blue); + line-height: 96%; + font-size: 18px; +} + +.tlds > a > span:last-child { + font-size: 12px; + font-family: var(--ens-mono); +} + +.tlds > a.registered > span:last-child { + color: var(--ens-blue); +} + +.tlds > a.available > span:last-child { + color: var(--ens-green); +} + +.spinner { + height: 20px; + width: 20px; +} + +.invalid { + background-color: var(--ens-light-magenta); + color: var(--ens-dark-blue); + font-weight: 500; + padding: 12px; + border-radius: 4px; + font-size: 18px; + text-align: center; + + width: 100%; + margin-top: 10px; +} + @media (min-width: 768px) { .input { padding: 20px 24px; - } - .input, .inputSuffix { font-size: 52px; } - .inputSuffix { - top: 19px; - } .icon { height: 34px; width: 34px; @@ -93,13 +162,32 @@ letter-spacing: 0.4px; font-size: 20px; } + .tlds { + position: absolute; + gap: 20px; + right: 20px; + top: calc(50% - 41.2px / 2); + } + .invalid { + top: calc(50% - 49.5px / 2); + } + .tlds > a { + justify-content: flex-start; + gap: 20px; + } + .invalid, .tlds > a { + width: max-content; + margin-top: unset; + } + .spinner { + width: 36px; + height: 36px; + } } @media (min-width: 1280px) { .input { padding: 28px; - } - .input, .inputSuffix { font-size: 76px; } .icon { @@ -116,7 +204,20 @@ letter-spacing: -0.4px; font-size: 20px; } - .inputSuffix { - top: calc(56px / 2); + .tlds { + gap: 28px; + right: 28px; + top: calc(50% - 66px / 2); + } + .tlds > a { + padding: 16px 20px; + } + .tlds > a > span:first-child, .invalid { + font-size: 30px; + } + .spinner { + width: 58px; + height: 58px; } + } \ No newline at end of file diff --git a/src/components/SearchInput/SearchInput.tsx b/src/components/SearchInput/SearchInput.tsx index c8931e13..089417d5 100644 --- a/src/components/SearchInput/SearchInput.tsx +++ b/src/components/SearchInput/SearchInput.tsx @@ -1,62 +1,284 @@ -'use client'; +'use client' -import { clsx } from 'clsx'; +import { clsx } from 'clsx' -import ui from '~/styles/ui.module.css'; -import { SearchIcon } from '../icons'; -import styles from './SearchInput.module.css'; -import { CSSProperties, useState } from 'react'; +import ui from '~/styles/ui.module.css' +import { ArrowRightIcon, SearchIcon } from '../icons' +import styles from './SearchInput.module.css' +import { useEffect, useState } from 'react' +import { useDebounce } from '~/utils/useDebounce' +import { ExternalLink } from 'react-external-link' +import { checkBoxAvailable, checkEthAvailable } from '~/utils/available' -export const SearchInput = ({ caption, placeholder }: { caption: string; placeholder: string }) => { - const [value, setValue] = useState(''); +const ensProfileUrl = (name: string, available: boolean, tld: 'eth' | 'box') => + `https://app.ens.domains/${tld === 'eth' ? 'name/' : ''}${name}.${tld}${ + available ? (tld === 'box' ? '/dotbox' : '/register') : '' + }` +const showSuggestions = (name: string): boolean => + ['eth', 'box'].includes(name.split('.')[1]) + || name.split('.')[1] === undefined + +type CommonProps = { + viewText: string + invalidText: string + registerText: string +} + +const TldList = ({ + isLoading, + tld, + isInvalid, + invalidText, + isEnsAvailable, + isBoxInvalid, + name, + viewText, + registerText, + isBoxAvailable, +}: { + isLoading: boolean + tld: 'eth' | 'box' | undefined + isInvalid: boolean + isEnsAvailable: boolean + isBoxInvalid: boolean + name: string + isBoxAvailable: boolean +} & CommonProps) => { + if (isLoading) { + return ( + + ) + } + + if (name === '') { + return ( + + ) + } + + if (isInvalid) { return ( -
+ {invalidText} +
+ ) + } + + return ( +
+ {name.length > 2 && tld !== 'box' + ? ( + + .eth + + {isEnsAvailable ? registerText : viewText} + {' '} + + + + ) + : null} + {isBoxInvalid || tld === 'eth' + ? null + : ( + + .box + + {isBoxAvailable ? registerText : viewText} + {' '} + + + + )} +
+ ) +} + +export const SearchInput = ({ + caption, + placeholder, + viewText, + registerText, + invalidText, +}: { + caption: string + placeholder: string +} & CommonProps) => { + const [value, setValue] = useState('') + const [isEnsAvailable, setEnsAvailable] = useState(false) + const [isBoxAvailable, setBoxAvailable] = useState(false) + const [isBoxInvalid, setIsBoxInvalid] = useState(false) + const [isLoading, setIsLoading] = useState(false) + const [isInvalid, setIsInvalid] = useState(false) + + const debouncedValue = useDebounce(value, 500) + + const [name, tld] = debouncedValue.split('.') as [string, 'eth' | 'box'] + + useEffect(() => { + if (debouncedValue.includes('#')) { + // special case - URL hash + setIsInvalid(true) + setIsLoading(false) + } + else if ( + debouncedValue.length !== 0 + && showSuggestions(debouncedValue) + ) { + setIsInvalid(false) + setIsLoading(true) + if (tld === 'eth') { + checkEthAvailable(name) + .then((available) => { + setEnsAvailable(available) + }) + .catch(() => { + setIsInvalid(true) + }) + .finally(() => { + setIsLoading(false) + }) + } + else if (tld === 'box') { + checkBoxAvailable(name) + .then((available) => { + setBoxAvailable(available) + }) + .catch(() => { + setIsBoxInvalid(true) + }) + .finally(() => { + setIsLoading(false) + }) + } + else { + checkBoxAvailable(name) + .then((available) => { + setBoxAvailable(available) + }) + .catch(() => { + setIsBoxInvalid(true) + }) + .finally(() => { + setIsLoading(false) + }) + .then(() => { + checkEthAvailable(name) + .then((available) => { + if (name.length < 2) { + setEnsAvailable(false) + } + else setEnsAvailable(available) + }) + .catch(() => { + setIsInvalid(true) + }) + .finally(() => { + setIsLoading(false) + }) + }) + } + } + }, [debouncedValue]) + + return ( +
+
+ + {caption} + +
+
+
{ + e.preventDefault() + + if (e.currentTarget.reportValidity()) { + const fd = new FormData(e.currentTarget) + + location.assign( + `https://ens.app/${fd.get('ens')}.eth`, + ) + } + }} + className={clsx( + styles.inputContainer, + 'plausible-event-name=search', + )} + > + setValue(e.currentTarget.value)} + name="ens" + value={value} className={clsx( - ui.flex, - ui['flex-col'], - ui['flex-center'], - styles.container, + styles.input, + isInvalid && styles['input-invalid'], )} - > - - {caption} - - -
- { - e.preventDefault(); - - if (e.currentTarget.reportValidity()) { - const fd = new FormData(e.currentTarget); - - location.assign(`https://ens.app/${fd.get('ens')}.eth`); - } - }} - className={clsx(styles.inputContainer, 'plausible-event-name=search')} - > - setValue(e.currentTarget.value)} - name="ens" - className={styles.input} - placeholder={placeholder} - required - minLength={3} - /> - .eth - - -
-
- ); -}; + placeholder={placeholder} + required + minLength={2} + /> + {showSuggestions(debouncedValue) && ( + + )} + +
+
+ ) +} diff --git a/src/components/SectionWithPreview/SectionWithPreview.tsx b/src/components/SectionWithPreview/SectionWithPreview.tsx index 49d76b0f..945d7257 100644 --- a/src/components/SectionWithPreview/SectionWithPreview.tsx +++ b/src/components/SectionWithPreview/SectionWithPreview.tsx @@ -1,40 +1,40 @@ -import { FC, PropsWithChildren } from 'react'; -import styles from './SectionWithPreview.module.css'; -import ui from '~/styles/ui.module.css'; -import { clsx } from 'clsx'; -import { ButtonVariant } from '~/utils/types'; +import { FC, PropsWithChildren } from 'react' +import styles from './SectionWithPreview.module.css' +import ui from '~/styles/ui.module.css' +import { clsx } from 'clsx' +import { ButtonVariant } from '~/utils/types' type Props = { - title: string; - text: string; - cta?: { text: string; buttonVariant?: ButtonVariant; url: string }[]; -}; + title: string + text: string + cta?: { text: string, buttonVariant?: ButtonVariant, url: string }[] +} export const SectionWithPreview: FC> = ({ text, title, children, cta }) => { - return ( -
-
-
-

{title}

-

{text}

-
-
- {(cta || []).map(({ text, buttonVariant = 'primary', url }) => ( - - {text} - - ))} -
-
-
- {children} -
+ return ( +
+
+
+

{title}

+

{text}

- ); -}; +
+ {(cta || []).map(({ text, buttonVariant = 'primary', url }) => ( + + {text} + + ))} +
+
+
+ {children} +
+
+ ) +} diff --git a/src/components/SmallLinkList/SmallLinkList.tsx b/src/components/SmallLinkList/SmallLinkList.tsx index 61126c38..7694dd10 100644 --- a/src/components/SmallLinkList/SmallLinkList.tsx +++ b/src/components/SmallLinkList/SmallLinkList.tsx @@ -1,39 +1,39 @@ -import { FC } from 'react'; +import { FC } from 'react' -import styles from './SmallLinkList.module.css'; -import { ExternalLink } from 'react-external-link'; +import styles from './SmallLinkList.module.css' +import { ExternalLink } from 'react-external-link' export type ILink = { - title: string; - href: string; -}; + title: string + href: string +} export const SmallLinkList: FC<{ links: ILink[] }> = ({ links }) => { - return ( -
    - {links.map(({ title, href }) => ( -
  • - - {title} - - - - - - -
  • - ))} -
+ return ( +
    + {links.map(({ title, href }) => ( +
  • + + {title} + + + + + + +
  • + ))} +
- ); -}; + ) +} diff --git a/src/components/TwoCol/TwoCol.tsx b/src/components/TwoCol/TwoCol.tsx index 79803aa2..e8ff071c 100644 --- a/src/components/TwoCol/TwoCol.tsx +++ b/src/components/TwoCol/TwoCol.tsx @@ -1,51 +1,51 @@ -import { clsx } from 'clsx'; -import type { FC } from 'react'; +import { clsx } from 'clsx' +import type { FC } from 'react' -import type { ButtonVariant } from '~/utils/types'; +import type { ButtonVariant } from '~/utils/types' -import ui from '~/styles/ui.module.css'; -import styles from './TwoCol.module.css'; +import ui from '~/styles/ui.module.css' +import styles from './TwoCol.module.css' export const TwoCol: FC<{ - cols: { - tag: string; - title: string; - description: string; - button: string; - buttonVariant?: ButtonVariant; - href: string; - }[]; + cols: { + tag: string + title: string + description: string + button: string + buttonVariant?: ButtonVariant + href: string + }[] }> = ({ cols }) => ( -
- {cols.map( - ({ - tag, - title, - description, - button, - href, - buttonVariant = 'secondary', - }) => ( -
- {tag} -
-
-

{title}

-

{description}

-
- - {button} - -
-
- ), - )} -
-); +
+ {cols.map( + ({ + tag, + title, + description, + button, + href, + buttonVariant = 'secondary', + }) => ( +
+ {tag} +
+
+

{title}

+

{description}

+
+ + {button} + +
+
+ ), + )} +
+) diff --git a/src/components/animation/StatsCounter.tsx b/src/components/animation/StatsCounter.tsx index 9b0af0c2..ed5b9dd1 100644 --- a/src/components/animation/StatsCounter.tsx +++ b/src/components/animation/StatsCounter.tsx @@ -1,36 +1,36 @@ -'use client'; +'use client' -import CountUp, { type CountUpProps } from 'react-countup'; +import CountUp, { type CountUpProps } from 'react-countup' -import ui from '~/styles/ui.module.css'; -import styles from './StatsCounter.module.css'; -import { clsx } from 'clsx'; -import { ReactNode } from 'react'; +import ui from '~/styles/ui.module.css' +import styles from './StatsCounter.module.css' +import { clsx } from 'clsx' +import { ReactNode } from 'react' -export const StatsCounter = ({ captions, stats, children, ...props }: { captions: Record; stats: Record; children?: ReactNode } & Partial>) => { - return ( -
-
- {children} -
-
-
- {Object.entries(stats).map(([key, count], i) => ( -
- n.toLocaleString()} - {...props} - /> - {' '} - {captions[key]} -
- ))} -
-
- ); -}; +export const StatsCounter = ({ captions, stats, children, ...props }: { captions: Record, stats: Record, children?: ReactNode } & Partial>) => { + return ( +
+
+ {children} +
+
+
+ {Object.entries(stats).map(([key, count], i) => ( +
+ n.toLocaleString()} + {...props} + /> + {' '} + {captions[key]} +
+ ))} +
+
+ ) +} diff --git a/src/components/brand/AssetDownloadButton.tsx b/src/components/brand/AssetDownloadButton.tsx index 7c15da95..37c8f7db 100644 --- a/src/components/brand/AssetDownloadButton.tsx +++ b/src/components/brand/AssetDownloadButton.tsx @@ -1,27 +1,27 @@ -'use client'; +'use client' -import { HTMLAttributes } from 'react'; +import { HTMLAttributes } from 'react' -type Value = 'Download' | 'PNG' | 'SVG'; +type Value = 'Download' | 'PNG' | 'SVG' -export const AssetDownloadButton = ({ links, ...props }: { links: { url: string; title: string }[] } & HTMLAttributes) => { - return ( - { + const v = e.currentTarget.value as Value - const link = document.createElement('a'); - link.href = v; - link.download = v.slice(v.lastIndexOf('/') + 1); - link.click(); - }} - > - - {links.map(link => ( - - ))} - - ); -}; + const link = document.createElement('a') + link.href = v + link.download = v.slice(v.lastIndexOf('/') + 1) + link.click() + }} + > + + {links.map(link => ( + + ))} + + ) +} diff --git a/src/components/brand/BrandColor.tsx b/src/components/brand/BrandColor.tsx index 1043825c..8d5b7d63 100644 --- a/src/components/brand/BrandColor.tsx +++ b/src/components/brand/BrandColor.tsx @@ -1,49 +1,51 @@ -'use client'; +'use client' -import { CSSProperties, useEffect, useState } from 'react'; -import { BrandColorObject } from '~/utils/types'; -import styles from './BrandColor.module.css'; +import { CSSProperties, useEffect, useState } from 'react' +import { BrandColorObject } from '~/utils/types' +import styles from './BrandColor.module.css' -const ColorButton = ({ color, colorName }: { color: string; colorName: string }) => { - const [isCopied, setIsCopied] = useState(false); +const ColorButton = ({ color, colorName }: { color: string, colorName: string }) => { + const [isCopied, setIsCopied] = useState(false) - useEffect(() => { - if (isCopied) { - setTimeout(() => { - setIsCopied(false); - }, 1000); - } - }, [isCopied]); + useEffect(() => { + if (isCopied) { + const t = setTimeout(() => { + setIsCopied(false) + }, 1000) - return ( - - ); -}; + return ( + + ) +} + +export const BrandColor = (color: BrandColorObject) => ( +
+
{color.name}
+
+ + +
-); +
+) diff --git a/src/components/developers/header/HeroContent.tsx b/src/components/developers/header/HeroContent.tsx index 2ccb1b3f..667c50cb 100644 --- a/src/components/developers/header/HeroContent.tsx +++ b/src/components/developers/header/HeroContent.tsx @@ -1,45 +1,45 @@ -import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare'; -import styles from './HeroContent.module.css'; +import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare' +import styles from './HeroContent.module.css' export const HeroContent = () => { - return ( - <> -
-
- - - -
-
-
-
- - - -
-
- - ); -}; + return ( + <> +
+
+ + + +
+
+
+
+ + + +
+
+ + ) +} diff --git a/src/components/ecosystem/EcosystemList.tsx b/src/components/ecosystem/EcosystemList.tsx index c042b53f..3ef5cb0f 100644 --- a/src/components/ecosystem/EcosystemList.tsx +++ b/src/components/ecosystem/EcosystemList.tsx @@ -1,35 +1,35 @@ -import { clsx } from 'clsx'; -import ui from '~/styles/ui.module.css'; -import styles from './EcosystemList.module.css'; -import { AnimatedSquare } from '../AnimatedSquare/AnimatedSquare'; +import { clsx } from 'clsx' +import ui from '~/styles/ui.module.css' +import styles from './EcosystemList.module.css' +import { AnimatedSquare } from '../AnimatedSquare/AnimatedSquare' export const EcosystemList = () => { - return ( - <> -
-
- Coinbase -
-
- GoDaddy -
-
- Brave -
-
- Farcaster -
-
-
-
- - -
-
- - -
-
- - ); -}; + return ( + <> +
+
+ Coinbase +
+
+ GoDaddy +
+
+ Brave +
+
+ Farcaster +
+
+
+
+ + +
+
+ + +
+
+ + ) +} diff --git a/src/components/governance/HeroContent.tsx b/src/components/governance/HeroContent.tsx index e2bf477b..1f025d4a 100644 --- a/src/components/governance/HeroContent.tsx +++ b/src/components/governance/HeroContent.tsx @@ -1,64 +1,64 @@ -import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare'; -import styles from './HeroContent.module.css'; -import { ResponsiveImage } from '../ResponsiveImage/ResponsiveImage'; +import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare' +import styles from './HeroContent.module.css' +import { ResponsiveImage } from '../ResponsiveImage/ResponsiveImage' export const HeroContent = () => { - return ( - <> -
-
- - -
+ return ( + <> +
+
+ + +
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
- +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ - ); -}; + ) +} diff --git a/src/components/home/PartnersList/PartnersList.tsx b/src/components/home/PartnersList/PartnersList.tsx index a587a212..2082d100 100644 --- a/src/components/home/PartnersList/PartnersList.tsx +++ b/src/components/home/PartnersList/PartnersList.tsx @@ -1,26 +1,26 @@ -import { PartnerEntry } from '~/utils/types'; -import ui from '~/styles/ui.module.css'; -import styles from './PartnersList.module.css'; -import { clsx } from 'clsx'; +import { PartnerEntry } from '~/utils/types' +import ui from '~/styles/ui.module.css' +import styles from './PartnersList.module.css' +import { clsx } from 'clsx' type PartnersListProps = { - partners: PartnerEntry[]; -}; + partners: PartnerEntry[] +} export const PartnersList = ({ partners }: PartnersListProps) => { - return ( -
- {partners.map((item, i) => ( -
-
- -
-
-
{item.name}
-
{item.category}
-
-
- ))} + return ( +
+ {partners.map((item, i) => ( +
+
+ +
+
+
{item.name}
+
{item.category}
+
- ); -}; + ))} +
+ ) +} diff --git a/src/components/home/animations/CrossFadeImage/CrossFadeImage.tsx b/src/components/home/animations/CrossFadeImage/CrossFadeImage.tsx index 3aa3a139..0c898683 100644 --- a/src/components/home/animations/CrossFadeImage/CrossFadeImage.tsx +++ b/src/components/home/animations/CrossFadeImage/CrossFadeImage.tsx @@ -1,83 +1,83 @@ -import { clsx } from 'clsx'; -import { CSSProperties, ReactNode, useEffect, useRef, useState } from 'react'; +import { clsx } from 'clsx' +import { CSSProperties, ReactNode, useEffect, useRef, useState } from 'react' -import styles from './CrossFadeImage.module.css'; +import styles from './CrossFadeImage.module.css' type CrossFadeImageProperties = { - sources: { src: string; alt: string }[]; - duration: number; - className?: string; - children?: (props: { alt: string; index: number }) => ReactNode; -}; + sources: { src: string, alt: string }[] + duration: number + className?: string + children?: (props: { alt: string, index: number }) => ReactNode +} export const CrossFadeImage = ({ - sources, - duration, - className, - children, + sources, + duration, + className, + children, }: CrossFadeImageProperties) => { - const [currentImageIndex, setCurrentImageIndex] = useState(0); - const [nextImageIndex, setNextImageIndex] = useState(1 % sources.length); - const [isTransitioning, setIsTransitioning] = useState(false); - const transitionTimeoutReference = useRef(null); + const [currentImageIndex, setCurrentImageIndex] = useState(0) + const [nextImageIndex, setNextImageIndex] = useState(1 % sources.length) + const [isTransitioning, setIsTransitioning] = useState(false) + const transitionTimeoutReference = useRef(null) - useEffect(() => { - const transition = () => { - setIsTransitioning(true); - transitionTimeoutReference.current = window.setTimeout(() => { - setCurrentImageIndex(nextImageIndex); - setNextImageIndex( - nextIndex => (nextIndex + 1) % sources.length, - ); - setIsTransitioning(false); - }, duration); - }; + useEffect(() => { + const transition = () => { + setIsTransitioning(true) + transitionTimeoutReference.current = window.setTimeout(() => { + setCurrentImageIndex(nextImageIndex) + setNextImageIndex( + nextIndex => (nextIndex + 1) % sources.length, + ) + setIsTransitioning(false) + }, duration) + } - const interval = setInterval(transition, duration); + const interval = setInterval(transition, duration) - return () => { - clearInterval(interval); + return () => { + clearInterval(interval) - if (transitionTimeoutReference.current) { - clearTimeout(transitionTimeoutReference.current); - } - }; - }, [sources, duration, nextImageIndex]); + if (transitionTimeoutReference.current) { + clearTimeout(transitionTimeoutReference.current) + } + } + }, [sources, duration, nextImageIndex]) - const opacity = (index: number) => { - if (currentImageIndex === index) return 1; - else if (nextImageIndex === index && isTransitioning) { - return 1 - duration / 1000 / 2; - } - else return 0; - }; + const opacity = (index: number) => { + if (currentImageIndex === index) return 1 + else if (nextImageIndex === index && isTransitioning) { + return 1 - duration / 1000 / 2 + } + else return 0 + } - const style = (index: number) => - ({ - 'opacity': opacity(index), - '--duration': `${duration}ms`, - } as CSSProperties); + const style = (index: number) => + ({ + 'opacity': opacity(index), + '--duration': `${duration}ms`, + } as CSSProperties) - return ( - <> -
- {sources.map(({ src, alt }, index) => { - return ( - - ); - })} -
- {typeof children === 'function' - ? children({ - alt: sources[currentImageIndex].alt, - index: currentImageIndex, - }) - : undefined} - - ); -}; + return ( + <> +
+ {sources.map(({ src, alt }, index) => { + return ( + + ) + })} +
+ {typeof children === 'function' + ? children({ + alt: sources[currentImageIndex].alt, + index: currentImageIndex, + }) + : undefined} + + ) +} diff --git a/src/components/home/animations/DappsAnimation/DappsAnimation.tsx b/src/components/home/animations/DappsAnimation/DappsAnimation.tsx index 47683b20..452a8363 100644 --- a/src/components/home/animations/DappsAnimation/DappsAnimation.tsx +++ b/src/components/home/animations/DappsAnimation/DappsAnimation.tsx @@ -1,325 +1,325 @@ -'use client'; +'use client' -import { clsx } from 'clsx'; +import { clsx } from 'clsx' import { - ArrowDownIcon, - FarcastCommentIcon, - FarcastLikeIcon, - FarcastRecastIcon, - SwapIcon, -} from '~/components/icons'; -import ui from '~/styles/ui.module.css'; -import { useIntersectionObserver } from '~/utils/useIntersectionObserver'; + ArrowDownIcon, + FarcastCommentIcon, + FarcastLikeIcon, + FarcastRecastIcon, + SwapIcon, +} from '~/components/icons' +import ui from '~/styles/ui.module.css' +import { useIntersectionObserver } from '~/utils/useIntersectionObserver' -import { CrossFadeImage } from '../CrossFadeImage/CrossFadeImage'; -import styles from './DappsAnimation.module.css'; +import { CrossFadeImage } from '../CrossFadeImage/CrossFadeImage' +import styles from './DappsAnimation.module.css' -const sources: { src: string; alt: string }[] = [ - 'domico.eth', - 'luc.eth', - 'nick.eth', -].map(name => ({ alt: name, src: `/assets/home/${name}.png` })); +const sources: { src: string, alt: string }[] = [ + 'domico.eth', + 'luc.eth', + 'nick.eth', +].map(name => ({ alt: name, src: `/assets/home/${name}.png` })) -const FarcasterPost = ({ user, text, handle, likes, reposts, comments }: { user: string; text: string; handle: string; likes: number; reposts: number; comments: number }) => ( -
+const FarcasterPost = ({ user, text, handle, likes, reposts, comments }: { user: string, text: string, handle: string, likes: number, reposts: number, comments: number }) => ( +
+
+ {user} + + @ + {handle} + +
+
+ {text} +
+
+ + + +
+
+) + +export const DappsAnimation = ({ swap, home }: { swap: string, home: string }) => { + const { ref, isIntersecting } = useIntersectionObserver({ + threshold: 1, + }) + + return ( +
+
+
+ + {({ alt }) => ( +
+ {alt} +
+ )} +
+ +
+ + + +
+
+
+
+ Swap +
- {user} - - @ - {handle} - + > + + {({ alt }) =>
{alt}
} +
+
-
- {text} +
+ 3,333.50 +
+
+ USDC + +
+
+ + 1.000 +
+
+ ETH + +
+ +
+
+
+
+ +
+ {home} +
+
+
- - - + + + +
-
-); - -export const DappsAnimation = ({ swap, home }: { swap: string; home: string }) => { - const { ref, isIntersecting } = useIntersectionObserver({ - threshold: 1, - }); - - return ( -
-
-
- - {({ alt }) => ( -
- {alt} -
- )} -
- -
-
- - - -
-
-
-
- Swap -
- - {({ alt }) =>
{alt}
} -
-
-
-
- 3,333.50 -
-
- USDC - -
-
- -
- - 1.000 -
-
- ETH - -
- -
-
-
-
- -
- {home} -
-
-
- - - - -
-
- - - -
-
- - - - - -
-
+
+ + +
- ); -}; +
+ + + + + +
+
+
+ ) +} diff --git a/src/components/home/animations/MessageAnimation/MessageAnimation.tsx b/src/components/home/animations/MessageAnimation/MessageAnimation.tsx index 73434db9..1e135f20 100644 --- a/src/components/home/animations/MessageAnimation/MessageAnimation.tsx +++ b/src/components/home/animations/MessageAnimation/MessageAnimation.tsx @@ -1,39 +1,39 @@ -'use client'; +'use client' -import { clsx } from 'clsx'; +import { clsx } from 'clsx' -import { useIntersectionObserver } from '~/utils/useIntersectionObserver'; +import { useIntersectionObserver } from '~/utils/useIntersectionObserver' -import styles from './MessageAnimation.module.css'; -import ui from '~/styles/ui.module.css'; -import { ReactNode } from 'react'; -import { MessageBubbleIcon } from '~/components/icons'; +import styles from './MessageAnimation.module.css' +import ui from '~/styles/ui.module.css' +import { ReactNode } from 'react' +import { MessageBubbleIcon } from '~/components/icons' -const MessageBox = ({ children, isIntersecting }: { children: ReactNode;isIntersecting: boolean }) => { - return ( -
- {children} - -
- ); -}; +const MessageBox = ({ children, isIntersecting }: { children: ReactNode, isIntersecting: boolean }) => { + return ( +
+ {children} + +
+ ) +} export const MessageAnimation = ({ messages }: { messages: string[] }) => { - const { ref, isIntersecting } = useIntersectionObserver({ - threshold: 0.75, - }); + const { ref, isIntersecting } = useIntersectionObserver({ + threshold: 0.75, + }) - return ( -
- {messages.map(message => ( - - {message} - - ))} -
- ); -}; + return ( +
+ {messages.map(message => ( + + {message} + + ))} +
+ ) +} diff --git a/src/components/home/animations/StatsCounter/StatsCounter.tsx b/src/components/home/animations/StatsCounter/StatsCounter.tsx index e234b683..2105ffb5 100644 --- a/src/components/home/animations/StatsCounter/StatsCounter.tsx +++ b/src/components/home/animations/StatsCounter/StatsCounter.tsx @@ -1,43 +1,43 @@ -'use client'; +'use client' -import { clsx } from 'clsx'; -import CountUp from 'react-countup'; -import ui from '~/styles/ui.module.css'; -import styles from './StatsCounter.module.css'; -import stats from '~/stats/landing.json'; -import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage'; +import { clsx } from 'clsx' +import CountUp from 'react-countup' +import ui from '~/styles/ui.module.css' +import styles from './StatsCounter.module.css' +import stats from '~/stats/landing.json' +import { ResponsiveImage } from '~/components/ResponsiveImage/ResponsiveImage' -export const StatsCounter = ({ captions }: { captions: { names: string; integrations: string; owners: string } }) => { - return ( -
- - {Object.entries(stats).map(([key, count], i) => ( -
- n.toLocaleString()} - /> - {' '} - {captions[key]} -
- ))} +export const StatsCounter = ({ captions }: { captions: { names: string, integrations: string, owners: string } }) => { + return ( +
+ + {Object.entries(stats).map(([key, count], i) => ( +
+ n.toLocaleString()} + /> + {' '} + {captions[key]}
- ); -}; + ))} +
+ ) +} diff --git a/src/components/home/header/HeroContent/HeroContent.tsx b/src/components/home/header/HeroContent/HeroContent.tsx index a02ea8e4..2a061406 100644 --- a/src/components/home/header/HeroContent/HeroContent.tsx +++ b/src/components/home/header/HeroContent/HeroContent.tsx @@ -1,119 +1,119 @@ -import { CSSProperties } from 'react'; -import { ExternalLink } from 'react-external-link'; +import { CSSProperties } from 'react' +import { ExternalLink } from 'react-external-link' -import type { Color } from '~/utils/types'; +import type { Color } from '~/utils/types' -import styles from './HeroContent.module.css'; -import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare'; +import styles from './HeroContent.module.css' +import { AnimatedSquare } from '~/components/AnimatedSquare/AnimatedSquare' const HeroEnsLink = ({ - name, - bgColor, - color, - style, + name, + bgColor, + color, + style, }: { - name: `${string}.eth`; - bgColor: Color; - color: Color; - style?: CSSProperties; + name: `${string}.eth` + bgColor: Color + color: Color + style?: CSSProperties }) => ( - - {name} - -); + + {name} + +) export const HeroContent = () => ( - <> -
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - - -
-
- +
+
+ - +
+
+
+
+ - +
+
+
+
+ - +
+
+
+
+ - +
+
+
+
+ - -); + + +
+
+ + + + + + +) diff --git a/src/components/icons.tsx b/src/components/icons.tsx index 04911e5a..301cbb17 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx @@ -1,209 +1,214 @@ -import { SVGProps } from 'react'; +import { SVGProps } from 'react' -type Props = SVGProps; +type Props = SVGProps export const SearchIcon = (props: Props) => ( - - - - - - - - -); - -export const ArrowDownIcon = (props: Props) => ( - + + + + - -); + + + +) + +export const ArrowDownIcon = (props: Props) => ( + + + +) export const SwapIcon = (props: Props) => ( - - - - - -); + + + + + +) export const ArrowUpRightIcon = (props: Props) => ( - + + + + +) + +export const FarcastLikeIcon = (props: Props) => ( + + + +) + +export const FarcastCommentIcon = (props: Props) => ( + + + +) + +export const FarcastRecastIcon = (props: Props) => ( + + + - -); - -export const FarcastLikeIcon = (props: Props) => ( - + + - -); -export const FarcastCommentIcon = (props: Props) => ( - + d="M11.5653 4.12745L11.5653 4.68664C11.5653 5.76756 10.689 6.64382 9.60813 6.64382L6.25296 6.64382" + stroke="currentColor" + strokeWidth="0.978591" + /> - -); - -export const FarcastRecastIcon = (props: Props) => ( - - - - - - - - - - - - -); + + + +) export const MessageBubbleIcon = (props: Props) => ( - - - + + + -); +) export const EnsNavIcon = (props: Props) => ( - - - - - - - - + + + + + + + + +) -); +export const ArrowRightIcon = (props: Props) => ( + + + +) diff --git a/src/i18n/langPrefix.tsx b/src/i18n/langPrefix.tsx index b4f1cab9..4626a009 100644 --- a/src/i18n/langPrefix.tsx +++ b/src/i18n/langPrefix.tsx @@ -1,14 +1,14 @@ -import { fallbackLng, Language, languages } from './settings'; +import { fallbackLng, Language, languages } from './settings' export const getLangPrefix = (lang: Language) => { - return lang === fallbackLng ? '' : `/${lang}`; -}; + return lang === fallbackLng ? '' : `/${lang}` +} export const decodeLangPrefix = (path: string) => { - if (path == '') return fallbackLng; + if (path == '') return fallbackLng - if (languages.includes(path as Language)) return path as Language; + if (languages.includes(path as Language)) return path as Language - // Fallback - return fallbackLng; -}; + // Fallback + return fallbackLng +} diff --git a/src/i18n/settings.ts b/src/i18n/settings.ts index 8eba7514..77caf84c 100644 --- a/src/i18n/settings.ts +++ b/src/i18n/settings.ts @@ -1,54 +1,54 @@ export const languages = [ - // 'it', - // 'vi', - // 'pt', - // 'nl', - // 'pl', - 'en', - // 'ja', - // 'ru', - // 'es', - // 'ko', - // 'tr', - // 'fr', - // 'cn', - // 'de', -] as const; + // 'it', + // 'vi', + // 'pt', + // 'nl', + // 'pl', + 'en', + // 'ja', + // 'ru', + // 'es', + // 'ko', + // 'tr', + // 'fr', + // 'cn', + // 'de', +] as const export const languageNames: Record = { - en: 'English', - // ru: 'Русский', - // de: 'Deutsch', - // cn: '简体中文', - // ja: '日本語', - // it: 'Italiano', - // tr: 'Türkçe', - // fr: 'Français', - // es: 'Español', - // pl: 'Polski', - // ko: '한국어', - // nl: 'Nederlands', - // vi: '㗂越', - // pt: 'Português', -}; + en: 'English', + // ru: 'Русский', + // de: 'Deutsch', + // cn: '简体中文', + // ja: '日本語', + // it: 'Italiano', + // tr: 'Türkçe', + // fr: 'Français', + // es: 'Español', + // pl: 'Polski', + // ko: '한국어', + // nl: 'Nederlands', + // vi: '㗂越', + // pt: 'Português', +} -export const fallbackLng = 'en'; -export const defaultNS = 'translation'; -export const cookieName = 'i18next'; +export const fallbackLng = 'en' +export const defaultNS = 'translation' +export const cookieName = 'i18next' -export type Language = (typeof languages)[number]; +export type Language = (typeof languages)[number] export function getOptions( - lng = fallbackLng, - ns: string | string[] = defaultNS, + lng = fallbackLng, + ns: string | string[] = defaultNS, ) { - return { - // debug: true, - supportedLngs: languages, - fallbackLng, - lng, - fallbackNS: defaultNS, - defaultNS, - ns, - }; + return { + // debug: true, + supportedLngs: languages, + fallbackLng, + lng, + fallbackNS: defaultNS, + defaultNS, + ns, + } } diff --git a/src/i18n/useCurrentLanguage.ts b/src/i18n/useCurrentLanguage.ts index e0e2d31e..6a2f4a46 100644 --- a/src/i18n/useCurrentLanguage.ts +++ b/src/i18n/useCurrentLanguage.ts @@ -1,8 +1,8 @@ -import { useParams } from 'next/navigation'; -import { Language, fallbackLng } from './settings'; +import { useParams } from 'next/navigation' +import { Language, fallbackLng } from './settings' export const useCurrentLanguage = (lang: Language = fallbackLng): Language => { - const parameters = useParams(); + const parameters = useParams() - return (parameters['lang'] as Language) || lang; -}; + return (parameters['lang'] as Language) || lang +} diff --git a/src/i18n/useTranslation.ts b/src/i18n/useTranslation.ts index a036870d..083a2258 100644 --- a/src/i18n/useTranslation.ts +++ b/src/i18n/useTranslation.ts @@ -1,38 +1,38 @@ -import { createInstance } from 'i18next'; -import resourcesToBackend from 'i18next-resources-to-backend'; -import { initReactI18next } from 'react-i18next/initReactI18next'; +import { createInstance } from 'i18next' +import resourcesToBackend from 'i18next-resources-to-backend' +import { initReactI18next } from 'react-i18next/initReactI18next' -import { getOptions, Language } from './settings'; +import { getOptions, Language } from './settings' const initI18next = async (lng: Language, ns: string | string[]) => { - const i18nInstance = createInstance(); + const i18nInstance = createInstance() - await i18nInstance - .use(initReactI18next) - .use( - resourcesToBackend( - (lng: string, ns: string) => - import(`../../locales/${lng}/${ns}.json`), - ), - ) - .init(getOptions(lng, ns)); + await i18nInstance + .use(initReactI18next) + .use( + resourcesToBackend( + (lng: string, ns: string) => + import(`../../locales/${lng}/${ns}.json`), + ), + ) + .init(getOptions(lng, ns)) - return i18nInstance; -}; + return i18nInstance +} export async function useTranslation( - lng: Language, - ns: string | string[], - options: { keyPrefix?: string } = {}, + lng: Language, + ns: string | string[], + options: { keyPrefix?: string } = {}, ) { - const i18nextInstance = await initI18next(lng, ns); + const i18nextInstance = await initI18next(lng, ns) - return { - t: i18nextInstance.getFixedT( - lng, - Array.isArray(ns) ? ns[0] : ns, - options.keyPrefix, - ), - i18n: i18nextInstance, - }; + return { + t: i18nextInstance.getFixedT( + lng, + Array.isArray(ns) ? ns[0] : ns, + options.keyPrefix, + ), + i18n: i18nextInstance, + } } diff --git a/src/utils/available.ts b/src/utils/available.ts new file mode 100644 index 00000000..f40ad55f --- /dev/null +++ b/src/utils/available.ts @@ -0,0 +1,28 @@ +import { createEnsPublicClient } from '@ensdomains/ensjs' +import { validateName } from '@ensdomains/ensjs/utils' +import { fallback, http } from 'viem' +import { mainnet } from 'viem/chains' + +const publicClient = createEnsPublicClient({ + chain: mainnet, + transport: fallback([ + http('https://mainnet.infura.io/v3/1dc17c91a0b54faeb1547326c3ddca7e'), + http('https://lb.drpc.org/ogrpc?network=ethereum&dkey=AgBISc2US0WgjMYhz9MRMJZsJaE8hzcR76fgOpXEh2H0'), + ]), +}) + +export const checkBoxAvailable = async (name: string): Promise => { + const res = await fetch(`https://dotbox-worker.ens-cf.workers.dev/search?domain=${encodeURI(name)}.box`) + const json = await res.json() + + if (json.data.status === 'INVALID_DOMAIN') { + throw new Error(json.data.status) + } + return json.data.available +} + +export const checkEthAvailable = async (name: string) => { + validateName(`${name}.eth`) + + return await publicClient.getAvailable({ name: `${name}.eth` }) +} diff --git a/src/utils/getStatic.ts b/src/utils/getStatic.ts index 8c641e4a..17f4dd3e 100644 --- a/src/utils/getStatic.ts +++ b/src/utils/getStatic.ts @@ -1,9 +1,9 @@ -import { fallbackLng, languages } from '../i18n/settings'; +import { fallbackLng, languages } from '../i18n/settings' export const generateStaticParams = async () => { - return languages - .filter(language => language != fallbackLng) - .map(language => ({ - lang: language, - })); -}; + return languages + .filter(language => language != fallbackLng) + .map(language => ({ + lang: language, + })) +} diff --git a/src/utils/types.ts b/src/utils/types.ts index 7a23a9ac..dda54853 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -1,43 +1,43 @@ -import type { Language } from '~/i18n/settings'; +import type { Language } from '~/i18n/settings' export type Color = - | 'ens-blue' - | 'ens-light-blue' - | 'ens-medium-blue' - | 'ens-dark-blue' - | 'ens-magenta' - | 'ens-light-magenta' - | 'ens-green' - | 'ens-light-green' - | 'ens-dark-brown' - | 'ens-light-yellow' - | 'ens-yellow' - | 'ens-gray-4' - | 'ens-gray-3' - | 'ens-gray-2' - | 'ens-gray-1' - | 'ens-white' - | 'ens-hover-blue' - | 'ens-hover-light-blue' - | 'page-text' - | 'page-bg'; + | 'ens-blue' + | 'ens-light-blue' + | 'ens-medium-blue' + | 'ens-dark-blue' + | 'ens-magenta' + | 'ens-light-magenta' + | 'ens-green' + | 'ens-light-green' + | 'ens-dark-brown' + | 'ens-light-yellow' + | 'ens-yellow' + | 'ens-gray-4' + | 'ens-gray-3' + | 'ens-gray-2' + | 'ens-gray-1' + | 'ens-white' + | 'ens-hover-blue' + | 'ens-hover-light-blue' + | 'page-text' + | 'page-bg' -export type ButtonVariant = 'primary' | 'secondary'; +export type ButtonVariant = 'primary' | 'secondary' export type PartnerEntry = { - icon: string; - name: string; - category: 'wallet' | 'exchange' | 'dApp' | 'browser' | 'service'; -}; + icon: string + name: string + category: 'wallet' | 'exchange' | 'dApp' | 'browser' | 'service' +} export type PageProps = { - params: { lang: Language }; -}; + params: { lang: Language } +} export type BrandColorObject = { - hex: `#${string}`; - RGB: `${number}, ${number}, ${number}`; - CMYK: `${number}%, ${number}%, ${number}%, ${number}%`; - name: string; - textColor: 'black' | 'white'; -}; + hex: `#${string}` + RGB: `${number}, ${number}, ${number}` + CMYK: `${number}%, ${number}%, ${number}%, ${number}%` + name: string + textColor: 'black' | 'white' +} diff --git a/src/utils/useDebounce.ts b/src/utils/useDebounce.ts new file mode 100644 index 00000000..a2a1fa63 --- /dev/null +++ b/src/utils/useDebounce.ts @@ -0,0 +1,17 @@ +import { useState, useEffect } from 'react' + +export const useDebounce = (value: T, delay = 500) => { + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value) + }, delay) + + return () => { + clearTimeout(handler) + } + }, [value, delay]) + + return debouncedValue +} diff --git a/src/utils/useEventListener.ts b/src/utils/useEventListener.ts index 54bb422a..ccc397f6 100644 --- a/src/utils/useEventListener.ts +++ b/src/utils/useEventListener.ts @@ -1,92 +1,92 @@ -import { useEffect, useLayoutEffect, useRef } from 'react'; +import { useEffect, useLayoutEffect, useRef } from 'react' -import type { RefObject } from 'react'; +import type { RefObject } from 'react' export const useIsomorphicLayoutEffect - = typeof window !== 'undefined' ? useLayoutEffect : useEffect; + = typeof window !== 'undefined' ? useLayoutEffect : useEffect // MediaQueryList Event based useEventListener interface function useEventListener( - eventName: K, - handler: (event: MediaQueryListEventMap[K]) => void, - element: RefObject, - options?: boolean | AddEventListenerOptions, -): void; + eventName: K, + handler: (event: MediaQueryListEventMap[K]) => void, + element: RefObject, + options?: boolean | AddEventListenerOptions, +): void // Window Event based useEventListener interface function useEventListener( - eventName: K, - handler: (event: WindowEventMap[K]) => void, - element?: undefined, - options?: boolean | AddEventListenerOptions, -): void; + eventName: K, + handler: (event: WindowEventMap[K]) => void, + element?: undefined, + options?: boolean | AddEventListenerOptions, +): void // Element Event based useEventListener interface function useEventListener< - K extends keyof HTMLElementEventMap & keyof SVGElementEventMap, - T extends Element = K extends keyof HTMLElementEventMap - ? HTMLDivElement - : SVGElement, + K extends keyof HTMLElementEventMap & keyof SVGElementEventMap, + T extends Element = K extends keyof HTMLElementEventMap + ? HTMLDivElement + : SVGElement, >( - eventName: K, - handler: + eventName: K, + handler: | ((event: HTMLElementEventMap[K]) => void) | ((event: SVGElementEventMap[K]) => void), - element: RefObject, - options?: boolean | AddEventListenerOptions, -): void; + element: RefObject, + options?: boolean | AddEventListenerOptions, +): void // Document Event based useEventListener interface function useEventListener( - eventName: K, - handler: (event: DocumentEventMap[K]) => void, - element: RefObject, - options?: boolean | AddEventListenerOptions, -): void; + eventName: K, + handler: (event: DocumentEventMap[K]) => void, + element: RefObject, + options?: boolean | AddEventListenerOptions, +): void function useEventListener< - KW extends keyof WindowEventMap, - KH extends keyof HTMLElementEventMap & keyof SVGElementEventMap, - KM extends keyof MediaQueryListEventMap, - T extends HTMLElement | SVGAElement | MediaQueryList = HTMLElement, + KW extends keyof WindowEventMap, + KH extends keyof HTMLElementEventMap & keyof SVGElementEventMap, + KM extends keyof MediaQueryListEventMap, + T extends HTMLElement | SVGAElement | MediaQueryList = HTMLElement, >( - eventName: KW | KH | KM, - handler: ( - event: - | WindowEventMap[KW] - | HTMLElementEventMap[KH] - | SVGElementEventMap[KH] - | MediaQueryListEventMap[KM] - | Event, - ) => void, - element?: RefObject, - options?: boolean | AddEventListenerOptions, + eventName: KW | KH | KM, + handler: ( + event: + | WindowEventMap[KW] + | HTMLElementEventMap[KH] + | SVGElementEventMap[KH] + | MediaQueryListEventMap[KM] + | Event, + ) => void, + element?: RefObject, + options?: boolean | AddEventListenerOptions, ) { - // Create a ref that stores handler - const savedHandler = useRef(handler); + // Create a ref that stores handler + const savedHandler = useRef(handler) - useIsomorphicLayoutEffect(() => { - savedHandler.current = handler; - }, [handler]); + useIsomorphicLayoutEffect(() => { + savedHandler.current = handler + }, [handler]) - useEffect(() => { + useEffect(() => { // Define the listening target - const targetElement: T | Window = element?.current ?? window; + const targetElement: T | Window = element?.current ?? window - if (!(targetElement && targetElement.addEventListener)) return; + if (!(targetElement && targetElement.addEventListener)) return - // Create event listener that calls handler function stored in ref - const listener: typeof handler = (event) => { - savedHandler.current(event); - }; + // Create event listener that calls handler function stored in ref + const listener: typeof handler = (event) => { + savedHandler.current(event) + } - targetElement.addEventListener(eventName, listener, options); + targetElement.addEventListener(eventName, listener, options) - // Remove event listener on cleanup - return () => { - targetElement.removeEventListener(eventName, listener, options); - }; - }, [eventName, element, options]); + // Remove event listener on cleanup + return () => { + targetElement.removeEventListener(eventName, listener, options) + } + }, [eventName, element, options]) } -export { useEventListener }; +export { useEventListener } diff --git a/src/utils/useIntersectionObserver.ts b/src/utils/useIntersectionObserver.ts index 1ff682ae..05209b6e 100644 --- a/src/utils/useIntersectionObserver.ts +++ b/src/utils/useIntersectionObserver.ts @@ -1,143 +1,143 @@ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react' type State = { - isIntersecting: boolean; - entry?: IntersectionObserverEntry; -}; + isIntersecting: boolean + entry?: IntersectionObserverEntry +} type UseIntersectionObserverOptions = { - root?: Element | Document | null; - rootMargin?: string; - threshold?: number | number[]; - freezeOnceVisible?: boolean; - onChange?: ( - isIntersecting: boolean, - entry: IntersectionObserverEntry - ) => void; - initialIsIntersecting?: boolean; -}; + root?: Element | Document | null + rootMargin?: string + threshold?: number | number[] + freezeOnceVisible?: boolean + onChange?: ( + isIntersecting: boolean, + entry: IntersectionObserverEntry + ) => void + initialIsIntersecting?: boolean +} type IntersectionReturn = [ - (node?: Element | null) => void, - boolean, + (node?: Element | null) => void, + boolean, IntersectionObserverEntry | undefined, ] & { - ref: (node?: Element | null) => void; - isIntersecting: boolean; - entry?: IntersectionObserverEntry; -}; + ref: (node?: Element | null) => void + isIntersecting: boolean + entry?: IntersectionObserverEntry +} export function useIntersectionObserver({ - threshold = 0, - root, - rootMargin = '0%', - freezeOnceVisible = false, - initialIsIntersecting = false, - onChange, + threshold = 0, + root, + rootMargin = '0%', + freezeOnceVisible = false, + initialIsIntersecting = false, + onChange, }: UseIntersectionObserverOptions = {}): IntersectionReturn { - const [reference, setReference] = useState(); + const [reference, setReference] = useState() - const [state, setState] = useState(() => ({ - isIntersecting: initialIsIntersecting, - entry: undefined, - })); + const [state, setState] = useState(() => ({ + isIntersecting: initialIsIntersecting, + entry: undefined, + })) - const callbackReference - = useRef(); + const callbackReference + = useRef() - callbackReference.current = onChange; + callbackReference.current = onChange - const frozen = state.entry?.isIntersecting && freezeOnceVisible; + const frozen = state.entry?.isIntersecting && freezeOnceVisible - useEffect(() => { - // Ensure we have a ref to observe - if (!reference) return; + useEffect(() => { + // Ensure we have a ref to observe + if (!reference) return - // Ensure the browser supports the Intersection Observer API - if (!('IntersectionObserver' in window)) return; + // Ensure the browser supports the Intersection Observer API + if (!('IntersectionObserver' in window)) return - // Skip if frozen - if (frozen) return; + // Skip if frozen + if (frozen) return - let unobserve: (() => void) | undefined; + let unobserve: (() => void) | undefined - const observer = new IntersectionObserver( - (entries: IntersectionObserverEntry[]): void => { - const thresholds = Array.isArray(observer.thresholds) - ? observer.thresholds - : [observer.thresholds]; + const observer = new IntersectionObserver( + (entries: IntersectionObserverEntry[]): void => { + const thresholds = Array.isArray(observer.thresholds) + ? observer.thresholds + : [observer.thresholds] - for (const entry of entries) { - const isIntersecting + for (const entry of entries) { + const isIntersecting = entry.isIntersecting && thresholds.some( - threshold => entry.intersectionRatio >= threshold, - ); - - setState({ isIntersecting, entry }); - - if (callbackReference.current) { - callbackReference.current(isIntersecting, entry); - } - - if (isIntersecting && freezeOnceVisible && unobserve) { - unobserve(); - unobserve = undefined; - } - } - }, - { threshold, root, rootMargin }, - ); - - observer.observe(reference); - - return () => { - observer.disconnect(); - }; - }, [ - reference, - JSON.stringify(threshold), - root, - rootMargin, - frozen, - freezeOnceVisible, - ]); - - // ensures that if the observed element changes, the intersection observer is reinitialized - const previousReference = useRef(null); - - useEffect(() => { - if ( - !reference - && state.entry?.target - && !freezeOnceVisible - && !frozen - && previousReference.current !== state.entry.target - ) { - previousReference.current = state.entry.target; - setState({ - isIntersecting: initialIsIntersecting, - entry: undefined, - }); + threshold => entry.intersectionRatio >= threshold, + ) + + setState({ isIntersecting, entry }) + + if (callbackReference.current) { + callbackReference.current(isIntersecting, entry) + } + + if (isIntersecting && freezeOnceVisible && unobserve) { + unobserve() + unobserve = undefined + } } - }, [ - reference, - state.entry, - freezeOnceVisible, - frozen, - initialIsIntersecting, - ]); - - const result = [ - setReference, - !!state.isIntersecting, - state.entry, - ] as IntersectionReturn; - - // Support object destructuring, by adding the specific values. - result.ref = result[0]; - result.isIntersecting = result[1]; - result.entry = result[2]; - - return result; + }, + { threshold, root, rootMargin }, + ) + + observer.observe(reference) + + return () => { + observer.disconnect() + } + }, [ + reference, + JSON.stringify(threshold), + root, + rootMargin, + frozen, + freezeOnceVisible, + ]) + + // ensures that if the observed element changes, the intersection observer is reinitialized + const previousReference = useRef(null) + + useEffect(() => { + if ( + !reference + && state.entry?.target + && !freezeOnceVisible + && !frozen + && previousReference.current !== state.entry.target + ) { + previousReference.current = state.entry.target + setState({ + isIntersecting: initialIsIntersecting, + entry: undefined, + }) + } + }, [ + reference, + state.entry, + freezeOnceVisible, + frozen, + initialIsIntersecting, + ]) + + const result = [ + setReference, + !!state.isIntersecting, + state.entry, + ] as IntersectionReturn + + // Support object destructuring, by adding the specific values. + result.ref = result[0] + result.isIntersecting = result[1] + result.entry = result[2] + + return result } diff --git a/src/utils/useMq.ts b/src/utils/useMq.ts index 7baa96bf..2d271811 100644 --- a/src/utils/useMq.ts +++ b/src/utils/useMq.ts @@ -1,59 +1,59 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react' export const queries = { - desktop: '(min-width: 1280px)', - tablet: '(min-width: 768px)', - mobile: '(max-width: 768px)', -} as const; + desktop: '(min-width: 1280px)', + tablet: '(min-width: 768px)', + mobile: '(max-width: 768px)', +} as const -export type Dimension = keyof typeof queries; +export type Dimension = keyof typeof queries export function useMq() { - const [queryMatch, setQueryMatch] = useState('mobile'); - - useEffect(() => { - const mediaQueryLists: Record = { - tablet: undefined, - mobile: undefined, - desktop: undefined, - }; - const keys = Object.keys(queries) as Dimension[]; - - const handleQueryListener = () => { - for (const media of keys) { - if (mediaQueryLists[media]?.matches) { - setQueryMatch(media); - break; - } - } - }; - - for (const media of keys) { - mediaQueryLists[media] = window.matchMedia(queries[media]); + const [queryMatch, setQueryMatch] = useState('mobile') + + useEffect(() => { + const mediaQueryLists: Record = { + tablet: undefined, + mobile: undefined, + desktop: undefined, + } + const keys = Object.keys(queries) as Dimension[] + + const handleQueryListener = () => { + for (const media of keys) { + if (mediaQueryLists[media]?.matches) { + setQueryMatch(media) + break } - - handleQueryListener(); - - for (const media of keys) { - if (typeof queries[media] === 'string') { - mediaQueryLists[media]?.addEventListener( - 'change', - handleQueryListener, - ); - } + } + } + + for (const media of keys) { + mediaQueryLists[media] = window.matchMedia(queries[media]) + } + + handleQueryListener() + + for (const media of keys) { + if (typeof queries[media] === 'string') { + mediaQueryLists[media]?.addEventListener( + 'change', + handleQueryListener, + ) + } + } + + return () => { + for (const media of keys) { + if (typeof queries[media] === 'string') { + mediaQueryLists[media]?.removeEventListener( + 'change', + handleQueryListener, + ) } + } + } + }, [queries]) - return () => { - for (const media of keys) { - if (typeof queries[media] === 'string') { - mediaQueryLists[media]?.removeEventListener( - 'change', - handleQueryListener, - ); - } - } - }; - }, [queries]); - - return queryMatch; + return queryMatch }