homepage + footer

This commit is contained in:
Kalidou Diagne
2024-03-14 01:43:07 +00:00
parent ae2a1a17ae
commit d634a765bb
12 changed files with 537 additions and 278 deletions

View File

@@ -1,17 +1,17 @@
"use client"
import { motion } from "framer-motion"
import Image from "next/image"
import Link from "next/link"
import PSELogo from "@/public/icons/archstar.webp"
import { motion } from "framer-motion"
import { siteConfig } from "@/config/site"
import { Icons } from "@/components/icons"
import { ConnectWithUs } from "@/components/sections/ConnectWithUs"
import { NewsSection } from "@/components/sections/NewsSection"
import { WhatWeDo } from "@/components/sections/WhatWeDo"
import { AppContent } from "@/components/ui/app-content"
import { Button } from "@/components/ui/button"
import { Label } from "@/components/ui/label"
import { Icons } from "@/components/icons"
import { NewsSection } from "@/components/sections/NewsSection"
import { WhatWeDo } from "@/components/sections/WhatWeDo"
import { siteConfig } from "@/config/site"
import { useTranslation } from "../i18n/client"
@@ -48,7 +48,13 @@ export default function IndexPage({ params: { lang } }: any) {
</Link>
</div>
<div className="m-auto flex h-[320px] w-full max-w-[280px] items-center justify-center md:m-0 md:h-full md:w-full lg:max-w-[380px]">
<Image src={PSELogo} alt="pselogo" style={{ objectFit: "cover" }} />
<Image
src="/icons/archstar.webp"
alt="pselogo"
width={380}
height={380}
style={{ objectFit: "cover" }}
/>
</div>
</AppContent>
@@ -56,14 +62,18 @@ export default function IndexPage({ params: { lang } }: any) {
<div className="bg-radial-gradient flex flex-col">
<WhatWeDo lang={lang} />
</div>
<ConnectWithUs lang={lang} />
<div className="bg-radial-gradient">
<section className="relative border-y border-tuatara-600 bg-[#D0F2FF] pb-16 pt-8 text-center">
<AppContent className="flex flex-col gap-6">
<div className="flex flex-col items-center text-center">
<h6 className="py-6 font-sans text-base font-bold uppercase tracking-[4px] text-tuatara-950">
{t("howToPlugIn")}
{ct("connectWithUs")}
</h6>
<p className="md:max-w-2xl">{t("howToPlugInDescription")}</p>
<p className="md:max-w-2xl">{ct("connectWithUsDescription")}</p>
</div>
<Link
href={siteConfig.links.discord}

View File

@@ -126,161 +126,163 @@ export default function ProgramsPage({ params: { lang } }: any) {
</div>
</AppContent>
</div>
<div className="flex flex-col">
<div className="w-full border-b border-tuatara-300 py-16">
<div className="container mx-auto flex flex-col md:max-w-2xl">
<div className="flex flex-col gap-8">
<SectionTitle label={t("contributionsProgram.title")} />
<div className="flex flex-col">
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
<Card className="flex flex-col gap-10">
<ProgramDetail
region="LatAm"
title="Contributions Program"
location="Buenos Aires - Cuenca - San Jose"
date="Jul. 22, 2024 - Sep. 15, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
<span>{t("common.applyNow")}</span>
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
<Card className="flex flex-col gap-10">
<ProgramDetail
region="Asia"
title="Contributions Program"
location="Seoul - Taipei - Tokyo"
date="Jul. 29, 2024 - Sep. 22, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
<span>{t("common.applyNow")}</span>
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
</div>
<div className="flex flex-col gap-2 py-16">
{contributionsProgramDescription?.map(
(description, index) => {
return (
<span
key={index}
className="font-sans text-base text-black"
>
{description}
</span>
)
}
)}
</div>
</div>
<AppContent className="relative mx-auto flex gap-5">
<div className="flex w-full flex-col">
<div className="w-full border-b border-tuatara-300 py-10 md:py-16">
<div className="container mx-auto flex flex-col md:max-w-2xl">
<div className="flex flex-col gap-8">
<SectionLabel label={t("common.curriculum")} />
<Card
className="divide-y divide-tuatara-300"
padding="none"
variant="transparent"
>
{curriculum.map(({ title, items }, index) => (
<div
key={index}
className="grid grid-cols-1 divide-tuatara-300 md:grid-cols-[1fr_2.5fr] md:divide-x"
>
<div className="flex items-center justify-center border-b border-tuatara-300 bg-anakiwa-100 p-2 text-center md:border-none">
<span className="text-xs font-bold uppercase tracking-[2.5px] text-tuatara-950">
{t("common.week", {
week: index,
})}
<br />
{title}
</span>
</div>
<div className="px-6 py-2">
<ul className=" list-disc">
{items.map((label: string, index: number) => {
return <li key={index}>{label}</li>
})}
</ul>
</div>
</div>
))}
</Card>
</div>
<div className="flex flex-col gap-8 pt-6">
<SectionLabel label={t("common.faq")} />
<Accordion
className="!border-anakiwa-300"
size="xs"
items={contributionsProgramFaq.map(
({ question, answer }, index) => {
return {
label: (
<span className="font-sans text-base font-semibold text-black">
{question}
<SectionTitle label={t("contributionsProgram.title")} />
<div className="flex flex-col">
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
<Card className="flex flex-col gap-10">
<ProgramDetail
region="LatAm"
title="Contributions Program"
location="Buenos Aires - Cuenca - San Jose"
date="Jul. 22, 2024 - Sep. 15, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
<span>{t("common.applyNow")}</span>
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
<Card className="flex flex-col gap-10">
<ProgramDetail
region="Asia"
title="Contributions Program"
location="Seoul - Taipei - Tokyo"
date="Jul. 29, 2024 - Sep. 22, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
<span>{t("common.applyNow")}</span>
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
</div>
<div className="flex flex-col gap-2 py-10 md:py-16">
{contributionsProgramDescription?.map(
(description, index) => {
return (
<span
key={index}
className="font-sans text-base text-black"
>
{description}
</span>
),
value: `${index}`,
children: answer,
)
}
}
)}
/>
)}
</div>
</div>
<div className="flex flex-col gap-8">
<SectionLabel label={t("common.curriculum")} />
<Card
className="divide-y divide-tuatara-300"
padding="none"
variant="transparent"
>
{curriculum.map(({ title, items }, index) => (
<div
key={index}
className="grid grid-cols-1 divide-tuatara-300 md:grid-cols-[1fr_2.5fr] md:divide-x"
>
<div className="flex items-center justify-center border-b border-tuatara-300 bg-anakiwa-100 p-2 text-center md:border-none">
<span className="text-xs font-bold uppercase tracking-[2.5px] text-tuatara-950">
{t("common.week", {
week: index,
})}
<br />
{title}
</span>
</div>
<div className="py-2">
<ul className="ml-10 list-disc">
{items.map((label: string, index: number) => {
return <li key={index}>{label}</li>
})}
</ul>
</div>
</div>
))}
</Card>
</div>
<div className="flex flex-col gap-8 pt-6">
<SectionLabel label={t("common.faq")} />
<Accordion
className="!border-anakiwa-300"
size="xs"
items={contributionsProgramFaq.map(
({ question, answer }, index) => {
return {
label: (
<span className="font-sans text-base font-semibold text-black">
{question}
</span>
),
value: `${index}`,
children: answer,
}
}
)}
/>
</div>
</div>
</div>
</div>
</div>
<div className="container mx-auto flex flex-col py-16 md:max-w-2xl">
<div className="flex flex-col gap-5">
<SectionTitle label={t("accelerationProgram.title")} />
<Card className="flex flex-col gap-5">
<ProgramDetail
<div className="container mx-auto flex flex-col py-10 md:max-w-2xl md:py-16">
<div className="flex flex-col gap-5">
<SectionTitle label={t("accelerationProgram.title")} />
<Card className="flex flex-col gap-5">
<ProgramDetail
size="xs"
title="Acceleration Program Round 2"
application="Applications Open"
date="Feb. 29, 2024 - May 31, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
{t("common.learnMoreOnGithub")}
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
</div>
<div className="flex flex-col gap-2 py-10 md:py-16">
{accelerationProgramDescription?.map((description, index) => {
return (
<span key={index} className="font-sans text-base text-black">
{description}
</span>
)
})}
</div>
<div className="flex flex-col gap-8">
<SectionLabel label={t("common.faq")} />
<Accordion
className="!border-anakiwa-300"
size="xs"
title="Acceleration Program Round 2"
application="Applications Open"
date="Feb. 29, 2024 - May 31, 2024"
/>
<Button className="uppercase">
<div className="flex items-center gap-3">
{t("common.learnMoreOnGithub")}
<Icons.arrowRight size={20} />
</div>
</Button>
</Card>
</div>
<div className="flex flex-col gap-2 py-16">
{accelerationProgramDescription?.map((description, index) => {
return (
<span key={index} className="font-sans text-base text-black">
{description}
</span>
)
})}
</div>
<div className="flex flex-col gap-8">
<SectionLabel label={t("common.faq")} />
<Accordion
className="!border-anakiwa-300"
size="xs"
items={accelerationProgramFaq.map(
({ question, answer }, index) => {
return {
label: (
<span className="font-sans text-base font-semibold text-black">
{question}
</span>
),
value: `${index}`,
children: answer,
items={accelerationProgramFaq.map(
({ question, answer }, index) => {
return {
label: (
<span className="font-sans text-base font-semibold text-black">
{question}
</span>
),
value: `${index}`,
children: answer,
}
}
}
)}
/>
)}
/>
</div>
</div>
</div>
</div>
</AppContent>
</div>
)
}

View File

@@ -12,7 +12,8 @@
"activity": "Activity",
"report": "Report",
"firstGoodIssue": "First Good Issue",
"programs": "Programs"
"programs": "Programs",
"openIssues": "Open Issues"
},
"footer": {
"description": "Privacy + Scaling Explorations is a multidisciplinary team supported by the Ethereum Foundation.",
@@ -70,5 +71,8 @@
"filters": "Filters",
"whatDoYouWantDoToday": "What do you want to do today?",
"showingProjects": "Showing {{count}} projects",
"showingProjectsWith": "Showing {{count}} projects with:"
}
"showingProjectsWith": "Showing {{count}} projects with:",
"connectWithUs": "Connect with us",
"connectWithUsDescription": "We welcome contributions from around the world! Join our discord to try out apps, build with our tools, contribute to projects, or check out job openings and grant opportunities.",
"ourYearProgram": "Our {{year}} program"
}

View File

@@ -5,5 +5,10 @@
"whoWeAreDescription": "PSE is a research lab building free tools that expand the world of cryptography.",
"howToPlugIn": "How to plug in",
"howToPlugInDescription": "Try out our apps, build with our tools, contribute to projects, or check out our job openings. We welcome contributions from around the world!",
"joinOurDiscord": "Join our community"
"joinOurDiscord": "Join our community",
"recentUpdates": "Recent updates",
"connectWithUs": {
"title": "Join our programs",
"description": "Want to explore the world of programmable cryptography and learn how to make contributions to open-source projects? Join our free programs to start your journey!"
}
}

View File

@@ -71,4 +71,4 @@
"The Acceleration Program supports alumni of our entry level programs (e.g. Contributions Program, ZK Playground) to deepen their explorations of ZKP, FHE, MPC, and related technologies through grants and mentorship. This program operates on a round-based application system, focusing on specific open tasks for each round."
]
}
}
}

View File

@@ -508,4 +508,142 @@ export const Icons = {
/>
</svg>
),
logoWhite: (props: LucideProps) => (
<svg
xmlns="http://www.w3.org/2000/svg"
width={props.size || 134}
height={props.size || 132}
viewBox="0 0 134 132"
fill="none"
>
<path
d="M67.3021 131.683C49.5382 131.683 32.8404 124.834 20.2786 112.399C7.71961 99.9621 0.802086 83.4269 0.802086 65.8416C0.802086 48.2563 7.71961 31.7211 20.2786 19.2837C32.8376 6.84626 49.5382 0 67.3021 0C85.066 0 101.764 6.84903 114.326 19.2837C126.885 31.7183 133.802 48.2535 133.802 65.8416C133.802 83.4296 126.885 99.9621 114.326 112.399C101.767 124.834 85.066 131.683 67.3021 131.683ZM67.3021 3.32477C50.4364 3.32477 34.581 9.82747 22.6544 21.636C10.7278 33.4444 4.16011 49.1429 4.16011 65.8416C4.16011 82.5403 10.7278 98.2387 22.6544 110.047C34.581 121.856 50.4364 128.358 67.3021 128.358C84.1677 128.358 100.023 121.856 111.95 110.047C123.876 98.2387 130.444 82.5403 130.444 65.8416C130.444 49.1429 123.876 33.4444 111.95 21.636C100.023 9.82747 84.1677 3.32477 67.3021 3.32477Z"
fill="#F6F7F7"
/>
<path
d="M19.9007 59.1385L11.0523 57.3127L11.7211 54.1347C12.1856 51.9321 13.6324 50.8404 15.5437 51.2339L15.7367 51.2727C17.6256 51.6633 18.5211 53.2398 18.0594 55.4425L17.8019 56.6699L20.3148 57.188L19.9035 59.1413L19.9007 59.1385ZM13.1707 55.7112L16.0921 56.3152L16.3692 54.9936C16.5623 54.0766 16.1005 53.4088 15.2218 53.2287C14.3208 53.0431 13.6408 53.4726 13.4477 54.3896L13.1707 55.7112Z"
fill="#F6F7F7"
/>
<path
d="M21.8987 50.6853L13.568 47.2164L14.9336 43.9997C15.8039 41.9495 17.2758 41.0573 19.1199 41.8248L19.3018 41.8996C20.5135 42.4038 21.0788 43.2988 21.0732 44.443L24.9125 43.5897L24.0087 45.7203L20.6031 46.3991L20.0322 47.7429L22.6822 48.8456L21.9015 50.6825L21.8987 50.6853ZM15.9214 46.0334L18.5715 47.1361L19.2179 45.6122C19.5565 44.8171 19.2599 44.0718 18.4539 43.7393C17.662 43.4096 16.9064 43.7144 16.5678 44.5095L15.9214 46.0334Z"
fill="#F6F7F7"
/>
<path
d="M25.9927 42.041L18.3448 37.4085L19.3969 35.7073L27.0448 40.3398L25.9927 42.041Z"
fill="#F6F7F7"
/>
<path
d="M29.7537 36.5529L21.1432 32.8956L22.4808 31.3247L29.4403 34.414L29.709 34.0981L25.3547 27.95L26.6532 26.4262L31.8693 34.0732L29.7565 36.5557L29.7537 36.5529Z"
fill="#F6F7F7"
/>
<path
d="M33.7808 31.8289L30.4703 23.0736L33.0084 21.0538L41.0173 26.0687L39.3886 27.3626L37.4298 26.0964L34.5111 28.421L35.3478 30.5793L33.778 31.8289H33.7808ZM35.9551 25.1516L32.9384 23.2011L32.5831 23.4837L33.8787 26.8057L35.9551 25.1516Z"
fill="#F6F7F7"
/>
<path
d="M39.7918 21.7577L39.6686 21.5194C38.6612 19.5578 38.8571 16.8259 41.6247 15.4323C43.8046 14.3351 45.9173 14.8809 47.0871 16.6791L45.2793 17.5878C44.6413 16.7234 43.5583 16.5433 42.4754 17.0891C41.051 17.8067 40.7768 19.2281 41.5491 20.7353C42.3131 22.2204 43.6507 22.841 45.117 22.104C46.2224 21.5471 46.7653 20.5635 46.4462 19.5384L48.2428 18.6351C48.9424 20.4804 48.2596 22.611 45.9705 23.7636C43.0798 25.2182 40.7068 23.5503 39.789 21.7604L39.7918 21.7577Z"
fill="#F6F7F7"
/>
<path
d="M53.5958 20.505L52.6835 17.2605L52.2582 17.3769L48.2453 12.7665L50.2322 12.218L53.0837 15.5981L53.4615 15.4929L53.9596 11.19L55.8401 10.6719L55.0146 16.6177L54.5892 16.7341L55.5015 19.9785L53.5958 20.505Z"
fill="#F6F7F7"
/>
<path
d="M65.1084 17.4489L65.0468 15.1881L62.8753 15.2463L62.8333 13.667L65.0049 13.6088L64.9433 11.3369L66.6867 11.2898L66.7482 13.5617L68.9337 13.5035L68.9757 15.0828L66.7902 15.141L66.8518 17.4018L65.1084 17.4489Z"
fill="#F6F7F7"
/>
<path
d="M74.6702 16.2078L76.5759 16.6261C76.4276 17.2911 76.811 17.9865 78.0479 18.258C79.1392 18.4963 79.8304 18.1638 79.9787 17.4989C80.1046 16.942 79.7213 16.5208 78.6747 16.1911L78.0283 15.9861C76.3101 15.4597 75.4118 14.2406 75.7588 12.6973C76.131 11.035 77.6337 10.2813 79.587 10.7108C81.6493 11.1624 82.6315 12.5616 82.251 14.26L80.3313 13.8389C80.4712 13.2099 80.1298 12.5477 79.2176 12.3482C78.3417 12.1571 77.8016 12.5477 77.6729 13.1185C77.5609 13.6172 77.7932 14.091 78.5851 14.3265L79.2428 14.5343C81.1121 15.1189 82.2538 16.3158 81.8928 17.92C81.5178 19.5935 79.8948 20.3831 77.6757 19.8955C75.2887 19.3718 74.2869 17.8923 74.6646 16.2078H74.6702Z"
fill="#F6F7F7"
/>
<path
d="M84.5428 16.9058L84.6519 16.662C85.5586 14.6533 87.8252 13.0851 90.6627 14.3402C92.893 15.3265 93.7941 17.2965 93.1197 19.3273L91.27 18.51C91.5498 17.4738 91.007 16.529 89.896 16.0386C88.4381 15.393 87.148 16.0746 86.454 17.6179C85.7684 19.1389 86.121 20.5603 87.6237 21.2252C88.7571 21.7267 89.868 21.5245 90.4725 20.6351L92.311 21.4497C91.3036 23.1481 89.1992 23.9626 86.857 22.9264C83.8963 21.6187 83.7144 18.74 84.5428 16.9086V16.9058Z"
fill="#F6F7F7"
/>
<path
d="M91.782 24.9548L99.4719 19.5271L102.097 21.4333L99.2704 30.3908L97.5858 29.169L98.3162 26.9691L95.2939 24.7747L93.4051 26.1323L91.7792 24.952L91.782 24.9548ZM98.859 25.3122L99.984 21.921L99.6174 21.655L96.7099 23.7524L98.859 25.3122Z"
fill="#F6F7F7"
/>
<path
d="M100.46 31.7039L106.994 25.6252L108.373 27.0797L103.129 31.9616L105.536 34.4968L104.246 35.6964L100.46 31.7095V31.7039Z"
fill="#F6F7F7"
/>
<path
d="M105.458 37.3531L112.722 32.1526L113.903 33.7679L106.639 38.9684L105.458 37.3531Z"
fill="#F6F7F7"
/>
<path
d="M108.259 41.094L116.304 37.1735L117.762 40.1076L112.674 46.3139L112.75 46.4663L119.329 43.2606L120.163 44.9424L112.117 48.8629L110.648 45.9066L115.736 39.7004L115.66 39.548L109.081 42.7536L108.256 41.094H108.259Z"
fill="#F6F7F7"
/>
<path
d="M117.107 49.8049L117.37 49.744C119.573 49.2425 122.181 50.2205 122.85 53.102C123.392 55.4376 122.354 57.3826 120.376 58.031L119.925 56.0887C120.846 55.7175 121.291 54.6923 121.017 53.5204C120.664 52.0048 119.31 51.3759 117.681 51.7471C115.968 52.1378 115.064 53.3403 115.448 54.9888C115.652 55.8671 116.142 56.5154 116.766 56.8091L117.496 56.6429L116.97 54.3793L118.383 54.0579L119.489 58.8206L118.076 59.142L117.91 58.4299L116.427 58.768C115.048 58.308 114.065 57.1111 113.665 55.3905C112.946 52.2846 114.941 50.2981 117.107 49.8049Z"
fill="#F6F7F7"
/>
<path
d="M92.0061 67.6784C92.0061 68.5317 91.396 69.2438 90.5817 69.4072C90.467 69.4322 90.3466 69.4433 90.2235 69.4433H84.277C83.292 69.4433 82.4945 70.2329 82.4945 71.2082V77.0958C82.4945 77.7053 82.1838 78.2428 81.7081 78.5587C81.5178 78.6861 81.3024 78.7776 81.0701 78.8247C80.9554 78.8468 80.835 78.8607 80.7119 78.8607H74.7654C73.7804 78.8607 72.9829 79.6503 72.9829 80.6256V86.5132C72.9829 87.4885 72.1853 88.2781 71.2003 88.2781H65.2538C64.2688 88.2781 63.4713 87.4885 63.4713 86.5132V80.6256C63.4713 79.6503 64.2688 78.8607 65.2538 78.8607H71.2003C72.1853 78.8607 72.9829 78.0711 72.9829 77.0958V71.2082C72.9829 70.2329 73.7804 69.4433 74.7654 69.4433H80.7119C81.6969 69.4433 82.4945 68.6536 82.4945 67.6784V60.0258C82.4945 54.8364 78.255 50.6278 73.0164 50.6084C67.7807 50.6278 63.5384 54.8364 63.5384 60.0258V67.6784C63.5384 68.6536 62.7409 69.4433 61.7559 69.4433H55.8094C54.8244 69.4433 54.0268 70.2329 54.0268 71.2082V86.5132C54.0268 87.4885 53.2293 88.2781 52.2443 88.2781H46.2978C45.3128 88.2781 44.5152 87.4885 44.5152 86.5132V71.2082C44.5152 70.2329 45.3128 69.4433 46.2978 69.4433H52.2443C53.2293 69.4433 54.0268 68.6536 54.0268 67.6784V59.9926C54.0268 49.6082 62.5282 41.191 73.0164 41.191C83.5047 41.191 92.0061 49.6082 92.0061 59.9926V67.6784Z"
fill="#F6F7F7"
/>
<path
d="M67.3019 107.265C44.2323 107.265 25.4638 88.6826 25.4638 65.8414C25.4638 43.0002 44.2323 24.4175 67.3019 24.4175C90.3715 24.4175 109.14 43.0002 109.14 65.8414C109.14 88.6826 90.3715 107.265 67.3019 107.265ZM67.3019 26.0799C45.1586 26.0799 27.1428 43.9173 27.1428 65.8414C27.1428 87.7655 45.1586 105.603 67.3019 105.603C89.4453 105.603 107.461 87.7655 107.461 65.8414C107.461 43.9173 89.4453 26.0799 67.3019 26.0799Z"
fill="#F6F7F7"
/>
<path
d="M17.7854 93.7893L25.3577 89.0321L28.3323 93.673L26.922 94.5596L24.9995 91.5617L23.3933 92.5702L25.2094 95.4046L23.799 96.2912L21.9829 93.4568L20.2507 94.5457L22.218 97.6156L20.8076 98.5022L17.7882 93.7893H17.7854Z"
fill="#F6F7F7"
/>
<path
d="M22.3552 100.696L27.8483 99.7596L29.1468 94.8944L30.6383 96.5097L29.7484 99.6544L29.9387 99.8622L33.1652 99.2471L34.6147 100.818L29.5245 101.685L28.1869 107.016L26.687 105.392L27.6496 101.785L27.451 101.569L23.8019 102.267L22.3524 100.696H22.3552Z"
fill="#F6F7F7"
/>
<path
d="M30.5628 109.003L36.0084 101.863L38.6248 103.819C40.4382 105.174 40.8159 106.936 39.6406 108.479L39.5231 108.634C38.3618 110.158 36.5373 110.288 34.7267 108.933L33.7165 108.18L32.169 110.208L30.5628 109.005V109.003ZM36.5652 104.442L34.7659 106.8L35.8545 107.612C36.61 108.177 37.4159 108.047 37.956 107.34C38.5101 106.612 38.4094 105.819 37.6538 105.254L36.5652 104.442Z"
fill="#F6F7F7"
/>
<path
d="M38.8205 114.714L42.9761 106.848L44.7614 107.773L41.4258 114.087L44.5376 115.7L43.7176 117.251L38.8205 114.716V114.714Z"
fill="#F6F7F7"
/>
<path
d="M47.4003 114.248L47.4787 113.993C48.1251 111.888 50.3694 110.109 53.3888 111.02C56.397 111.926 57.2813 114.647 56.6321 116.753L56.5537 117.008C55.9661 118.917 53.7302 120.925 50.6296 119.989C47.5263 119.052 46.8127 116.157 47.4003 114.248ZM54.6397 116.304C55.1266 114.722 54.4634 113.29 52.8403 112.799C51.2201 112.311 49.8741 113.137 49.3872 114.719C48.9282 116.21 49.5551 117.72 51.1781 118.207C52.7984 118.695 54.1835 117.792 54.6397 116.301V116.304Z"
fill="#F6F7F7"
/>
<path
d="M58.9072 121.701L59.6795 112.782L63.1914 113.081C65.4301 113.272 66.7398 114.383 66.5691 116.359L66.5523 116.553C66.4403 117.849 65.7547 118.658 64.6522 119.002L66.653 122.357L64.3276 122.16L62.629 119.16L61.1598 119.035L60.9136 121.87L58.9072 121.698V121.701ZM61.5404 114.638L61.2942 117.473L62.9592 117.614C63.8267 117.689 64.4507 117.179 64.5263 116.32C64.599 115.472 64.0729 114.854 63.2054 114.779L61.5404 114.638Z"
fill="#F6F7F7"
/>
<path
d="M69.0455 122.363L70.9959 113.215L74.2308 112.857L78.2745 121.344L76.1981 121.574L75.2327 119.465L71.508 119.875L71.0463 122.142L69.0455 122.36V122.363ZM74.4995 117.883L73.0108 114.633L72.5602 114.683L71.8522 118.174L74.5023 117.883H74.4995Z"
fill="#F6F7F7"
/>
<path
d="M82.2034 120.262L80.197 113.405L77.7792 114.098L77.2895 112.427L84.0727 110.482L84.5624 112.153L82.1306 112.848L84.137 119.706L82.2034 120.26V120.262Z"
fill="#F6F7F7"
/>
<path
d="M89.3337 117.836L85.7154 109.713L87.5595 108.906L91.1778 117.03L89.3337 117.836Z"
fill="#F6F7F7"
/>
<path
d="M91.9442 112.056L91.7959 111.832C90.5814 109.987 90.6458 107.144 93.293 105.44C95.9263 103.742 98.6015 104.817 99.8132 106.662L99.9615 106.886C101.061 108.557 101.179 111.544 98.4616 113.295C95.7444 115.046 93.044 113.727 91.9442 112.056ZM98.1845 107.887C97.2723 106.501 95.7388 106.083 94.3172 107C92.8984 107.917 92.6718 109.469 93.584 110.854C94.4431 112.159 96.013 112.655 97.4346 111.738C98.8561 110.821 99.0436 109.191 98.1845 107.887Z"
fill="#F6F7F7"
/>
<path
d="M105.22 108.103L98.7694 101.935L101.064 99.5828L108.684 102.22L108.804 102.099L103.529 97.056L104.845 95.7094L111.295 101.874L108.983 104.246L101.364 101.608L101.243 101.73L106.518 106.773L105.222 108.103H105.22Z"
fill="#F6F7F7"
/>
<path
d="M111.071 97.6686L112.118 96.0367C112.697 96.4025 113.489 96.2805 114.169 95.2222C114.768 94.2885 114.687 93.5321 114.105 93.1664C113.618 92.8588 113.086 93.0749 112.417 93.9366L112.003 94.4685C110.917 95.8899 109.454 96.3083 108.108 95.4604C106.655 94.5489 106.451 92.8921 107.526 91.2186C108.659 89.4537 110.321 89.0159 111.804 89.9469L110.752 91.5898C110.204 91.2435 109.459 91.3377 108.958 92.119C108.477 92.8671 108.665 93.5044 109.163 93.8174C109.599 94.0917 110.128 94.0363 110.621 93.3797L111.04 92.8366C112.232 91.2962 113.758 90.6423 115.157 91.5206C116.617 92.4404 116.816 94.2192 115.596 96.1199C114.286 98.1618 112.54 98.5913 111.068 97.6659L111.071 97.6686Z"
fill="#F6F7F7"
/>
<path
d="M116.75 74.0574L116.213 76.6635C116.124 77.0938 116.405 77.5138 116.839 77.6017L119.471 78.1338C119.906 78.2216 120.33 77.944 120.419 77.5137L120.956 74.9077C121.045 74.4774 120.765 74.0574 120.33 73.9695L117.698 73.4374C117.263 73.3496 116.839 73.6272 116.75 74.0574Z"
fill="#F6F7F7"
/>
<path
d="M16.9091 73.4369L14.277 73.969C13.8424 74.0568 13.562 74.4769 13.6507 74.9071L14.1882 77.5132C14.2769 77.9435 14.7011 78.2211 15.1357 78.1332L17.7678 77.6011C18.2024 77.5133 18.4828 77.0932 18.3941 76.6629L17.8566 74.0569C17.7679 73.6266 17.3437 73.349 16.9091 73.4369Z"
fill="#F6F7F7"
/>
</svg>
),
}

View File

@@ -6,6 +6,7 @@ import { usePathname } from "next/navigation"
import PSELogo from "@/public/logos/header-logo.svg"
import { NavItem } from "@/types/nav"
import { cn } from "@/lib/utils"
import { LocaleTypes, fallbackLng } from "@/app/i18n/settings"
export interface MainNavProps {
@@ -25,16 +26,32 @@ export function MainNav({ items, lang = fallbackLng }: MainNavProps) {
{items.map((item, index) => {
if (item?.onlyFooter) return null
// if (item.href.includes("http")) return
const langKey = `/${lang}`
const pathParts = item.href
.replace(langKey, "")
.split("/")
.filter(Boolean)
const isHome = router === "/" && item.href === "/"
// is home or the first part of the path matches the first part of the href
const isActive =
isHome ||
(router !== null &&
pathParts[0] === router.replace(langKey, "").split("/")[1])
return (
<Link
key={index}
href={item.href}
target={item.external ? "_blank" : undefined}
className={`uppercase ${
item.disabled && "cursor-not-allowed"
} flex items-center border-b-2 ${
item.href !== router ? "border-transparent" : "border-orange"
} text-sm font-medium duration-200 ease-in-out hover:border-orange`}
className={cn("flex items-center border-b-2 uppercase", {
"cursor-not-allowed": item.disabled,
"border-transparent": item.href !== router,
"!border-orange": item.href === router || isActive,
"text-sm font-medium duration-200 ease-in-out hover:border-orange":
true,
})}
>
{item.title}
</Link>

View File

@@ -0,0 +1,64 @@
import Image from "next/image"
import Link from "next/link"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes } from "@/app/i18n/settings"
import { Card } from "../cards/card"
import { Icons } from "../icons"
import { AppContent } from "../ui/app-content"
import { Button } from "../ui/button"
interface ConnectWithUsProps {
lang: LocaleTypes
}
const ConnectWithUs = ({ lang }: ConnectWithUsProps) => {
const { t } = useTranslation(lang, "homepage")
const { t: common } = useTranslation(lang, "common")
return (
<div className="bg-white py-14 md:pb-32 md:pt-16">
<div className="flex flex-col gap-10">
<h3 className="text-center font-sans text-base font-bold uppercase tracking-[3.36px]">
{common("ourYearProgram", {
year: new Date().getFullYear(),
})}
</h3>
<AppContent>
<Card className="!px-10 !py-16">
<div className="bg-radial-gradient grid grid-cols-1 gap-8 md:grid-cols-[2fr_1fr] md:gap-4">
<div className="flex flex-col gap-8 text-center md:text-left">
<h3 className="text-4xl md:text-5xl">
{t("connectWithUs.title")}
</h3>
<span> {t("connectWithUs.description")}</span>
<div>
<Link href="/programs">
<Button className="w-full md:w-auto">
<div className="flex items-center gap-2">
<span className="uppercase">{common("learnMore")}</span>
<Icons.arrowRight size={20} />
</div>
</Button>
</Link>
</div>
</div>
<Image
width={280}
height={280}
className="mx-auto h-[148px] w-[190px] lg:ml-auto lg:h-[247px] lg:w-[320px]"
src="/images/computer.png"
alt="computer image"
/>
</div>
</Card>
</AppContent>
</div>
</div>
)
}
ConnectWithUs.displayName = "ConnectWithUs"
export { ConnectWithUs }

View File

@@ -48,7 +48,7 @@ export const WhatWeDo = ({ lang }: LangProps["params"]) => {
<div className="grid grid-cols-1 gap-8 lg:grid-cols-3">
{content.map((item, index) => (
<article
className="flex flex-col gap-2 rounded-[6px] bg-white/30 px-8 py-4"
className="flex flex-col gap-2 rounded-[6px] border border-tuatara-300 bg-white px-8 py-4"
key={index}
>
<div className="flex items-center gap-2">

View File

@@ -1,8 +1,6 @@
"use client"
import Image from "next/image"
import Link from "next/link"
import PSELogo from "@/public/logos/pse-logo-circle.svg"
import { LangProps } from "@/types/common"
import { NavItem } from "@/types/nav"
@@ -32,116 +30,120 @@ export function SiteFooter({ lang }: LangProps["params"]) {
return (
<footer className="flex flex-col">
<div className="flex flex-col divide-y divide-tuatara-200 px-8">
<div className="flex w-full flex-col items-center gap-5 py-8">
<Image src={PSELogo} alt="logo" width={133} height={133} />
<h1 className="py-2 text-center font-sans text-sm font-normal text-tuatara-950">
{t("footer.description")}
</h1>
</div>
</div>
<div className="bg-tuatara-950 py-8 text-left text-[14px] uppercase text-white">
<AppContent className="grid grid-cols-1 justify-between gap-8 bg-tuatara-950 py-2 text-white md:grid-cols-4 lg:px-40">
<LinksWrapper>
{MAIN_NAV.map(
({ title, href, external = false }: NavItem, indexKey) => (
<Link
key={indexKey}
href={href}
target={external ? "_blank" : undefined}
>
{title}
</Link>
)
)}
</LinksWrapper>
<LinksWrapper>
<Link
href={siteConfig.links.jobs}
target="_blank"
rel="noreferrer"
className="flex items-center gap-2"
>
<Icons.jobs fill="white" />
{t("menu.jobs")}
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.discord}
className="flex items-start gap-2"
target="_blank"
rel="noreferrer"
>
<Icons.discord className="w-4" />
<SocialMedia label="Discord" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.github}
className="flex items-start gap-2"
target="_blank"
rel="noreferrer"
>
<Icons.gitHub className="w-4" color="white" />
<SocialMedia label="Github" />
<Icons.externalUrl className="w-5" />
</Link>
</LinksWrapper>
<LinksWrapper>
<Link
href={siteConfig.links.twitter}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.twitter className="w-full" color="white" />
</div>
<SocialMedia label="Twitter" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.articles}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.mirror className="w-full" color="white" />
</div>
<div className="bg-tuatara-950 py-8 text-left text-[14px] text-white">
<AppContent className="grid grid-cols-1 justify-between gap-8 bg-tuatara-950 py-2 text-white md:grid-cols-[2fr_3fr]">
<div className="order-2 flex flex-col items-center gap-4 md:order-1 md:flex-row">
<Icons.logoWhite size={134} />
<span className="text-sm text-white">
{t("footer.description")}
</span>
</div>
<div className="order-1 grid grid-cols-1 gap-8 uppercase md:order-2 md:grid-cols-4">
<LinksWrapper>
{MAIN_NAV.filter((item) => item.order === 1).map(
({ title, href, external = false }: NavItem, indexKey) => (
<Link
key={indexKey}
href={href}
target={external ? "_blank" : undefined}
>
{title}
</Link>
)
)}
</LinksWrapper>
<LinksWrapper>
{MAIN_NAV.filter((item) => item.order === 2).map(
({ title, href, external = false }: NavItem, indexKey) => (
<Link
key={indexKey}
href={href}
target={external ? "_blank" : undefined}
>
<div className="flex items-center gap-2">
<span> {title}</span>
<Icons.externalUrl className="w-5" />
</div>
</Link>
)
)}
</LinksWrapper>
<LinksWrapper>
<Link
href={siteConfig.links.twitter}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.twitter className="w-full" color="white" />
</div>
<SocialMedia label="Twitter" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.discord}
className="flex items-start gap-2"
target="_blank"
rel="noreferrer"
>
<Icons.discord className="w-4" />
<SocialMedia label="Discord" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.github}
className="flex items-start gap-2"
target="_blank"
rel="noreferrer"
>
<Icons.gitHub className="w-4" color="white" />
<SocialMedia label="Github" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.articles}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.mirror className="w-full" color="white" />
</div>
<SocialMedia label="Mirror" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.youtube}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.youtube className="w-full" color="white" />
</div>
<SocialMedia label="Youtube" />
<Icons.externalUrl className="w-5" />
</Link>
</LinksWrapper>
<LinksWrapper>
<Link
href={siteConfig.links.privacyPolicy}
target="_blank"
rel="noreferrer"
>
<span>{t("footer.privacyPolicy")}</span>
</Link>
<Link
href={siteConfig.links.termOfUse}
target="_blank"
rel="noreferrer"
>
<span>{t("footer.termsOfUse")}</span>
</Link>
</LinksWrapper>
<SocialMedia label="Mirror" />
<Icons.externalUrl className="w-5" />
</Link>
<Link
href={siteConfig.links.youtube}
className="flex items-center gap-2"
target="_blank"
rel="noreferrer"
>
<div className="w-4">
<Icons.youtube className="w-full" color="white" />
</div>
<SocialMedia label="Youtube" />
<Icons.externalUrl className="w-5" />
</Link>
</LinksWrapper>
<LinksWrapper>
<Link
href={siteConfig.links.privacyPolicy}
target="_blank"
rel="noreferrer"
>
<span>{t("footer.privacyPolicy")}</span>
</Link>
<Link
href={siteConfig.links.termOfUse}
target="_blank"
rel="noreferrer"
>
<span>{t("footer.termsOfUse")}</span>
</Link>
</LinksWrapper>
</div>
</AppContent>
</div>
</footer>

View File

@@ -1,6 +1,7 @@
import { MainNavProps } from "@/components/main-nav"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes, fallbackLng, languageList } from "@/app/i18n/settings"
import { MainNavProps } from "@/components/main-nav"
import { siteConfig } from "@/config/site"
export function useAppSettings(lang: LocaleTypes) {
const { t } = useTranslation(lang, "common")
@@ -14,45 +15,60 @@ export function useAppSettings(lang: LocaleTypes) {
{
title: t("menu.home"),
href: "/",
order: 1,
},
{
title: t("menu.projectLibrary"),
href: "/projects",
order: 1,
},
{
title: t("menu.programs"),
href: "/programs",
order: 1,
},
{
title: t("menu.about"),
href: "/about",
order: 1,
},
{
title: t("menu.resources"),
href: "/resources",
order: 1,
},
{
title: t("menu.jobs"),
href: siteConfig.links.jobs,
external: true,
order: 2,
},
{
title: t("menu.blog"),
href: "https://mirror.xyz/privacy-scaling-explorations.eth",
external: true,
order: 2,
},
{
title: t("menu.activity"),
href: "https://pse-team.notion.site/50dcf22c5191485e93406a902ae9e93b?v=453023f8227646dd949abc34a7a4a138&pvs=4",
external: true,
onlyFooter: true,
order: 2,
},
{
title: t("menu.report"),
href: "https://reports.pse.dev/",
external: true,
onlyFooter: true,
order: 2,
},
{
title: t("menu.firstGoodIssue"),
title: t("menu.openIssues"),
href: "https://pse-gfis.vercel.app",
external: true,
onlyFooter: true,
order: 2,
},
]

View File

@@ -4,4 +4,5 @@ export interface NavItem {
disabled?: boolean
external?: boolean
onlyFooter?: boolean
order?: number // user for footer column order
}