From 58b726b1e5cae0fb0e031153cc4b663e9b1619dc Mon Sep 17 00:00:00 2001 From: David Gilman Date: Thu, 12 Feb 2026 13:16:11 -0800 Subject: [PATCH 01/11] fix: resolve zizmor GitHub Actions security findings - Added persist-credentials: false to checkout actions - Added permissions: {} blocks to all workflow files Co-Authored-By: Claude Opus 4.6 --- .github/workflows/check-and-deploy.yml | 6 ++++++ .github/workflows/lint.yaml | 4 ++++ .github/workflows/search.yaml | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/.github/workflows/check-and-deploy.yml b/.github/workflows/check-and-deploy.yml index c28c59e7c6..832f6eea2e 100644 --- a/.github/workflows/check-and-deploy.yml +++ b/.github/workflows/check-and-deploy.yml @@ -5,6 +5,8 @@ env: on: push: +permissions: {} + jobs: check-uniswap-benchmarks: name: Check uniswap Benchmarks @@ -14,6 +16,8 @@ jobs: working-directory: ./ steps: - uses: actions/checkout@v3 + with: + persist-credentials: false - uses: actions/setup-node@v3 with: @@ -69,6 +73,8 @@ jobs: poll-interval: 15 - uses: actions/checkout@v3 + with: + persist-credentials: false - name: Audit preview URL with Lighthouse (mobile) id: lighthouse_audit_mobile uses: treosh/lighthouse-ci-action@v9 diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 6b973f2212..ec32177412 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -2,6 +2,8 @@ name: Lint on: push +permissions: {} + jobs: lint: name: Run linters @@ -10,6 +12,8 @@ jobs: steps: - name: Check out Git repository uses: actions/checkout@v3 + with: + persist-credentials: false - name: Set up node uses: actions/setup-node@v3 diff --git a/.github/workflows/search.yaml b/.github/workflows/search.yaml index fcd8eca7ff..a15eee8e89 100644 --- a/.github/workflows/search.yaml +++ b/.github/workflows/search.yaml @@ -4,11 +4,15 @@ on: schedule: - cron: '0 10 * * *' +permissions: {} + jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Homebrew uses: Homebrew/actions/setup-homebrew@master - name: Run Scraper From b2af26aee63c5402aaa8e10e2854f0e50c8823e5 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:13:45 -0700 Subject: [PATCH 02/11] fix: bump node version to 20 for docusaurus compatibility @docusaurus/core@3.9.2 requires Node.js >=20.0 but CI was using 18.20.4, causing yarn install to fail on all push-triggered workflows. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/check-and-deploy.yml | 2 +- .github/workflows/lint.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-and-deploy.yml b/.github/workflows/check-and-deploy.yml index 832f6eea2e..6cce21e7d1 100644 --- a/.github/workflows/check-and-deploy.yml +++ b/.github/workflows/check-and-deploy.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 18.20.4 + node-version: 20 cache: 'yarn' cache-dependency-path: yarn.lock diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index ec32177412..a641d69ac9 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -18,7 +18,7 @@ jobs: - name: Set up node uses: actions/setup-node@v3 with: - node-version: 18.20.4 + node-version: 20 - name: Install dependencies run: yarn --frozen-lockfile From da918365680d6488229ad8a9c08e8423f87f5d53 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:20:30 -0700 Subject: [PATCH 03/11] fix: resolve eslint errors in NotFound component Remove unused useEffect import and escape unescaped apostrophe in JSX. Co-Authored-By: Claude Opus 4.6 --- src/theme/NotFound/Content/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/theme/NotFound/Content/index.tsx b/src/theme/NotFound/Content/index.tsx index 91aafb0aca..ce4d0cde2f 100644 --- a/src/theme/NotFound/Content/index.tsx +++ b/src/theme/NotFound/Content/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useEffect } from 'react' +import React, { FC } from 'react' import Link from '@docusaurus/Link' const NotFound: FC = () => { @@ -2273,7 +2273,7 @@ const NotFound: FC = () => {

- This page can't be found. If you think this is a mistake, please{" "} + This page can't be found. If you think this is a mistake, please{" "} report it on GitHub. From 1c8ecdb69b466520461e5e6910f9707d50eca444 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:27:34 -0700 Subject: [PATCH 04/11] fix: add skipLibCheck to resolve zod v4 type incompatibility Zod 4.x type declarations use const type parameters requiring TS >= 5.0, but the project uses TS 4.9.5. skipLibCheck skips type checking .d.ts files in node_modules, which is standard Docusaurus practice. Co-Authored-By: Claude Opus 4.6 --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index b878a180aa..2e1c8f1d42 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@docusaurus/tsconfig", "compilerOptions": { "baseUrl": ".", - "moduleResolution": "node" + "moduleResolution": "node", + "skipLibCheck": true }, "exclude": [".docusaurus", "build"] } From fa6abf6be8222e4b684570c110c5b6adea3d1911 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:34:49 -0700 Subject: [PATCH 05/11] fix: upgrade TypeScript from 4.9.5 to 5.9.3 Zod v4 type declarations use const type parameters which require TS >= 5.0. This was causing tsc --noEmit to fail with parser errors on zod .d.cts files. Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7c2188862e..744278bfea 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "postcss-import": "^16.1.0", "prettier": "3.3.3", "tailwindcss": "^3.4.13", - "typescript": "^4.8.4" + "typescript": "^5.0.0" }, "engines": { "npm": "please-use-yarn", diff --git a/yarn.lock b/yarn.lock index 212995c632..738755c825 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11198,10 +11198,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.8.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.0.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== unbox-primitive@^1.1.0: version "1.1.0" From ff41eef65baacf1db460bc54a036139a48acf662 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:42:30 -0700 Subject: [PATCH 06/11] fix: use Docusaurus default tsconfig settings Remove moduleResolution and skipLibCheck overrides to inherit the correct defaults from @docusaurus/tsconfig (bundler resolution, skipLibCheck: true). The "node" moduleResolution override was causing type resolution issues with TS 5.x and Docusaurus components. Co-Authored-By: Claude Opus 4.6 --- tsconfig.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 2e1c8f1d42..73d91486f4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,7 @@ { "extends": "@docusaurus/tsconfig", "compilerOptions": { - "baseUrl": ".", - "moduleResolution": "node", - "skipLibCheck": true + "baseUrl": "." }, "exclude": [".docusaurus", "build"] } From 1d891dc1c62beaa3b10e1e8595b035199a99cf73 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:49:34 -0700 Subject: [PATCH 07/11] fix: resolve type checking errors for TS 5.x compatibility - Add resolutions to pin @types/react to ^18.2.0 (prevents conflicting React 19 types from being installed, which causes 'cannot be used as JSX component' errors) - Unify @types/react lockfile entries to 18.3.26 - Exclude examples/ from type checking (references uninstalled packages) Co-Authored-By: Claude Opus 4.6 --- package.json | 3 +++ tsconfig.json | 2 +- yarn.lock | 9 +-------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 744278bfea..c9571f539f 100644 --- a/package.json +++ b/package.json @@ -92,5 +92,8 @@ "npm": "please-use-yarn", "node": ">=18", "yarn": ">=1.22" + }, + "resolutions": { + "@types/react": "^18.2.0" } } diff --git a/tsconfig.json b/tsconfig.json index 73d91486f4..086bbcd6ab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "baseUrl": "." }, - "exclude": [".docusaurus", "build"] + "exclude": [".docusaurus", "build", "examples"] } diff --git a/yarn.lock b/yarn.lock index 738755c825..98dd32c708 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3176,14 +3176,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": - version "19.2.4" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.4.tgz#e38daaca05cf95459f5f797b1411bcf64c413dd2" - integrity sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A== - dependencies: - csstype "^3.0.2" - -"@types/react@^18.2.0": +"@types/react@*", "@types/react@^18.2.0": version "18.3.26" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.26.tgz#4c5970878d30db3d2a0bca1e4eb5f258e391bbeb" integrity sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA== From 8ff726ba638d21dffefeabf00f5006f1c820126b Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 13:56:14 -0700 Subject: [PATCH 08/11] fix: add type assertion for useDocsPreferredVersion return type The bundler moduleResolution resolves Docusaurus types differently, causing savePreferredVersionName to not exist on the inferred type. Co-Authored-By: Claude Opus 4.6 --- src/theme/DocVersionSuggestions/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/theme/DocVersionSuggestions/index.tsx b/src/theme/DocVersionSuggestions/index.tsx index ed24f2fcf4..fbed346e13 100644 --- a/src/theme/DocVersionSuggestions/index.tsx +++ b/src/theme/DocVersionSuggestions/index.tsx @@ -85,7 +85,7 @@ function DocVersionSuggestions() { const { pluginId } = useActivePlugin({ failfast: true, }) - const { savePreferredVersionName } = useDocsPreferredVersion(pluginId) + const { savePreferredVersionName } = useDocsPreferredVersion(pluginId) as { savePreferredVersionName: (versionName: string) => void } const activeVersion = useActiveVersion(pluginId) const { latestDocSuggestion, latestVersionSuggestion } = useDocVersionSuggestions(pluginId) // No suggestion to be made From 341f2ea9a1acbe0454ebf6907358872db83bf2c0 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 14:02:50 -0700 Subject: [PATCH 09/11] style: format all files with prettier Run prettier --write on all 25 files with formatting issues to pass the CI formatting check. Co-Authored-By: Claude Opus 4.6 --- .eslintrc.json | 2 +- .../technical-reference/_category_.json | 2 +- .../advanced-usage/_category_.json | 8 +- .../smart-wallet/concepts/_category_.json | 8 +- .../uniswapx/fillers/arbitrum/_category_.json | 9 +- .../uniswapx/fillers/mainnet/_category_.json | 9 +- .../uniswapx/fillers/priority/_category_.json | 9 +- .../v3/reference/deployments/_category_.json | 9 +- docusaurus.config.ts | 250 ++++++++---------- src/components/Cards.tsx | 12 +- src/components/CopyToAI.tsx | 45 ++-- src/components/NewsletterForm/index.tsx | 20 +- src/css/custom.css | 1 - src/pages/index.tsx | 17 +- src/theme/DocBreadcrumbs/styles.module.css | 28 +- src/theme/DocVersionSuggestions/index.tsx | 4 +- src/theme/Navbar/Content/index.tsx | 7 +- src/theme/Navbar/Logo/index.tsx | 12 +- .../MobileSidebar/PrimaryMenu/index.tsx | 18 +- .../MobileSidebar/SecondaryMenu/index.tsx | 23 +- .../Navbar/MobileSidebar/Toggle/index.tsx | 18 +- src/theme/Navbar/index.tsx | 8 +- src/theme/NotFound/Content/index.tsx | 18 +- src/theme/NotFound/index.tsx | 14 +- tsconfig.json | 8 +- 25 files changed, 271 insertions(+), 288 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index cf5ce63f0e..255bfcdf6d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -20,7 +20,7 @@ "plugins": ["typescript-sort-keys", "unused-imports"], "rules": { "react/prop-types": "off", - "prefer-rest-params": "off", + "prefer-rest-params": "off", "typescript-sort-keys/string-enum": [ "error", "asc", diff --git a/docs/contracts/protocol-fee/technical-reference/_category_.json b/docs/contracts/protocol-fee/technical-reference/_category_.json index 85146f6a97..1cd1bd5e62 100644 --- a/docs/contracts/protocol-fee/technical-reference/_category_.json +++ b/docs/contracts/protocol-fee/technical-reference/_category_.json @@ -2,4 +2,4 @@ "label": "Technical Reference", "position": 9, "collapsed": true -} \ No newline at end of file +} diff --git a/docs/contracts/smart-wallet/advanced-usage/_category_.json b/docs/contracts/smart-wallet/advanced-usage/_category_.json index ef845c8fa0..39d6f48bcd 100644 --- a/docs/contracts/smart-wallet/advanced-usage/_category_.json +++ b/docs/contracts/smart-wallet/advanced-usage/_category_.json @@ -1,5 +1,5 @@ { - "label": "Advanced Usage", - "position": 4, - "collapsed": true - } \ No newline at end of file + "label": "Advanced Usage", + "position": 4, + "collapsed": true +} diff --git a/docs/contracts/smart-wallet/concepts/_category_.json b/docs/contracts/smart-wallet/concepts/_category_.json index 6662c1af16..6e81e196df 100644 --- a/docs/contracts/smart-wallet/concepts/_category_.json +++ b/docs/contracts/smart-wallet/concepts/_category_.json @@ -1,5 +1,5 @@ { - "label": "Concepts", - "position": 3, - "collapsed": true - } \ No newline at end of file + "label": "Concepts", + "position": 3, + "collapsed": true +} diff --git a/docs/contracts/uniswapx/fillers/arbitrum/_category_.json b/docs/contracts/uniswapx/fillers/arbitrum/_category_.json index 9c41550098..ad8c268fa1 100644 --- a/docs/contracts/uniswapx/fillers/arbitrum/_category_.json +++ b/docs/contracts/uniswapx/fillers/arbitrum/_category_.json @@ -1,6 +1,5 @@ { - "label": "Arbitrum", - "position": 3, - "collapsed": true - } - \ No newline at end of file + "label": "Arbitrum", + "position": 3, + "collapsed": true +} diff --git a/docs/contracts/uniswapx/fillers/mainnet/_category_.json b/docs/contracts/uniswapx/fillers/mainnet/_category_.json index e917e34968..01b7939342 100644 --- a/docs/contracts/uniswapx/fillers/mainnet/_category_.json +++ b/docs/contracts/uniswapx/fillers/mainnet/_category_.json @@ -1,6 +1,5 @@ { - "label": "Mainnet", - "position": 2, - "collapsed": true - } - \ No newline at end of file + "label": "Mainnet", + "position": 2, + "collapsed": true +} diff --git a/docs/contracts/uniswapx/fillers/priority/_category_.json b/docs/contracts/uniswapx/fillers/priority/_category_.json index 3124c5649f..3f9be4f83c 100644 --- a/docs/contracts/uniswapx/fillers/priority/_category_.json +++ b/docs/contracts/uniswapx/fillers/priority/_category_.json @@ -1,6 +1,5 @@ { - "label": "Unichain, Base", - "position": 4, - "collapsed": true - } - \ No newline at end of file + "label": "Unichain, Base", + "position": 4, + "collapsed": true +} diff --git a/docs/contracts/v3/reference/deployments/_category_.json b/docs/contracts/v3/reference/deployments/_category_.json index db425d21ff..cadf4e2676 100644 --- a/docs/contracts/v3/reference/deployments/_category_.json +++ b/docs/contracts/v3/reference/deployments/_category_.json @@ -1,6 +1,5 @@ { - "label": "Deployments", - "position": 5, - "collapsed": true - } - \ No newline at end of file + "label": "Deployments", + "position": 5, + "collapsed": true +} diff --git a/docusaurus.config.ts b/docusaurus.config.ts index c7edfcf9e0..d8be693c51 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -87,25 +87,25 @@ const config: Config = { label: 'LLMs', }, { - label: "Give Feedback", + label: 'Give Feedback', to: 'https://share.hsforms.com/14XvN41xQTyC8KPamgaM8Jwsdca9', target: '_blank', rel: 'noreferrer', }, { - label: "Uniswap Foundation", + label: 'Uniswap Foundation', to: 'https://www.uniswapfoundation.org/', target: '_blank', rel: 'noreferrer', }, { - label: "Whitepaper", + label: 'Whitepaper', to: 'https://app.uniswap.org/whitepaper-v4.pdf', target: '_blank', rel: 'noreferrer', }, { - label: "GitHub", + label: 'GitHub', to: 'https://github.com/Uniswap/docs/', target: '_blank', rel: 'noreferrer', @@ -186,10 +186,10 @@ const config: Config = { { to: '/contracts/v4/guides/hooks/your-first-hook', from: [ - '/contracts/v4/first-hook/building-your-own-hook', - '/tutorials/', - '/contracts/v4/guides/hooks/setup' - ] + '/contracts/v4/first-hook/building-your-own-hook', + '/tutorials/', + '/contracts/v4/guides/hooks/setup', + ], }, { to: '/contracts/v2/guides/smart-contract-integration/using-flash-swaps', @@ -198,10 +198,10 @@ const config: Config = { { to: '/contracts/v4/guides/hooks/hook-deployment', from: [ - '/contracts/v4/concepts/hook-deployment', - '/contracts/v4/first-hook/hook-deployment', - '/contracts/v4/first-hook/testing-hooks' - ] + '/contracts/v4/concepts/hook-deployment', + '/contracts/v4/first-hook/hook-deployment', + '/contracts/v4/first-hook/testing-hooks', + ], }, { to: '/contracts/v3/guides/flash-integrations/flash-callback', @@ -209,17 +209,11 @@ const config: Config = { }, { to: '/contracts/v2/concepts/advanced-topics/fees', - from: [ - '/v2/advanced-topics/understanding-fees/', - '/v2/advanced-topics/fees' - ] + from: ['/v2/advanced-topics/understanding-fees/', '/v2/advanced-topics/fees'], }, { to: '/sdk/v1/overview', - from: [ - '/sdk/1.0.0/reference/format', - '/sdk/1.0.0/' - ] + from: ['/sdk/1.0.0/reference/format', '/sdk/1.0.0/'], }, { to: '/contracts/v4/quickstart/hooks/async-swap', @@ -228,38 +222,38 @@ const config: Config = { { to: '/concepts/glossary', from: [ - //'/contracts/V2/concepts/protocol-overview/glossary', - '/protocol/V2/concepts/protocol-overview/glossary', - '/v2/glossary' - ] + //'/contracts/V2/concepts/protocol-overview/glossary', + '/protocol/V2/concepts/protocol-overview/glossary', + '/v2/glossary', + ], }, { to: '/contracts/v4/overview', from: [ - '/contracts/v4/concepts/v4-architecture-overview', - '/contracts/v4/concepts/v4-', - '/contracts/v4/concepts/overview', - '/contracts/v4/concepts/intro-to-v4', - '/concepts/overview4', - '/contracts/v4/concepts/in-tro-to-v4', - '/protocol/reference/core', - '/protocol', - '/v4', - '/contracts/', - '/reference/smart-contracts' - ] + '/contracts/v4/concepts/v4-architecture-overview', + '/contracts/v4/concepts/v4-', + '/contracts/v4/concepts/overview', + '/contracts/v4/concepts/intro-to-v4', + '/concepts/overview4', + '/contracts/v4/concepts/in-tro-to-v4', + '/protocol/reference/core', + '/protocol', + '/v4', + '/contracts/', + '/reference/smart-contracts', + ], }, { to: '/contracts/v2/overview', from: [ - '/protocol/V2', - '/protocol/V2/concepts/protocol-', - '/v2/', - '/contracts/v2', - '/contracts/v2/overview.md', - '/contracts/v2/concepts/protocol-overview/how-', - '/protocol/v2/introduction' - ] + '/protocol/V2', + '/protocol/V2/concepts/protocol-', + '/v2/', + '/contracts/v2', + '/contracts/v2/overview.md', + '/contracts/v2/concepts/protocol-overview/how-', + '/protocol/v2/introduction', + ], }, { to: '/contracts/v4/guides/custom-accounting', @@ -304,11 +298,11 @@ const config: Config = { { to: '/concepts/protocol/concentrated-liquidity', from: [ - '/concepts/introduction/liquidity-user-guide', - '/concepts/V3-overview/oracle', - '/concepts/V3-overview/concentrated-liquidity', - '/protocol/concepts/V3-overview/concentrated-liquidity' - ] + '/concepts/introduction/liquidity-user-guide', + '/concepts/V3-overview/oracle', + '/concepts/V3-overview/concentrated-liquidity', + '/protocol/concepts/V3-overview/concentrated-liquidity', + ], }, { to: '/concepts/protocol/fees', @@ -336,10 +330,7 @@ const config: Config = { }, { to: '/sdk/v4/overview', - from: [ - '/sdk', - '/sdk/guides' - ] + from: ['/sdk', '/sdk/guides'], }, { to: '/sdk/v1/reference/computation', @@ -360,12 +351,12 @@ const config: Config = { { to: '/concepts/uniswap-protocol', from: [ - '/protocol/V2/concepts/protocol-overview/how-uniswap-works', - '/protocol/V2/concepts/core-', - '/contracts/v2/concepts/protocol-overview/how-uniswap-work', - '/V2/concepts/protocol-overview/01-how-uniswap-works', - '/protocol/V2/concepts/protocol' - ] + '/protocol/V2/concepts/protocol-overview/how-uniswap-works', + '/protocol/V2/concepts/core-', + '/contracts/v2/concepts/protocol-overview/how-uniswap-work', + '/V2/concepts/protocol-overview/01-how-uniswap-works', + '/protocol/V2/concepts/protocol', + ], }, { to: '/contracts/v2/concepts/protocol-overview/smart-contracts', @@ -382,12 +373,12 @@ const config: Config = { { to: '/concepts/governance/overview', from: [ - '/contracts/v3/reference/governance/overview.md', - '/protocol/V2/concepts/governance/governance-reference', - '/protocol/concepts/governance', - '/protocol/reference/Governance/governance-reference', - '/contracts/v2/reference/Governance/governance-' - ] + '/contracts/v3/reference/governance/overview.md', + '/protocol/V2/concepts/governance/governance-reference', + '/protocol/concepts/governance', + '/protocol/reference/Governance/governance-reference', + '/contracts/v2/reference/Governance/governance-', + ], }, { to: '/sdk/v3/guides/liquidity/minting', @@ -399,11 +390,7 @@ const config: Config = { }, { to: '/sdk/v2/overview', - from: [ - '/sdk/2.0.0/introduction', - '/sdk/2.0.0/reference/getting-started', - '/v2/SDK/getting-started' - ] + from: ['/sdk/2.0.0/introduction', '/sdk/2.0.0/reference/getting-started', '/v2/SDK/getting-started'], }, { to: '/concepts/overview', @@ -595,10 +582,7 @@ const config: Config = { }, { to: '/', - from: [ - '/developers/', - '/conce' - ] + from: ['/developers/', '/conce'], }, { to: '/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolActions', @@ -799,66 +783,66 @@ const config: Config = { }, }, ], - ['docusaurus-plugin-llms', - { - // Options here - generateLLMsTxt: true, - generateLLMsFullTxt: true, - docsDir: 'docs', - ignoreFiles: [ - 'examples/*', - 'plugins/*', - 'scripts/*', - 'src/*', - 'static/*', - 'submodules/*', - 'CONTRIBUTING.md', - '02-overview.mdx', - 'docs/api/subgraph/guides/v3-subgraph-example.md', - 'docs/archived', - 'docs/concepts', - 'docs/contracts/permit2', - 'docs/contracts/smart-wallet', - 'docs/contracts/uniswapx', - 'docs/contracts/universal-router', - 'docs/contracts/v1', - 'docs/contracts/v2', - 'docs/contracts/v3', - 'docs/sdk/core', - 'docs/sdk/swap-widget', - 'docs/sdk/v1', - 'docs/sdk/v2', - 'docs/sdk/v3', - 'docs/sdk/web3-react', - 'docs/universal-router-legacy', - ], - title: 'LLMs.txt for Uniswap v4 Documentation', - description: 'Complete reference documentation for Uniswap v4', - llmsTxtFilename: 'v4-llms.txt', - llmsFullTxtFilename: 'v4-llms-full.txt', - includeBlog: false, - // Content cleaning options - excludeImports: true, - removeDuplicateHeadings: true, - // Control documentation order - includeOrder: [ - // 'docs/contracts/v4/*', - // 'docs/sdk/v4/*', - // 'docs/api/*', - ], - includeUnmatchedLast: true, - // Path transformation options - pathTransformation: { - // Paths to ignore when constructing URLs (will be removed if found) - ignorePaths: ['docs'], - // Paths to add when constructing URLs (will be prepended if not already present) - addPaths: [], + [ + 'docusaurus-plugin-llms', + { + // Options here + generateLLMsTxt: true, + generateLLMsFullTxt: true, + docsDir: 'docs', + ignoreFiles: [ + 'examples/*', + 'plugins/*', + 'scripts/*', + 'src/*', + 'static/*', + 'submodules/*', + 'CONTRIBUTING.md', + '02-overview.mdx', + 'docs/api/subgraph/guides/v3-subgraph-example.md', + 'docs/archived', + 'docs/concepts', + 'docs/contracts/permit2', + 'docs/contracts/smart-wallet', + 'docs/contracts/uniswapx', + 'docs/contracts/universal-router', + 'docs/contracts/v1', + 'docs/contracts/v2', + 'docs/contracts/v3', + 'docs/sdk/core', + 'docs/sdk/swap-widget', + 'docs/sdk/v1', + 'docs/sdk/v2', + 'docs/sdk/v3', + 'docs/sdk/web3-react', + 'docs/universal-router-legacy', + ], + title: 'LLMs.txt for Uniswap v4 Documentation', + description: 'Complete reference documentation for Uniswap v4', + llmsTxtFilename: 'v4-llms.txt', + llmsFullTxtFilename: 'v4-llms-full.txt', + includeBlog: false, + // Content cleaning options + excludeImports: true, + removeDuplicateHeadings: true, + // Control documentation order + includeOrder: [ + // 'docs/contracts/v4/*', + // 'docs/sdk/v4/*', + // 'docs/api/*', + ], + includeUnmatchedLast: true, + // Path transformation options + pathTransformation: { + // Paths to ignore when constructing URLs (will be removed if found) + ignorePaths: ['docs'], + // Paths to add when constructing URLs (will be prepended if not already present) + addPaths: [], + }, + // Custom LLM files for specific documentation sections + customLLMFiles: [], }, - // Custom LLM files for specific documentation sections - customLLMFiles: [ - ], - } - ] + ], ], } export default config diff --git a/src/components/Cards.tsx b/src/components/Cards.tsx index 8f80ceeb32..9ee26f3b8d 100644 --- a/src/components/Cards.tsx +++ b/src/components/Cards.tsx @@ -2,11 +2,7 @@ import React from 'react' import clsx from 'clsx' export function Cards({ children }) { - return ( -

- {children} -
- ) + return
{children}
} export function Card({ title, href, highlight }) { @@ -18,10 +14,8 @@ export function Card({ title, href, highlight }) { 'hover:-translate-y-[2px] hover:shadow-light-medium', 'dark:shadow-dark-short hover:dark:shadow-dark-medium', highlight - ? - 'bg-light-pink-fade text-light-accent-1 border-light-accent-1 hover:bg-light-accent-2-hovered hover:border-light-accent-1-hovered dark:bg-dark-pink-fade dark:text-dark-pink-vibrant dark:border-dark-pink-vibrant dark:hover:bg-dark-pink-fade-80' - : - 'bg-light-surface-1 border-light-surface-3 text-light-neutral-1 hover:border-light-accent-1 hover:text-light-accent-1 dark:bg-dark-surface-1 dark:border-dark-surface-3 dark:text-dark-neutral-1 dark:hover:border-dark-accent-1 dark:hover:text-dark-accent-1' + ? 'bg-light-pink-fade text-light-accent-1 border-light-accent-1 hover:bg-light-accent-2-hovered hover:border-light-accent-1-hovered dark:bg-dark-pink-fade dark:text-dark-pink-vibrant dark:border-dark-pink-vibrant dark:hover:bg-dark-pink-fade-80' + : 'bg-light-surface-1 border-light-surface-3 text-light-neutral-1 hover:border-light-accent-1 hover:text-light-accent-1 dark:bg-dark-surface-1 dark:border-dark-surface-3 dark:text-dark-neutral-1 dark:hover:border-dark-accent-1 dark:hover:text-dark-accent-1', )} > {title} diff --git a/src/components/CopyToAI.tsx b/src/components/CopyToAI.tsx index 41a9400b46..283a1547af 100644 --- a/src/components/CopyToAI.tsx +++ b/src/components/CopyToAI.tsx @@ -13,14 +13,13 @@ const CopyToAI: React.FC = ({ className = '' }) => { const getCurrentPageContent = (): string => { // Get the main content area const contentElement = document.querySelector('.markdown') || document.querySelector('main') - if (!contentElement) { return 'Content not available' } + if (!contentElement) { + return 'Content not available' + } // Extract text content and clean it up const textContent = contentElement.textContent || '' - const cleanedContent = textContent - .replace(/\s+/g, ' ') - .replace(/\n+/g, '\n') - .trim() + const cleanedContent = textContent.replace(/\s+/g, ' ').replace(/\n+/g, '\n').trim() const pageUrl = `https://docs.uniswap.org${location.pathname}` const pageTitle = document.title || 'Uniswap Documentation' @@ -46,8 +45,10 @@ ${cleanedContent}` const handleChatGPT = () => { const content = getCurrentPageContent() const encodedContent = encodeURIComponent(content) - const prompt = encodeURIComponent('Please help me understand this Uniswap documentation and answer any questions I have about it.') - + const prompt = encodeURIComponent( + 'Please help me understand this Uniswap documentation and answer any questions I have about it.', + ) + // ChatGPT URL with content const chatGPTUrl = `https://chatgpt.com/?q=${prompt}%0A%0A${encodedContent}` window.open(chatGPTUrl, '_blank') @@ -58,7 +59,7 @@ ${cleanedContent}` try { const content = getCurrentPageContent() await navigator.clipboard.writeText(content) - + // Open Claude and show user instructions window.open('https://claude.ai/chat', '_blank') alert('Content copied to clipboard! Paste it into Claude to get help with this documentation.') @@ -82,7 +83,12 @@ ${cleanedContent}` Ask AI - + @@ -95,7 +101,7 @@ ${cleanedContent}` className="flex items-center w-full px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" > - + Ask ChatGPT @@ -104,7 +110,7 @@ ${cleanedContent}` className="flex items-center w-full px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" > - + Ask Claude @@ -114,7 +120,12 @@ ${cleanedContent}` className="flex items-center w-full px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" > - + {copied ? 'Copied!' : 'Copy content'} @@ -123,15 +134,9 @@ ${cleanedContent}` )} {/* Click outside to close */} - {isOpen && ( -
setIsOpen(false)} - aria-hidden="true" - /> - )} + {isOpen &&
setIsOpen(false)} aria-hidden="true" />}
) } -export default CopyToAI \ No newline at end of file +export default CopyToAI diff --git a/src/components/NewsletterForm/index.tsx b/src/components/NewsletterForm/index.tsx index 32bdd5660a..457976ccb2 100644 --- a/src/components/NewsletterForm/index.tsx +++ b/src/components/NewsletterForm/index.tsx @@ -10,25 +10,23 @@ interface NewsletterFormProps { inputClass?: string } -const NewsletterForm: React.FC = ({ - headerText, - headerTextClass, -}) => { - +const NewsletterForm: React.FC = ({ headerText, headerTextClass }) => { return ( <>

{headerText}

-
-
- - +
+
+ Sign up
-
- +
) } diff --git a/src/css/custom.css b/src/css/custom.css index 5585d111b3..63b8c12860 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -73,7 +73,6 @@ html:has(.theme-doc-markdown) { @apply font-medium; } - .menu__link--sublist-caret:after { background: var(--ifm-menu-link-sublist-icon) 50% / 1.2rem 1.2rem; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 6d650f7399..5aa566c690 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -300,7 +300,11 @@ const Home = () => { />
- + Learn more @@ -333,10 +337,13 @@ const IconButton: FC<{ {color === 'orange-vibrant' && } {color === 'brown-vibrant' && } {label} diff --git a/src/theme/DocBreadcrumbs/styles.module.css b/src/theme/DocBreadcrumbs/styles.module.css index 5a6ae7127f..48e780a033 100644 --- a/src/theme/DocBreadcrumbs/styles.module.css +++ b/src/theme/DocBreadcrumbs/styles.module.css @@ -1,15 +1,15 @@ .breadcrumbsContainer { - margin-bottom: 0.8rem; - } - - .breadcrumbsItemLink { - text-decoration: none; - font-size: 0.9rem; /* Texto más pequeño */ - color: var(--ifm-color-primary); /* Color del tema */ - opacity: 0.8; /* Un poco más sutil */ - } - - .breadcrumbsItemLink:hover { - opacity: 1; - text-decoration: none; - } \ No newline at end of file + margin-bottom: 0.8rem; +} + +.breadcrumbsItemLink { + text-decoration: none; + font-size: 0.9rem; /* Texto más pequeño */ + color: var(--ifm-color-primary); /* Color del tema */ + opacity: 0.8; /* Un poco más sutil */ +} + +.breadcrumbsItemLink:hover { + opacity: 1; + text-decoration: none; +} diff --git a/src/theme/DocVersionSuggestions/index.tsx b/src/theme/DocVersionSuggestions/index.tsx index fbed346e13..148824eb89 100644 --- a/src/theme/DocVersionSuggestions/index.tsx +++ b/src/theme/DocVersionSuggestions/index.tsx @@ -85,7 +85,9 @@ function DocVersionSuggestions() { const { pluginId } = useActivePlugin({ failfast: true, }) - const { savePreferredVersionName } = useDocsPreferredVersion(pluginId) as { savePreferredVersionName: (versionName: string) => void } + const { savePreferredVersionName } = useDocsPreferredVersion(pluginId) as { + savePreferredVersionName: (versionName: string) => void + } const activeVersion = useActiveVersion(pluginId) const { latestDocSuggestion, latestVersionSuggestion } = useDocVersionSuggestions(pluginId) // No suggestion to be made diff --git a/src/theme/Navbar/Content/index.tsx b/src/theme/Navbar/Content/index.tsx index 20836bf3ae..522842bdf1 100644 --- a/src/theme/Navbar/Content/index.tsx +++ b/src/theme/Navbar/Content/index.tsx @@ -53,7 +53,12 @@ export default function NavbarContent(): ReactNode { )} > {/* Logo - Left aligned */} - +

Uniswap Docs

diff --git a/src/theme/Navbar/Logo/index.tsx b/src/theme/Navbar/Logo/index.tsx index 72d320a0a8..9cf9c0cdda 100644 --- a/src/theme/Navbar/Logo/index.tsx +++ b/src/theme/Navbar/Logo/index.tsx @@ -1,12 +1,6 @@ -import React, {type ReactNode} from 'react'; -import Logo from '@theme/Logo'; +import React, { type ReactNode } from 'react' +import Logo from '@theme/Logo' export default function NavbarLogo(): ReactNode { - return ( - - ); + return } diff --git a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx index a725a814da..981cec91a1 100644 --- a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx +++ b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.tsx @@ -1,10 +1,10 @@ -import React, {type ReactNode} from 'react'; -import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal'; -import Link from '@docusaurus/Link'; +import React, { type ReactNode } from 'react' +import { useNavbarMobileSidebar } from '@docusaurus/theme-common/internal' +import Link from '@docusaurus/Link' // The primary menu displays the navbar items export default function NavbarMobilePrimaryMenu(): ReactNode { - const mobileSidebar = useNavbarMobileSidebar(); + const mobileSidebar = useNavbarMobileSidebar() const navLinks = [ { label: 'Concepts', to: '/concepts/overview' }, @@ -13,21 +13,17 @@ export default function NavbarMobilePrimaryMenu(): ReactNode { { label: 'APIs', to: '/api/subgraph/overview' }, { label: 'Support', to: '/builder-support/get-funded' }, { label: 'LLMs', to: '/llms/overview' }, - ]; + ] return (
    {navLinks.map((link, i) => (
  • - mobileSidebar.toggle()} - > + mobileSidebar.toggle()}> {link.label}
  • ))}
- ); + ) } diff --git a/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx b/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx index eb4f1e9ffa..02c0219a29 100644 --- a/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx +++ b/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.tsx @@ -1,32 +1,31 @@ -import React, {type ComponentProps, type ReactNode} from 'react'; -import {useThemeConfig} from '@docusaurus/theme-common'; -import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal'; -import Translate from '@docusaurus/Translate'; +import React, { type ComponentProps, type ReactNode } from 'react' +import { useThemeConfig } from '@docusaurus/theme-common' +import { useNavbarSecondaryMenu } from '@docusaurus/theme-common/internal' +import Translate from '@docusaurus/Translate' function SecondaryMenuBackButton(props: ComponentProps<'button'>) { return ( - ); + ) } // The secondary menu slides from the right and shows contextual information // such as the docs sidebar export default function NavbarMobileSidebarSecondaryMenu(): ReactNode { - const isPrimaryMenuEmpty = useThemeConfig().navbar.items.length === 0; - const secondaryMenu = useNavbarSecondaryMenu(); + const isPrimaryMenuEmpty = useThemeConfig().navbar.items.length === 0 + const secondaryMenu = useNavbarSecondaryMenu() return ( <> {/* edge-case: prevent returning to the primaryMenu when it's empty */} - {!isPrimaryMenuEmpty && ( - secondaryMenu.hide()} /> - )} + {!isPrimaryMenuEmpty && secondaryMenu.hide()} />} {secondaryMenu.content} - ); + ) } diff --git a/src/theme/Navbar/MobileSidebar/Toggle/index.tsx b/src/theme/Navbar/MobileSidebar/Toggle/index.tsx index d8f9a530d1..30f9c7e320 100644 --- a/src/theme/Navbar/MobileSidebar/Toggle/index.tsx +++ b/src/theme/Navbar/MobileSidebar/Toggle/index.tsx @@ -1,23 +1,23 @@ -import React, {type ReactNode} from 'react'; -import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal'; -import {translate} from '@docusaurus/Translate'; -import IconMenu from '@theme/Icon/Menu'; +import React, { type ReactNode } from 'react' +import { useNavbarMobileSidebar } from '@docusaurus/theme-common/internal' +import { translate } from '@docusaurus/Translate' +import IconMenu from '@theme/Icon/Menu' export default function MobileSidebarToggle(): ReactNode { - const {toggle, shown} = useNavbarMobileSidebar(); + const { toggle, shown } = useNavbarMobileSidebar() return ( - ); + ) } diff --git a/src/theme/Navbar/index.tsx b/src/theme/Navbar/index.tsx index 48ce38adb1..8a63c6c511 100644 --- a/src/theme/Navbar/index.tsx +++ b/src/theme/Navbar/index.tsx @@ -1,11 +1,11 @@ -import React, {type ReactNode} from 'react'; -import NavbarLayout from '@theme/Navbar/Layout'; -import NavbarContent from '@theme/Navbar/Content'; +import React, { type ReactNode } from 'react' +import NavbarLayout from '@theme/Navbar/Layout' +import NavbarContent from '@theme/Navbar/Content' export default function Navbar(): ReactNode { return ( - ); + ) } diff --git a/src/theme/NotFound/Content/index.tsx b/src/theme/NotFound/Content/index.tsx index ce4d0cde2f..d376d053b2 100644 --- a/src/theme/NotFound/Content/index.tsx +++ b/src/theme/NotFound/Content/index.tsx @@ -2,7 +2,6 @@ import React, { FC } from 'react' import Link from '@docusaurus/Link' const NotFound: FC = () => { - return (

Error - 404

@@ -2272,12 +2271,17 @@ const NotFound: FC = () => {
-

- This page can't be found. If you think this is a mistake, please{" "} - - report it on GitHub. - -

+

+ This page can't be found. If you think this is a mistake, please{' '} + + report it on GitHub. + +

Back to Home diff --git a/src/theme/NotFound/index.tsx b/src/theme/NotFound/index.tsx index 9f7aff06e2..c837d5ad19 100644 --- a/src/theme/NotFound/index.tsx +++ b/src/theme/NotFound/index.tsx @@ -1,14 +1,14 @@ -import React, {type ReactNode} from 'react'; -import {translate} from '@docusaurus/Translate'; -import {PageMetadata} from '@docusaurus/theme-common'; -import Layout from '@theme/Layout'; -import NotFoundContent from '@theme/NotFound/Content'; +import React, { type ReactNode } from 'react' +import { translate } from '@docusaurus/Translate' +import { PageMetadata } from '@docusaurus/theme-common' +import Layout from '@theme/Layout' +import NotFoundContent from '@theme/NotFound/Content' export default function Index(): ReactNode { const title = translate({ id: 'theme.NotFound.title', message: 'Page Not Found', - }); + }) return ( <> @@ -16,5 +16,5 @@ export default function Index(): ReactNode { - ); + ) } diff --git a/tsconfig.json b/tsconfig.json index 086bbcd6ab..45f233b2ad 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "@docusaurus/tsconfig", - "compilerOptions": { - "baseUrl": "." - }, + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, "exclude": [".docusaurus", "build", "examples"] } From 4247c8ad59270aac7edc6d8bd53a722c9a062340 Mon Sep 17 00:00:00 2001 From: David Gilman Date: Tue, 10 Mar 2026 14:17:54 -0700 Subject: [PATCH 10/11] fix: escape apostrophes and format new files from main Fix eslint no-unescaped-entities errors in FeedbackForm.tsx and run prettier on new files merged from main. Co-Authored-By: Claude Opus 4.6 --- api/feedback.ts | 13 +++-- src/components/FeedbackForm.tsx | 97 ++++++++++++++++----------------- src/pages/feedback.tsx | 14 ++--- src/theme/Footer.tsx | 2 +- 4 files changed, 63 insertions(+), 63 deletions(-) diff --git a/api/feedback.ts b/api/feedback.ts index f2a922f4f2..8decac6ebd 100644 --- a/api/feedback.ts +++ b/api/feedback.ts @@ -25,7 +25,6 @@ export default async function handler(req: any, res: any) { return res.status(405).json({ success: false, error: 'Method not allowed' }) } - try { const body = typeof req.body === 'string' ? JSON.parse(req.body) : req.body || {} @@ -40,7 +39,6 @@ export default async function handler(req: any, res: any) { const pageUrl = sanitizeText(body.pageUrl, MAX_PAGE_URL_LENGTH) const followUp = body.followUp - if (!email || !isValidEmail(email)) { return res.status(400).json({ success: false, error: 'Invalid email' }) } @@ -62,7 +60,14 @@ export default async function handler(req: any, res: any) { { name: 'type_of_feedback', value: feedbackType }, { name: 'whats_the_issue_idea_or_question', value: issue }, { name: 'can_we_follow_up_with_you_about_your_feedback', value: followUp ? 'Yes' : 'No' }, - ...(challenges ? [{ name: 'what_has_been_the_most_challenging_part_of_building_on_or_integrating_with_uniswap', value: challenges }] : []), + ...(challenges + ? [ + { + name: 'what_has_been_the_most_challenging_part_of_building_on_or_integrating_with_uniswap', + value: challenges, + }, + ] + : []), ...(docsUsefulness ? [{ name: 'have_you_found_uniswap_docs_to_be_useful', value: docsUsefulness }] : []), ] @@ -95,4 +100,4 @@ export default async function handler(req: any, res: any) { } catch { return res.status(500).json({ success: false, error: 'Internal server error' }) } -} \ No newline at end of file +} diff --git a/src/components/FeedbackForm.tsx b/src/components/FeedbackForm.tsx index aa61fb3193..cbf5d42e67 100644 --- a/src/components/FeedbackForm.tsx +++ b/src/components/FeedbackForm.tsx @@ -38,7 +38,7 @@ export default function FeedbackForm() { challenges, docsUsefulness, pageUrl: typeof window !== 'undefined' ? window.location.href : '', - website: '', + website: '', }), }) @@ -67,17 +67,14 @@ export default function FeedbackForm() { if (status === 'success') { return (
- -

- Thanks for submitting your feedback -

+

Thanks for submitting your feedback

We really appreciate you taking the time to share your thoughts.

- If you left your contact info, we'll follow up with updates or questions as we make improvements. + If you left your contact info, we'll follow up with updates or questions as we make improvements.

- +