From 31763f76626d5beb24095b6dc098a85d97115e39 Mon Sep 17 00:00:00 2001 From: Kalidou Diagne Date: Mon, 1 Sep 2025 12:01:00 +0800 Subject: [PATCH] feat: PageSpeed Insights improvements (#545) * feat: PageSpeed Insights improvements --- .github/workflows/deploy.yml | 24 +- .swcrc | 13 + app/(pages)/about/page.tsx | 4 +- app/(pages)/devcon-7/page.tsx | 39 - .../devcon-7/sections/Devcon7Booths.tsx | 76 - .../devcon-7/sections/Devcon7Header.tsx | 22 - .../devcon-7/sections/Devcon7Section.tsx | 180 - .../devcon-7/sections/Devcon7Slider.tsx | 88 - app/(pages)/page.tsx | 29 +- app/(pages)/programs/index.tsx | 31 +- app/(pages)/projects/page.tsx | 11 +- app/api/articles/route.ts | 21 +- app/api/projects/route.ts | 12 +- app/api/proxy-matomo/route.ts | 32 + app/api/search/route.ts | 38 +- app/api/youtube/route.ts | 9 +- app/api/youtube/videos/route.ts | 6 +- app/layout.tsx | 68 +- app/providers/GlobalProvider.tsx | 22 +- components/CSSLoader.tsx | 24 + components/banner.tsx | 18 +- components/blog/article-in-evidance-card.tsx | 26 +- components/blog/article-list-card.tsx | 28 +- components/blog/articles-list.tsx | 27 +- components/blog/blog-article-card.tsx | 6 +- components/blog/blog-recent-articles.tsx | 54 +- components/icons.tsx | 28 +- components/main-nav.tsx | 32 +- components/mappings/project-link.tsx | 13 +- components/page-header.tsx | 7 +- components/project/project-card.tsx | 18 +- components/project/project-filters-bar.tsx | 38 +- components/project/project-list.tsx | 35 +- components/research/research-card.tsx | 12 +- components/research/research-list.tsx | 22 +- components/sections/ConnectWithUs.tsx | 14 +- components/sections/HomepageHeader.tsx | 75 + components/sections/HomepageVideoFeed.tsx | 24 +- components/sections/OurWork.tsx | 25 +- components/sections/ParallaxHero.tsx | 309 +- components/sections/ProjectYouTubeVideos.tsx | 10 +- components/site-footer.tsx | 13 +- components/site-header-mobile.tsx | 63 +- components/ui/button.tsx | 36 +- components/ui/label.tsx | 4 +- components/wiki-side-navigation.tsx | 16 +- content/articles/README.md | 2 +- content/articles/ethereum-privacy-pir.md | 2 +- ...o-world-the-first-signs-of-practical-io.md | 2 +- content/articles/introducing-trinity.md | 4 +- .../articles/lattice-based-proof-systems.md | 8 +- content/articles/mopro-native-packages.md | 8 +- content/articles/mpc-retrospective.md | 4 +- .../articles/pse-august-2025-newsletter.md | 15 +- content/articles/pse-july-2025-newsletter.md | 2 +- content/articles/pse-june-2025-newsletter.md | 2 +- content/articles/pse-security-what-is-new.md | 8 +- .../articles/reflecting-on-maci-platform.md | 2 +- content/articles/summon-major-update.md | 44 +- content/articles/tee-based-ppd.md | 16 +- .../the-case-for-privacy-in-dao-voting.md | 6 +- ...inary-merkle-root-circuit-fixed-in-v200.md | 58 +- content/events/devcon-7.ts | 262 - content/projects/README.md | 8 +- content/projects/maci-platform.md | 2 +- content/projects/maci.md | 2 +- content/projects/mopro.md | 2 +- content/projects/mpc-framework.md | 6 +- content/projects/mpc-stats.md | 2 +- content/projects/mpz.md | 2 +- content/projects/openpassport.md | 2 +- content/projects/p0tion.md | 2 +- content/projects/pod2.md | 4 +- content/projects/powers-of-tau.md | 2 +- content/projects/pse-security.md | 2 +- content/projects/sonobe.md | 2 +- content/projects/unirep-protocol.md | 2 +- content/projects/zk-email.md | 2 +- content/projects/zk-id.md | 2 +- content/projects/zkevm-community.md | 4 +- content/projects/zkml.md | 2 +- content/projects/zkp2p.md | 2 +- eslint.config.mjs | 5 + globals.css | 22 + hooks/useYoutube.ts | 5 + lib/critical-css.ts | 89 + lib/dummy-zlib-sync.ts | 16 - lib/fonts.ts | 18 - lib/types.ts | 41 - lib/utils.ts | 19 +- next.config.mjs | 159 +- package-lock.json | 9177 ----------------- package.json | 26 +- postcss.config.js | 2 +- .../articles/ethereum-privacy-pir/cover.webp | Bin 0 -> 250214 bytes .../cover-practical-io.webp | Bin 0 -> 62932 bytes .../articles/introducing-trinity/trinity.webp | Bin 78634 -> 36722 bytes .../lattice-based-proof-systems/image-1.webp | Bin 0 -> 11694 bytes .../lattice-based-proof-systems/image-2.webp | Bin 0 -> 14648 bytes .../lattice-based-proof-systems/image-3.webp | Bin 0 -> 11736 bytes .../lattice-based-proof-systems/image-4.webp | Bin 0 -> 11640 bytes .../zkemail-flutter-app-android.webp | Bin 0 -> 9446 bytes .../zkemail-flutter-app-ios.webp | Bin 0 -> 11212 bytes .../mpcstats-retrospective/cover.webp | Bin 0 -> 294078 bytes .../mpcstats-retrospective/mpcstats-demo.webp | Bin 0 -> 27288 bytes public/articles/pse-aug-2025/cover.png | Bin 1237368 -> 0 bytes public/articles/pse-aug-2025/cover.webp | Bin 0 -> 115644 bytes public/articles/pse-july-2025/cover.webp | Bin 0 -> 126862 bytes public/articles/pse-june-2025/cover.webp | Bin 0 -> 76880 bytes .../1-bug-tracker.webp | Bin 0 -> 54594 bytes .../audit-report.webp | Bin 0 -> 10996 bytes .../hack-tracker.webp | Bin 0 -> 6590 bytes .../security-analysis.webp | Bin 0 -> 22962 bytes .../reflecting-on-maci-platform.webp | Bin 0 -> 229234 bytes .../bool-example-light.webp | Bin 0 -> 10294 bytes .../articles/summon-major-update/cover.webp | Bin 0 -> 27308 bytes .../intellisense-light.webp | Bin 0 -> 40470 bytes .../number-example-light.webp | Bin 0 -> 10394 bytes .../public-inputs-light.webp | Bin 0 -> 35020 bytes public/articles/tee-based-ppd/benchmark1.webp | Bin 0 -> 36628 bytes public/articles/tee-based-ppd/benchmark2.webp | Bin 0 -> 37746 bytes public/articles/tee-based-ppd/cover.webp | Bin 0 -> 168508 bytes .../tee-based-ppd/cvm-availability.webp | Bin 0 -> 48040 bytes .../private-proof-delegation.webp | Bin 0 -> 4456 bytes .../tee-based-ppd/proof-delegation.webp | Bin 0 -> 4268 bytes public/articles/tee-based-ppd/tee-ppd.webp | Bin 0 -> 7238 bytes .../tee-based-ppd/trust-boundary.webp | Bin 0 -> 40812 bytes .../the-case-for-privacy-in-dao-voting/1.webp | Bin 0 -> 17538 bytes .../the-case-for-privacy-in-dao-voting/2.webp | Bin 0 -> 15072 bytes .../cover.webp | Bin 0 -> 125842 bytes .../sage-math-semaphore.webp | Bin 0 -> 145082 bytes .../sage-math-zk-kit-proof-length-1.webp | Bin 0 -> 133022 bytes .../sage-math-zk-kit-proof-length-2.webp | Bin 0 -> 145564 bytes public/avatars/andrew.webp | Bin 0 -> 27462 bytes public/avatars/edu.webp | Bin 0 -> 17680 bytes public/avatars/yanis.webp | Bin 0 -> 2538 bytes .../images/devcon-7/devcon-7-overview-1.jpg | Bin 180994 -> 0 bytes .../images/devcon-7/devcon-7-overview-1.webp | Bin 0 -> 136176 bytes .../images/devcon-7/devcon-7-overview-2.jpg | Bin 260940 -> 0 bytes .../images/devcon-7/devcon-7-overview-2.webp | Bin 0 -> 204118 bytes .../images/devcon-7/devcon-7-overview-3.jpg | Bin 236410 -> 0 bytes .../images/devcon-7/devcon-7-overview-3.webp | Bin 0 -> 176394 bytes .../images/devcon-7/devcon-7-overview-4.jpg | Bin 185698 -> 0 bytes .../images/devcon-7/devcon-7-overview-4.webp | Bin 0 -> 117426 bytes .../images/devcon-7/devcon-7-overview-5.jpg | Bin 239767 -> 0 bytes .../images/devcon-7/devcon-7-overview-5.webp | Bin 0 -> 182152 bytes .../images/devcon-7/devcon-7-overview-6.jpg | Bin 164914 -> 0 bytes .../images/devcon-7/devcon-7-overview-6.webp | Bin 0 -> 118072 bytes public/images/programs.webp | Bin 0 -> 70884 bytes public/og-image.webp | Bin 0 -> 37906 bytes public/programs-page-banner.webp | Bin 0 -> 44486 bytes public/project-banners/maci-platform.webp | Bin 0 -> 4528 bytes public/project-banners/maci.webp | Bin 0 -> 64324 bytes public/project-banners/mopro.webp | Bin 0 -> 7520 bytes public/project-banners/mpc-framework.webp | Bin 0 -> 25694 bytes public/project-banners/mpc-illustration.webp | Bin 0 -> 193502 bytes public/project-banners/mpc-stats.webp | Bin 0 -> 2768 bytes public/project-banners/mpz-cover.webp | Bin 0 -> 27424 bytes public/project-banners/openpassport.webp | Bin 0 -> 53824 bytes public/project-banners/p0tion.webp | Bin 0 -> 9704 bytes public/project-banners/pod2.webp | Bin 0 -> 69398 bytes public/project-banners/powers-of-tau.webp | Bin 0 -> 5918 bytes public/project-banners/pse-security.webp | Bin 0 -> 11490 bytes public/project-banners/semaphorePrevious.webp | Bin 0 -> 21246 bytes public/project-banners/sonobe.webp | Bin 0 -> 128678 bytes .../project-banners/unirep-previousBrand.webp | Bin 0 -> 31442 bytes public/project-banners/zk-email.webp | Bin 0 -> 9716 bytes public/project-banners/zk-id.webp | Bin 0 -> 23800 bytes public/project-banners/zkevm.webp | Bin 0 -> 19294 bytes public/project-banners/zkml.webp | Bin 0 -> 39496 bytes public/project-banners/zkp2p.webp | Bin 0 -> 2694 bytes public/project/example-project-badge.webp | Bin 0 -> 91918 bytes public/project/example-project-detail.webp | Bin 0 -> 175866 bytes public/project/example-project-team.webp | Bin 0 -> 105866 bytes public/project/example-project-video.webp | Bin 0 -> 173226 bytes tailwind.config.js | 1 - tests/lib/utils.test.ts | 26 - tests/setup.tsx | 6 - tsconfig.json | 3 +- yarn.lock | 661 +- 180 files changed, 1938 insertions(+), 10537 deletions(-) create mode 100644 .swcrc delete mode 100644 app/(pages)/devcon-7/page.tsx delete mode 100644 app/(pages)/devcon-7/sections/Devcon7Booths.tsx delete mode 100644 app/(pages)/devcon-7/sections/Devcon7Header.tsx delete mode 100644 app/(pages)/devcon-7/sections/Devcon7Section.tsx delete mode 100644 app/(pages)/devcon-7/sections/Devcon7Slider.tsx create mode 100644 app/api/proxy-matomo/route.ts create mode 100644 components/CSSLoader.tsx create mode 100644 components/sections/HomepageHeader.tsx delete mode 100644 content/events/devcon-7.ts create mode 100644 lib/critical-css.ts delete mode 100644 lib/dummy-zlib-sync.ts delete mode 100644 lib/fonts.ts delete mode 100644 package-lock.json create mode 100644 public/articles/ethereum-privacy-pir/cover.webp create mode 100644 public/articles/hello-world-the-first-signs-of-practical-io/cover-practical-io.webp create mode 100644 public/articles/lattice-based-proof-systems/image-1.webp create mode 100644 public/articles/lattice-based-proof-systems/image-2.webp create mode 100644 public/articles/lattice-based-proof-systems/image-3.webp create mode 100644 public/articles/lattice-based-proof-systems/image-4.webp create mode 100644 public/articles/mopro-native-packages/zkemail-flutter-app-android.webp create mode 100644 public/articles/mopro-native-packages/zkemail-flutter-app-ios.webp create mode 100644 public/articles/mpcstats-retrospective/cover.webp create mode 100644 public/articles/mpcstats-retrospective/mpcstats-demo.webp delete mode 100644 public/articles/pse-aug-2025/cover.png create mode 100644 public/articles/pse-aug-2025/cover.webp create mode 100644 public/articles/pse-july-2025/cover.webp create mode 100644 public/articles/pse-june-2025/cover.webp create mode 100644 public/articles/pse-security-what-is-new/1-bug-tracker.webp create mode 100644 public/articles/pse-security-what-is-new/audit-report.webp create mode 100644 public/articles/pse-security-what-is-new/hack-tracker.webp create mode 100644 public/articles/pse-security-what-is-new/security-analysis.webp create mode 100644 public/articles/reflecting-on-maci-platform/reflecting-on-maci-platform.webp create mode 100644 public/articles/summon-major-update/bool-example-light.webp create mode 100644 public/articles/summon-major-update/cover.webp create mode 100644 public/articles/summon-major-update/intellisense-light.webp create mode 100644 public/articles/summon-major-update/number-example-light.webp create mode 100644 public/articles/summon-major-update/public-inputs-light.webp create mode 100644 public/articles/tee-based-ppd/benchmark1.webp create mode 100644 public/articles/tee-based-ppd/benchmark2.webp create mode 100644 public/articles/tee-based-ppd/cover.webp create mode 100644 public/articles/tee-based-ppd/cvm-availability.webp create mode 100644 public/articles/tee-based-ppd/private-proof-delegation.webp create mode 100644 public/articles/tee-based-ppd/proof-delegation.webp create mode 100644 public/articles/tee-based-ppd/tee-ppd.webp create mode 100644 public/articles/tee-based-ppd/trust-boundary.webp create mode 100644 public/articles/the-case-for-privacy-in-dao-voting/1.webp create mode 100644 public/articles/the-case-for-privacy-in-dao-voting/2.webp create mode 100644 public/articles/the-case-for-privacy-in-dao-voting/cover.webp create mode 100644 public/articles/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-semaphore.webp create mode 100644 public/articles/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-1.webp create mode 100644 public/articles/under-constrained-bug-in-binary-merkle-root-circuit-fixed-in-v200/sage-math-zk-kit-proof-length-2.webp create mode 100644 public/avatars/andrew.webp create mode 100644 public/avatars/edu.webp create mode 100644 public/avatars/yanis.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-1.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-1.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-2.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-2.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-3.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-3.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-4.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-4.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-5.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-5.webp delete mode 100644 public/images/devcon-7/devcon-7-overview-6.jpg create mode 100644 public/images/devcon-7/devcon-7-overview-6.webp create mode 100644 public/images/programs.webp create mode 100644 public/og-image.webp create mode 100644 public/programs-page-banner.webp create mode 100644 public/project-banners/maci-platform.webp create mode 100644 public/project-banners/maci.webp create mode 100644 public/project-banners/mopro.webp create mode 100644 public/project-banners/mpc-framework.webp create mode 100644 public/project-banners/mpc-illustration.webp create mode 100644 public/project-banners/mpc-stats.webp create mode 100644 public/project-banners/mpz-cover.webp create mode 100644 public/project-banners/openpassport.webp create mode 100644 public/project-banners/p0tion.webp create mode 100644 public/project-banners/pod2.webp create mode 100644 public/project-banners/powers-of-tau.webp create mode 100644 public/project-banners/pse-security.webp create mode 100644 public/project-banners/semaphorePrevious.webp create mode 100644 public/project-banners/sonobe.webp create mode 100644 public/project-banners/unirep-previousBrand.webp create mode 100644 public/project-banners/zk-email.webp create mode 100644 public/project-banners/zk-id.webp create mode 100644 public/project-banners/zkevm.webp create mode 100644 public/project-banners/zkml.webp create mode 100644 public/project-banners/zkp2p.webp create mode 100644 public/project/example-project-badge.webp create mode 100644 public/project/example-project-detail.webp create mode 100644 public/project/example-project-team.webp create mode 100644 public/project/example-project-video.webp diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cdf44ee..157d680 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -18,8 +18,8 @@ on: default: "prod" type: choice options: - - prod - - stg + - prod + - stg concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -38,29 +38,29 @@ jobs: steps: - name: Check branch run: | - if [ "${{ env.DATA_ENV }}" = "prod" ]; then - if [ "$GITHUB_REF_NAME" != "main" ]; then - echo "Operation not permitted" - exit 1 - fi + if [ "${{ env.DATA_ENV }}" = "prod" ]; then + if [ "$GITHUB_REF_NAME" != "main" ]; then + echo "Operation not permitted" + exit 1 fi + fi - name: Checkout uses: actions/checkout@v5 with: persist-credentials: false - + - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::490752553772:role/pse-web-ecs-deploy-slc role-duration-seconds: 1800 aws-region: eu-central-1 - + - name: Build and Push images to ECR run: | - .github/scripts/build.sh ${{ env.DATA }} ${{ env.DATA_ENV }} - + .github/scripts/build.sh ${{ env.DATA }} ${{ env.DATA_ENV }} + - name: Update Deployment run: | - .github/scripts/deploy.sh ${{ env.DATA_ENV }} + .github/scripts/deploy.sh ${{ env.DATA_ENV }} diff --git a/.swcrc b/.swcrc new file mode 100644 index 0000000..fc98541 --- /dev/null +++ b/.swcrc @@ -0,0 +1,13 @@ +{ + "jsc": { + "target": "es2022" + }, + "env": { + "targets": { + "chrome": "91", + "firefox": "90", + "safari": "14.1", + "edge": "91" + } + } +} \ No newline at end of file diff --git a/app/(pages)/about/page.tsx b/app/(pages)/about/page.tsx index 74b8379..0ca9535 100644 --- a/app/(pages)/about/page.tsx +++ b/app/(pages)/about/page.tsx @@ -34,9 +34,9 @@ export default async function AboutPage() {
-

+

Our Mission -

+ As Privacy Stewards of Ethereum (PSE), our mission is to deliver privacy to the Ethereum ecosystem.
diff --git a/app/(pages)/devcon-7/page.tsx b/app/(pages)/devcon-7/page.tsx deleted file mode 100644 index 9d3af20..0000000 --- a/app/(pages)/devcon-7/page.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from "react" -import { Metadata } from "next" - -import { Devcon7Booths } from "./sections/Devcon7Booths" -import { Devcon7Header } from "./sections/Devcon7Header" -import { Devcon7Section } from "./sections/Devcon7Section" - -import { Devcon7Slider } from "./sections/Devcon7Slider" - -export const metadata: Metadata = { - title: "Devcon 7", - description: "PSE x Devcon 7 Southeast Asia", - openGraph: { - images: [ - { - url: "/devcon-7-cover.png", - width: 1200, - height: 630, - }, - ], - }, -} - -export default async function DevconPage() { - return ( - <> -
-
- - -
- -
- -
-
- - ) -} diff --git a/app/(pages)/devcon-7/sections/Devcon7Booths.tsx b/app/(pages)/devcon-7/sections/Devcon7Booths.tsx deleted file mode 100644 index 526eea5..0000000 --- a/app/(pages)/devcon-7/sections/Devcon7Booths.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import Image from "next/image" -import Link from "next/link" - -import { AppContent } from "@/components/ui/app-content" -import { Icons } from "@/components/icons" -import { booths } from "@/content/events/devcon-7" - -export const Devcon7Booths = () => { - return ( - -
-

- {`We're excited to connect and collaborate on building meaningful tools - with cryptography.`} -

-
- {booths?.map((booth, index) => { - return ( -
-
- {`booth -
-
- - BOOTH - - - {booth?.title} - - - {booth?.description} - {booth?.learMore && ( - - {`${booth.learMore.description}: `}{" "} - - {booth?.learMore?.label} - - - )} - -
-
- - - {booth?.date} - -
-
- - - {booth?.location} - -
-
-
-
- ) - })} -
-
-
- ) -} diff --git a/app/(pages)/devcon-7/sections/Devcon7Header.tsx b/app/(pages)/devcon-7/sections/Devcon7Header.tsx deleted file mode 100644 index 46b9636..0000000 --- a/app/(pages)/devcon-7/sections/Devcon7Header.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import Image from "next/image" - -export const Devcon7Header = () => { - return ( -
- Devcon 7 Banner - Devcon 7 Banner -
- ) -} diff --git a/app/(pages)/devcon-7/sections/Devcon7Section.tsx b/app/(pages)/devcon-7/sections/Devcon7Section.tsx deleted file mode 100644 index 525d41b..0000000 --- a/app/(pages)/devcon-7/sections/Devcon7Section.tsx +++ /dev/null @@ -1,180 +0,0 @@ -"use client" - -import { useState } from "react" -import Link from "next/link" -import { cva } from "class-variance-authority" - -import { cn } from "@/lib/utils" -import { Icons } from "@/components/icons" -import { events } from "@/content/events/devcon-7" - -const tableSection = cva("lg:grid lg:grid-cols-[200px_1fr_160px_20px] lg:gap-8") -const tableSectionTitle = cva( - "text-anakiwa-500 text-base lg:text-xs font-sans leading-5 tracking-[2.5px] uppercase font-bold lg:pb-3" -) - -const EventCard = ({ event = {}, speakers = [], location = "" }: any) => { - const [isOpen, setIsOpen] = useState(false) - - const getYouTubeEmbedURL = (url: string) => { - const match = url.match( - /(?:youtube\.com\/(?:watch\?v=|live\/)|youtu\.be\/)([^?&]+)/ - ) - return match ? `https://www.youtube.com/embed/${match[1]}` : null - } - - return ( -
-
- - {event?.date} - -
-
-
- - - {event?.time} - -
-
- - - {location} - -
-
- {speakers?.map((speaker: any, index: number) => { - return ( - - {speaker.label} - - ) - })} -
-
-
-
-
-
- - {event?.title} - - -
-
- - {event?.description} - -
- {event?.youtubeLink && ( -