From 4ca8d1adc910060e04839b4e7abf396f5c5f74f0 Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues Date: Thu, 22 Feb 2024 13:03:27 +0000 Subject: [PATCH 1/4] add robots.txt and sitemap, replace anchor tags for button tags and add vite JS compress plugin --- index.html | 3 +- package.json | 5 +- public/robots.txt | 4 + public/sitemap.xml | 16 ++ src/assets/ward-logo-icon-blue.png | Bin 0 -> 411 bytes src/components/banner/Banner.tsx | 4 +- src/components/common/RiskIndicator.tsx | 4 +- src/components/graph/hotbar/Hotbar.tsx | 60 +++--- vite.config.ts | 2 + yarn.lock | 231 +++++++++++++++++++++++- 10 files changed, 287 insertions(+), 42 deletions(-) create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 src/assets/ward-logo-icon-blue.png diff --git a/index.html b/index.html index 4c191fe4..f274d0ab 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,8 @@ - + + diff --git a/package.json b/package.json index 94699217..4a5a9788 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "react-share": "^5.0.3", "reactflow": "^11.10.1", "uuid": "^9.0.1", - "vite-plugin-environment": "^1.1.3", "yarn": "^1.22.21", "zod": "^3.22.4" }, @@ -58,7 +57,9 @@ "react-router-dom": "^6.20.1", "tailwindcss": "^3.3.6", "typescript": "^5.2.2", - "vite": "^5.0.10" + "vite": "^5.0.10", + "vite-plugin-compression2": "^0.12.0", + "vite-plugin-environment": "^1.1.3" }, "packageManager": "yarn@1.22.21", "prettier": { diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 00000000..b621bcb7 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://wardanalytics.app/sitemap.xml \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 00000000..b1d23edb --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,16 @@ + + + + + + + https://wardanalytics.app/ + 2024-02-21T01:48:11+00:00 + + + + \ No newline at end of file diff --git a/src/assets/ward-logo-icon-blue.png b/src/assets/ward-logo-icon-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..60ae1a6499fc069d9cda4168f8460cc1ffbbb926 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy;Q>A&t{`s4eUb-#PQY zQ|5n%0{ZieN;B^^qIYRpB3IOoAk}Y zN#A~QjkH+WUtiA8*=NM1a;M3MUQm)>G*z)7^UyM{y6x|yI0GdQvNWb0uMaX8khyov zuTUt~<%83LY({hLX8ARaBHp@Zudr_38X=_NV-VfVx;(Y{W|Wd^Y7>xb{i@`3;waM| z0TU5J%Y(w)cQO@c7&Vz+cw-jP8nq(bl!fc@*+6fh_giKs@GjD^4}A6_{rQ%kIWtmp Z7*2|D*uQfKR|5Kw!PC{xWt~$(69D~WtcU;r literal 0 HcmV?d00001 diff --git a/src/components/banner/Banner.tsx b/src/components/banner/Banner.tsx index f3f52301..476c0bec 100644 --- a/src/components/banner/Banner.tsx +++ b/src/components/banner/Banner.tsx @@ -46,12 +46,12 @@ const Banner: FC = () => { Register now for free, unlimited graph lookups

- setIsLoginDialogOpen(true)} > Sign In / Up - +
diff --git a/src/components/common/RiskIndicator.tsx b/src/components/common/RiskIndicator.tsx index 85c14655..49ea7f09 100644 --- a/src/components/common/RiskIndicator.tsx +++ b/src/components/common/RiskIndicator.tsx @@ -53,12 +53,12 @@ const RiskIndicator: FC = ({
  • - Direct Exposure, both incoming and + Direct Exposure, both incoming and outgoing
  • - Indirect Exposure, both incoming and + Indirect Exposure, both incoming and outgoing
  • diff --git a/src/components/graph/hotbar/Hotbar.tsx b/src/components/graph/hotbar/Hotbar.tsx index 26e4c18c..f79e3d1b 100644 --- a/src/components/graph/hotbar/Hotbar.tsx +++ b/src/components/graph/hotbar/Hotbar.tsx @@ -24,7 +24,6 @@ import CreateGraphDialog from "./components/CreateGraphDialog"; interface HotbarButton { onClick?: () => void; - href?: string; Icon: any; name: string; className?: string; @@ -39,7 +38,6 @@ const HotbarButton: FC = ({ className, iconColor, hotKey, - href, }) => { const hotKeyClicked = hotKey ? useKeyPress(hotKey) : false; @@ -50,33 +48,31 @@ const HotbarButton: FC = ({ }, [hotKeyClicked]); return ( - - - + > + {hotKey} + + )} + {name} + + + ); }; @@ -212,8 +208,12 @@ const Hotbar: FC = ({ { logAnalyticsEvent("report_bug_clicked") }} - href="https://forms.gle/yCFrDnKyUmPYPhfg8" + onClick={() => { + logAnalyticsEvent("report_bug_clicked") + // Open in a new tab to avoid losing the current graph + // To improve SEO, this action is onClick instead of a simple link because the other buttons don't use href + window.open("https://forms.gle/yCFrDnKyUmPYPhfg8", "_blank") + }} /> diff --git a/vite.config.ts b/vite.config.ts index 3c5c172c..f13607f3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import EnvironmentPlugin from "vite-plugin-environment"; +import { compression } from "vite-plugin-compression2"; // https://vitejs.dev/config/ export default defineConfig({ @@ -25,6 +26,7 @@ export default defineConfig({ include: "**/*.{jsx,tsx}", }), EnvironmentPlugin("all"), + compression(), ], server: { port: 3000, diff --git a/yarn.lock b/yarn.lock index 1886864d..ae9753ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1162,6 +1162,15 @@ resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.14.0.tgz" integrity sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A== +"@rollup/pluginutils@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + "@rollup/rollup-android-arm-eabi@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz#beaf518ee45a196448e294ad3f823d2d4576cf35" @@ -1702,6 +1711,11 @@ dependencies: "@types/node" "*" +"@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/geojson@*": version "7946.0.13" resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz" @@ -2010,6 +2024,31 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +archiver-utils@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-4.0.1.tgz#66ad15256e69589a77f706c90c6dbcc1b2775d2a" + integrity sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg== + dependencies: + glob "^8.0.0" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash "^4.17.15" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + +archiver@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-6.0.1.tgz#d56968d4c09df309435adb5a1bbfc370dae48133" + integrity sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ== + dependencies: + archiver-utils "^4.0.1" + async "^3.2.4" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.1.2" + tar-stream "^3.0.0" + zip-stream "^5.0.1" + arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" @@ -2105,6 +2144,11 @@ astring@^1.8.1: resolved "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz" integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== +async@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + asynciterator.prototype@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz" @@ -2143,11 +2187,21 @@ axios@^1.6.2: form-data "^4.0.0" proxy-from-env "^1.1.0" +b4a@^1.6.4: + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.0.tgz#a7a7263c107daf8b85adf0b64f908503454ab26e" + integrity sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg== + big-integer@^1.6.16, big-integer@^1.6.44: version "1.6.52" resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" @@ -2211,6 +2265,11 @@ browserslist@^4.21.10, browserslist@^4.22.2: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + bundle-name@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz" @@ -2379,6 +2438,16 @@ compare-versions@^6.1.0: resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz" integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== +compress-commons@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-5.0.1.tgz#e46723ebbab41b50309b27a0e0f6f3baed2d6590" + integrity sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag== + dependencies: + crc-32 "^1.2.0" + crc32-stream "^5.0.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -2389,6 +2458,24 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +crc32-stream@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-5.0.0.tgz#a97d3a802c8687f101c27cc17ca5253327354720" + integrity sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -2891,6 +2978,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@2.0.3, esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -2941,6 +3033,11 @@ fast-diff@^1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" @@ -3195,6 +3292,17 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3350,7 +3458,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3579,6 +3687,11 @@ isarray@^2.0.5: resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -3718,6 +3831,13 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +lazystream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" @@ -3808,7 +3928,7 @@ lodash.uniqwith@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz" integrity sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q== -lodash@^4.17.21, lodash@~4.17.21: +lodash@^4.17.15, lodash@^4.17.21, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3928,6 +4048,13 @@ minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1, minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^6.1.6: version "6.2.0" resolved "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz" @@ -4428,6 +4555,11 @@ pretty-format@^29.5.0: ansi-styles "^5.0.0" react-is "^18.0.0" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" @@ -4470,6 +4602,11 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" @@ -4569,6 +4706,35 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^2.0.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-glob@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== + dependencies: + minimatch "^5.1.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -4701,11 +4867,16 @@ safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@>=5.1.0: +safe-buffer@>=5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" @@ -4865,6 +5036,16 @@ std-env@^3.3.3: resolved "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz" integrity sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg== +streamx@^2.15.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + optionalDependencies: + bare-events "^2.2.0" + string-argv@^0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" @@ -4921,6 +5102,20 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -5035,6 +5230,15 @@ tailwindcss@^3.3.6: resolve "^1.22.2" sucrase "^3.32.0" +tar-stream@^3.0.0: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -5247,7 +5451,7 @@ use-sync-external-store@1.2.0: resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -5279,9 +5483,17 @@ vite-node@0.34.6: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0 || ^5.0.0-0" +vite-plugin-compression2@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/vite-plugin-compression2/-/vite-plugin-compression2-0.12.0.tgz#d8d84d5ba21ffce9bbbf266c4056304201a21e61" + integrity sha512-9zdEF9xKVezETSF1l1bHoOk8LNoKIHB+DZVgSIGuGWaYupwFmsAGh0uwRcmK6rVHacxQRBECVYdtfc65DPDRfg== + dependencies: + "@rollup/pluginutils" "^5.0.2" + archiver "^6.0.1" + vite-plugin-environment@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz#d01a04abb2f69730a4866c9c9db51d3dab74645b" integrity sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA== "vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0-0", vite@^5.0.10: @@ -5489,6 +5701,15 @@ yocto-queue@^1.0.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +zip-stream@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-5.0.1.tgz#cf3293bba121cad98be2ec7f05991d81d9f18134" + integrity sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA== + dependencies: + archiver-utils "^4.0.1" + compress-commons "^5.0.1" + readable-stream "^3.6.0" + zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From c7520c0b0211b578c181d4c14c412729c21c4dda Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues Date: Thu, 22 Feb 2024 13:37:49 +0000 Subject: [PATCH 2/4] replace logo from image to image and h1 --- index.html | 6 ++++- .../auth/SignInWithGoogleButton.tsx | 2 +- src/components/common/Logo.tsx | 26 +++++++++---------- .../graph/landing_page/LandingPage.tsx | 14 +++++----- src/templates/MobileWarningTemplate.tsx | 6 ++--- tailwind.config.js | 3 +++ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/index.html b/index.html index f274d0ab..0540d349 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,17 @@ + - Ward Graph + Ward Analytics - Graph + diff --git a/src/components/auth/SignInWithGoogleButton.tsx b/src/components/auth/SignInWithGoogleButton.tsx index a04f24fa..2eb8a226 100644 --- a/src/components/auth/SignInWithGoogleButton.tsx +++ b/src/components/auth/SignInWithGoogleButton.tsx @@ -19,7 +19,7 @@ const SignInWithGoogleButton: FC = ({ className="h-6 w-6" src="https://www.svgrepo.com/show/475656/google-color.svg" loading="lazy" - alt="google logo" + alt="Google logo" /> {text} diff --git a/src/components/common/Logo.tsx b/src/components/common/Logo.tsx index e1d0ec8b..84143b91 100644 --- a/src/components/common/Logo.tsx +++ b/src/components/common/Logo.tsx @@ -1,20 +1,18 @@ +import clsx from "clsx"; import { FC } from "react"; -import logo from "../../assets/ward-logo-blue-full.svg"; -import darkModeLogo from "../../assets/ward-logo-white-full.svg"; +import logo from "../../assets/ward-logo-blue.svg"; -const Logo: FC = () => { +interface LogoProps { + className?: string; +} + +const Logo: FC = ({ + className +}) => { return ( -
    - Ward Analytics - Ward Analytics +
    + Ward Analytics +

    Ward Analytics

    ) } diff --git a/src/components/graph/landing_page/LandingPage.tsx b/src/components/graph/landing_page/LandingPage.tsx index 36808dca..a062f51a 100644 --- a/src/components/graph/landing_page/LandingPage.tsx +++ b/src/components/graph/landing_page/LandingPage.tsx @@ -1,9 +1,9 @@ import { SparklesIcon } from "@heroicons/react/20/solid"; import { FC } from "react"; -import logo from "../../../assets/ward-logo-blue-full.svg"; -import SearchBar from "../search_bar"; import { logAnalyticsEvent } from "../../../services/firestore/analytics/analytics"; +import Logo from "../../common/Logo"; +import SearchBar from "../search_bar"; const PossibleAddresses: string[] = [ "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326", @@ -26,16 +26,16 @@ const LandingPage: FC = ({ setSearchedAddress }) => { return ( <> -
    - Ward Logo +
    + -

    +

    I'm feeling lucky

    +
    ); diff --git a/src/templates/MobileWarningTemplate.tsx b/src/templates/MobileWarningTemplate.tsx index a65225e1..57846054 100644 --- a/src/templates/MobileWarningTemplate.tsx +++ b/src/templates/MobileWarningTemplate.tsx @@ -1,8 +1,8 @@ -import { FC } from "react"; import clsx from "clsx"; +import { FC } from "react"; -import logo from "../assets/ward-logo-blue-full.svg"; import { ComputerDesktopIcon } from "@heroicons/react/24/outline"; +import Logo from "../components/common/Logo"; interface MobileWarningTemplateProps { className?: string; @@ -19,7 +19,7 @@ const MobileWarningTemplate: FC = ({ className, )} > - Ward Logo +

    diff --git a/tailwind.config.js b/tailwind.config.js index 86257133..609f2c39 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -9,6 +9,9 @@ export default { extend: { colors: { primary: { "50": "#eff6ff", "100": "#dbeafe", "200": "#bfdbfe", "300": "#93c5fd", "400": "#60a5fa", "500": "#3b82f6", "600": "#2563eb", "700": "#1d4ed8", "800": "#1e40af", "900": "#1e3a8a", "950": "#172554" } + }, + fontFamily: { + 'montserrat': ['Montserrat'], } }, }, From dbe18d40e770b7bc4ff3b4c13251254ef910c8d7 Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues Date: Thu, 22 Feb 2024 14:47:39 +0000 Subject: [PATCH 3/4] change logo h1 font weight to bold --- src/components/common/Logo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/Logo.tsx b/src/components/common/Logo.tsx index 84143b91..540350c2 100644 --- a/src/components/common/Logo.tsx +++ b/src/components/common/Logo.tsx @@ -12,7 +12,7 @@ const Logo: FC = ({ return (

    Ward Analytics -

    Ward Analytics

    +

    Ward Analytics

    ) } From 5e99d38fc2489f9b9bff5502a005122237b49d89 Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues Date: Thu, 22 Feb 2024 15:21:58 +0000 Subject: [PATCH 4/4] add helmet elements to each routed page --- package.json | 1 + src/App.tsx | 19 ++++-- src/components/common/SEO.tsx | 42 ++++++++++++ src/templates/BillingTemplate.tsx | 94 ++++++++++++++------------ src/templates/SavedGraphTemplate.tsx | 16 +++-- src/templates/SavedGraphsTemplate.tsx | 52 +++++++------- src/templates/UnsavedGraphTemplate.tsx | 64 ++++++++++-------- yarn.lock | 28 +++++++- 8 files changed, 204 insertions(+), 112 deletions(-) create mode 100644 src/components/common/SEO.tsx diff --git a/package.json b/package.json index 4a5a9788..d7621207 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-draggable": "^4.4.6", + "react-helmet-async": "^2.0.4", "react-hook-form": "^7.50.1", "react-icons": "^5.0.1", "react-query": "^3.39.3", diff --git a/src/App.tsx b/src/App.tsx index 9d7e3126..92a1b85c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,18 +7,25 @@ import PrivateApp from "./PrivateApp"; import PublicApp from "./PublicApp"; import { MobileWarningTemplate } from "./templates"; +import { HelmetProvider } from 'react-helmet-async'; + function App() { const queryClient = useCustomQueryClient(); const { isAuthenticated } = useAuthState(); + // Ensure that context is never scoped outside of the current instance of the app + const helmetContext = {}; + return ( <> - - -
    - {isAuthenticated ? : } -
    -
    + + + +
    + {isAuthenticated ? : } +
    +
    +
    ); } diff --git a/src/components/common/SEO.tsx b/src/components/common/SEO.tsx new file mode 100644 index 00000000..e2e30121 --- /dev/null +++ b/src/components/common/SEO.tsx @@ -0,0 +1,42 @@ +import { FC } from "react"; +import { Helmet } from "react-helmet-async"; + +interface SEOProps { + title: string; + description: string; + creator?: string; + type?: string; +} + +const SEO: FC = ({ + title, + description, + creator = "Ward Analytics", + type = "website", +}) => { + return ( + + { /* Standard metadata tags */} + {`Ward Analytics - ${title}`} + + { /* End standard metadata tags */} + { /* Facebook tags + For more information, visit https://ogp.me/ + */} + + + + { /* End Facebook tags */} + { /* Twitter tags + For more information, visit https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary + */} + + + + + { /* End Twitter tags */} + + ) +} + +export default SEO; \ No newline at end of file diff --git a/src/templates/BillingTemplate.tsx b/src/templates/BillingTemplate.tsx index d03d6805..c06dc4ad 100644 --- a/src/templates/BillingTemplate.tsx +++ b/src/templates/BillingTemplate.tsx @@ -19,6 +19,7 @@ import { useCustomerPortalUrl, } from "../services/stripe"; import { Colors } from "../utils/colors"; +import SEO from "../components/common/SEO"; interface PlanProps { isPro: boolean; @@ -261,54 +262,57 @@ const BillingTemplate: FC = () => { }, [customerPortalUrl]); return ( -
    -

    - - Plan & Billing -

    -
    + <> + +
    +

    + + Plan & Billing +

    +
    - { - // TODO: Replace for a loading component to standardize the loading state + { + // TODO: Replace for a loading component to standardize the loading state - <> - -

    - Plan: - {isLoading ? ( -
    - ) : isPro ? ( -

    - - Pro -

    - ) : ( -

    Free

    + <> + +

    + Plan: + {isLoading ? ( +
    + ) : isPro ? ( +

    + + Pro +

    + ) : ( +

    Free

    + )} +

    + {isPro && ( + setManageSubscriptionClicked(true)} + Icon={CreditCardSmallIcon} + /> )} -

    - {isPro && ( - setManageSubscriptionClicked(true)} - Icon={CreditCardSmallIcon} - /> - )} -
    - - <> - - - - - - - } -
    + + + <> + + + + + + + } +
    + ); }; diff --git a/src/templates/SavedGraphTemplate.tsx b/src/templates/SavedGraphTemplate.tsx index e1bf5971..19fdb6a0 100644 --- a/src/templates/SavedGraphTemplate.tsx +++ b/src/templates/SavedGraphTemplate.tsx @@ -9,6 +9,7 @@ import { import { Graph } from "../components/graph/Graph"; import { PersonalGraph } from "../services/firestore/user/graph_saving"; import useAuthState from "../hooks/useAuthState"; +import SEO from "../components/common/SEO"; const SavedGraphTemplate: FC = () => { const { user } = useAuthState(); @@ -49,12 +50,15 @@ const SavedGraphTemplate: FC = () => { if (!graph) return null; return ( - + <> + + + ); }; diff --git a/src/templates/SavedGraphsTemplate.tsx b/src/templates/SavedGraphsTemplate.tsx index 722e86ae..e2318403 100644 --- a/src/templates/SavedGraphsTemplate.tsx +++ b/src/templates/SavedGraphsTemplate.tsx @@ -19,6 +19,7 @@ import { PlusCircleIcon } from "@heroicons/react/20/solid"; import { useNavigate } from "react-router-dom"; import CreateGraphDialog from "../components/common/CreateGraphDialog"; import DeleteGraphDialog from "../components/common/DeleteGraphDialog"; +import SEO from "../components/common/SEO"; const GraphCard: FC<{ graph: PersonalGraph }> = ({ graph }) => { const navigate = useNavigate(); @@ -60,33 +61,36 @@ const SavedGraphsTemplate: FC = () => { const [isCreateGraphDialogOpen, setIsCreateGraphDialogOpen] = useState(false); return ( -
    -

    -
    - - Saved Graphs + <> + +
    +

    +
    + + Saved Graphs +
    + { + setIsCreateGraphDialogOpen(true); + }} + Icon={PlusCircleIcon} + /> +

    +
    +
    +
    + {graphs.map((graph) => ( + + ))} +
    - { - setIsCreateGraphDialogOpen(true); - }} - Icon={PlusCircleIcon} + -

    -
    -
    -
    - {graphs.map((graph) => ( - - ))} -
    - -
    + ); }; diff --git a/src/templates/UnsavedGraphTemplate.tsx b/src/templates/UnsavedGraphTemplate.tsx index 2b54c253..de829ede 100644 --- a/src/templates/UnsavedGraphTemplate.tsx +++ b/src/templates/UnsavedGraphTemplate.tsx @@ -3,6 +3,7 @@ import { useParams } from "react-router-dom"; import { SharableGraph, getSharableGraph } from "../services/firestore/graph_sharing"; import { Transition } from "@headlessui/react"; +import SEO from "../components/common/SEO"; import { Graph } from "../components/graph/Graph"; import LandingPage from "../components/graph/landing_page/LandingPage"; @@ -81,36 +82,39 @@ const UnsavedGraphTemplate: FC = ({ if (loading) return null; return ( -
    - - { - setGraph({ addresses: [address], edges: [] }); - }} - /> - - 0 || !showLandingPage} - appear={true} - enter="transition-all duration-500 delay-500" - enterFrom="opacity-0 scale-150" - enterTo="opacity-100 scale-100" - className="h-full w-full" - > - - -
    + <> + +
    + + { + setGraph({ addresses: [address], edges: [] }); + }} + /> + + 0 || !showLandingPage} + appear={true} + enter="transition-all duration-500 delay-500" + enterFrom="opacity-0 scale-150" + enterTo="opacity-100 scale-100" + className="h-full w-full" + > + + +
    + ); }; diff --git a/yarn.lock b/yarn.lock index ae9753ca..42803d7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3472,6 +3472,13 @@ internal-slot@^1.0.5: hasown "^2.0.0" side-channel "^1.0.4" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -3948,7 +3955,7 @@ long@^5.0.0: resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4623,6 +4630,20 @@ react-draggable@^4.4.6: clsx "^1.1.1" prop-types "^15.8.1" +react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" + integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + react-hook-form@^7.50.1: version "7.50.1" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.50.1.tgz#f6aeb17a863327e5a0252de8b35b4fc8990377ed" @@ -4929,6 +4950,11 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"