)}
-
+
{tags?.themes?.map((theme, index) => {
@@ -94,21 +99,30 @@ export default function ProjectCard({
})}
{name}
-
{tldr}
-
- {showLinks && (
-
- {Object.entries(links ?? {})?.map(([website, url], index) => {
- return (
-
- )
- })}
+
- )}
+
+
+ {showLinks && (
+
+ {Object.entries(links ?? {})?.map(([website, url], index) => {
+ return (
+
+ )
+ })}
+
+ )}
+ {projectNotActive && (
+
+ {t("notCurrentlyActive")}
+
+ )}
+
)
diff --git a/components/project/project-detail-tags.tsx b/components/project/project-detail-tags.tsx
index 6e10c8f..cde29fc 100644
--- a/components/project/project-detail-tags.tsx
+++ b/components/project/project-detail-tags.tsx
@@ -7,7 +7,7 @@ import {
ProjectFilter,
} from "@/state/useProjectFiltersState"
-import { ProjectInterface } from "@/lib/types"
+import { ProjectInterface, ProjectSectionLabelMapping } from "@/lib/types"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes } from "@/app/i18n/settings"
@@ -20,7 +20,7 @@ interface TagsProps extends HtmlHTMLAttributes
{
const TagsWrapper = ({ label, children }: TagsProps) => {
return (
-
+
{label}
{children}
@@ -72,6 +72,13 @@ export function ProjectTags({ project, lang }: IProjectTags) {
+
+
+
+ {ProjectSectionLabelMapping[project?.section]}
+
+
+
)
}
diff --git a/components/project/project-filters-bar.tsx b/components/project/project-filters-bar.tsx
index b4e31ab..123e081 100644
--- a/components/project/project-filters-bar.tsx
+++ b/components/project/project-filters-bar.tsx
@@ -15,6 +15,12 @@ import i18next from "i18next"
import { useDebounce } from "react-use"
import { IThemeStatus, IThemesButton, LangProps } from "@/types/common"
+import {
+ ProjectSectionLabelMapping,
+ ProjectSections,
+ ProjectStatusLabelMapping,
+ ProjectStatusList,
+} from "@/lib/types"
import { cn, queryStringToObject } from "@/lib/utils"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes } from "@/app/i18n/settings"
@@ -30,11 +36,12 @@ import { Modal } from "../ui/modal"
interface FilterWrapperProps {
label: string
children?: ReactNode
+ className?: string
}
-const FilterWrapper = ({ label, children }: FilterWrapperProps) => {
+const FilterWrapper = ({ label, children, className }: FilterWrapperProps) => {
return (
-
+
{label}
{children}
@@ -68,7 +75,7 @@ export const ThemesStatusMapping = (lang: LocaleTypes): IThemeStatus => {
label: t("status.active"),
icon:
,
},
- archived: {
+ inactive: {
label: t("status.inactive"),
icon:
,
},
@@ -190,83 +197,103 @@ export default function ProjectFiltersBar({ lang }: LangProps["params"]) {
open={showModal}
setOpen={setShowModal}
>
- {Object.entries(filters).map(([key, items]) => {
- const filterLabel =
- FilterLabelMapping(lang)?.[key as ProjectFilter] ?? ""
- const type = FilterTypeMapping?.[key as ProjectFilter]
- const hasItems = items.length > 0
+
+ {Object.entries(filters).map(([key, items]) => {
+ const filterLabel =
+ FilterLabelMapping(lang)?.[key as ProjectFilter] ?? ""
+ const type = FilterTypeMapping?.[key as ProjectFilter]
+ const hasItems = items.length > 0
- const hasActiveThemeFilters =
- (activeFilters?.themes ?? [])?.length > 0
+ const hasActiveThemeFilters =
+ (activeFilters?.themes ?? [])?.length > 0
- if (key === "themes" && !hasActiveThemeFilters) return null
+ if (key === "themes" && !hasActiveThemeFilters) return null
- return (
- hasItems && (
-
-
- {items.map((item) => {
- const isActive =
- activeFilters?.[key as ProjectFilter]?.includes(item)
+ return (
+ hasItems && (
+
+
+ {items.map((item) => {
+ const isActive =
+ activeFilters?.[key as ProjectFilter]?.includes(item)
- if (type === "checkbox") {
- return (
-
- toggleFilter({
- tag: key as ProjectFilter,
- value: item,
- searchQuery,
- })
- }
- name={item}
- label={item}
- checked={isActive}
- />
- )
- }
-
- if (type === "button") {
- const { icon, label } = ThemesButtonMapping(lang)[item]
- if (!isActive) return null
- return (
-
-
{
+ if (type === "checkbox") {
+ return (
+
toggleFilter({
- tag: "themes",
+ tag: key as ProjectFilter,
value: item,
searchQuery,
})
- }}
- >
-
- {icon}
-
- {label}
-
-
-
-
- )
- }
+ }
+ name={item}
+ label={item}
+ checked={isActive}
+ />
+ )
+ }
- return null
- })}
-
-
+ if (type === "button") {
+ const { icon, label } = ThemesButtonMapping(lang)[item]
+ if (!isActive) return null
+ return (
+
+
{
+ toggleFilter({
+ tag: "themes",
+ value: item,
+ searchQuery,
+ })
+ }}
+ >
+
+ {icon}
+
+ {label}
+
+
+
+
+ )
+ }
+
+ return null
+ })}
+
+
+ )
)
- )
- })}
+ })}
+
+ {ProjectSections.map((section) => {
+ const label = ProjectSectionLabelMapping[section]
+ return
+ })}
+
+
+ {ProjectStatusList.map((section) => {
+ const label = ProjectStatusLabelMapping[section]
+ return
+ })}
+
+
{t("whatDoYouWantDoToday")}
diff --git a/components/project/project-link.tsx b/components/project/project-link.tsx
index ffadbee..e8a81d5 100644
--- a/components/project/project-link.tsx
+++ b/components/project/project-link.tsx
@@ -25,15 +25,13 @@ export function ProjectLink({ website, url }: ProjectLinkProps) {
target="_blank"
rel="noopener noreferrer"
>
-
-
-
+
)
}
diff --git a/components/project/project-list.tsx b/components/project/project-list.tsx
index 25d0fee..3875599 100644
--- a/components/project/project-list.tsx
+++ b/components/project/project-list.tsx
@@ -7,7 +7,11 @@ import { useProjectFiltersState } from "@/state/useProjectFiltersState"
import { cva } from "class-variance-authority"
import { LangProps } from "@/types/common"
-import { ProjectSection, ProjectSections } from "@/lib/types"
+import {
+ ProjectSection,
+ ProjectSectionLabelMapping,
+ ProjectSections,
+} from "@/lib/types"
import { cn } from "@/lib/utils"
import { useTranslation } from "@/app/i18n/client"
@@ -35,12 +39,6 @@ const NoResults = ({ lang }: LangProps["params"]) => {
)
}
-const ProjectSectionLabelMapping: Record
= {
- pse: "PSE projects",
- grant: "Grants",
- collaboration: "Collaborations",
-}
-
export const ProjectList = ({ lang }: LangProps["params"]) => {
const { t } = useTranslation(lang, "resources-page")
const SCROLL_OFFSET = -400
@@ -92,8 +90,8 @@ export const ProjectList = ({ lang }: LangProps["params"]) => {
if (noItems) return
return (
-
-
+
+
{ProjectSections.map((section) => {
const sectionProjects =
projects.filter(
@@ -118,13 +116,13 @@ export const ProjectList = ({ lang }: LangProps["params"]) => {
{sectionTitle}
-
+
{sectionProjects.map((project) => (
{
{t("recentUpdates")}
-
+
{!loading ? (
diff --git a/components/sections/WhatWeDo.tsx b/components/sections/WhatWeDo.tsx
index 6e9ebb5..d607a52 100644
--- a/components/sections/WhatWeDo.tsx
+++ b/components/sections/WhatWeDo.tsx
@@ -34,8 +34,8 @@ export const WhatWeDo = ({ lang }: LangProps["params"]) => {
]
return (
- <>
-
+
+
@@ -48,7 +48,7 @@ export const WhatWeDo = ({ lang }: LangProps["params"]) => {
{content.map((item, index) => (
@@ -65,6 +65,6 @@ export const WhatWeDo = ({ lang }: LangProps["params"]) => {
- >
+
)
}
diff --git a/components/site-footer.tsx b/components/site-footer.tsx
index 11bff7e..1a8148a 100644
--- a/components/site-footer.tsx
+++ b/components/site-footer.tsx
@@ -1,22 +1,37 @@
"use client"
+import Image from "next/image"
import Link from "next/link"
-import { useTranslation } from "@/app/i18n/client"
-import { siteConfig } from "@/config/site"
-import { useAppSettings } from "@/hooks/useAppSettings"
-import { cn } from "@/lib/utils"
import { LangProps } from "@/types/common"
import { NavItem } from "@/types/nav"
+import { siteConfig } from "@/config/site"
+import { cn } from "@/lib/utils"
+import { useAppSettings } from "@/hooks/useAppSettings"
+import { useTranslation } from "@/app/i18n/client"
import { Icons } from "./icons"
import { AppContent } from "./ui/app-content"
-const SocialMedia = ({ label }: { label: string }) => {
+const ItemLabel = ({
+ label,
+ external = false,
+ icon,
+}: {
+ label: string
+ external?: boolean
+ icon?: React.ReactNode
+}) => {
return (
-
- {label}
-
+
+ {external && (
+
+ )}
+ {icon &&
{icon}
}
+
+ {label}
+
+
)
}
@@ -38,139 +53,143 @@ export function SiteFooter({ lang }: LangProps["params"]) {
return (
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
index 9ea054a..a60b4ba 100644
--- a/components/ui/label.tsx
+++ b/components/ui/label.tsx
@@ -1,5 +1,21 @@
+import { cn } from "@/lib/utils"
+
interface LabelProps {
label: React.ReactNode
+ className?: string
+}
+
+const SectionTitle = ({ label, className = "" }: LabelProps) => {
+ return (
+
+ {label}
+
+ )
}
const MainPageTitle = ({ label }: LabelProps) => {
@@ -13,6 +29,7 @@ const MainPageTitle = ({ label }: LabelProps) => {
const Label = {
displayName: "Label",
PageTitle: MainPageTitle,
+ Section: SectionTitle,
}
export { Label }
diff --git a/config/site.ts b/config/site.ts
index db28d08..0cc04ac 100644
--- a/config/site.ts
+++ b/config/site.ts
@@ -16,6 +16,10 @@ export const siteConfig = {
jobs: "https://jobs.lever.co/ethereumfoundation/?department=Ethereum%20Foundation&team=Privacy%20and%20Scaling%20Explorations",
termOfUse: "https://ethereum.org/en/terms-of-use/",
privacyPolicy: "https://ethereum.org/en/privacy-policy/",
+ activity:
+ "https://pse-team.notion.site/50dcf22c5191485e93406a902ae9e93b?v=453023f8227646dd949abc34a7a4a138&pvs=4",
+ report: "https://reports.pse.dev/",
+ firstGoodIssue: "https://pse-gfis.vercel.app",
discordAnnouncementChannel:
"https://discord.com/channels/943612659163602974/969614451089227876",
accelerationGithub:
diff --git a/data/projects/channel-4.ts b/data/projects/channel-4.ts
index 96ebc93..d813fe4 100644
--- a/data/projects/channel-4.ts
+++ b/data/projects/channel-4.ts
@@ -7,7 +7,7 @@ Channel 4 is a community-driven platform where users can submit and discover con
export const channel4: ProjectInterface = {
id: "channel-4",
section: "pse",
- projectStatus: "archived",
+ projectStatus: "inactive",
image: "channel4.svg",
name: "Channel 4",
tldr: "Content discovery through community contributions, using state channels to reward users for popular posts.",
diff --git a/data/projects/coco.ts b/data/projects/coco.ts
index 2aa052e..2a0f74b 100644
--- a/data/projects/coco.ts
+++ b/data/projects/coco.ts
@@ -8,7 +8,7 @@ export const Coco: ProjectInterface = {
tldr: "Integrating Nova into the EVM involves wrapping Liam Eagen's theoretical ECIP argument in Halo 2",
description:
"With Coco, groups can collaborate to curate feeds of any topic they're interested in. As you scroll through your Coco feed, rather than upvoting or downvoting posts, you'll spend WETH to predict what other group members and the group's moderators will want to see. When you're right, you'll get back your original WETH and more — but if you're wrong, you'll lose what you put in. Through this process, you help Coco filter value from noise to make sure group feeds only consist of posts that the group cares about.",
- projectStatus: "archived",
+ projectStatus: "inactive",
tags: {
keywords: ["prediction market", "scaling"],
},
diff --git a/data/projects/cryptkeeper.ts b/data/projects/cryptkeeper.ts
index 26aed06..91fcfc4 100644
--- a/data/projects/cryptkeeper.ts
+++ b/data/projects/cryptkeeper.ts
@@ -7,7 +7,7 @@ CryptKeeper is a browser extension that generates Semaphore and RLN proofs for w
export const cryptkeeper: ProjectInterface = {
id: "cryptkeeper",
section: "pse",
- projectStatus: "archived",
+ projectStatus: "inactive",
image: "cryptkeeper.webp",
name: "CryptKeeper",
tldr: "A browser extension for secure, portable anonymous identity management across applications.",
diff --git a/data/projects/eigen-trust.ts b/data/projects/eigen-trust.ts
index fae4c29..b5af93f 100644
--- a/data/projects/eigen-trust.ts
+++ b/data/projects/eigen-trust.ts
@@ -7,7 +7,7 @@ EigenTrust is a library designed to manage trust within a distributed network, i
export const eigenTrust: ProjectInterface = {
id: "eigen-trust",
section: "pse",
- projectStatus: "archived",
+ projectStatus: "inactive",
image: "",
name: "EigenTrust",
tldr: "A distributed reputation system with zero-knowledge features.",
diff --git a/data/projects/interep.ts b/data/projects/interep.ts
index 0f4bc57..f8958cc 100644
--- a/data/projects/interep.ts
+++ b/data/projects/interep.ts
@@ -8,7 +8,7 @@ export const Interep: ProjectInterface = {
tldr: "An identity bridge from web2 to web3",
description:
"Interep aims to provide an identity solution for Ethereum users by bridging from an established digital identity source such as Reddit, Twitter, and Github. The product provides an identity layer in the application stack and uses the Semaphore framework to ensure privacy. Interep allows users to establish sybil-resistant decentralized identities on web3 without starting from scratch. By leveraging zero-knowledge proofs, Interep ensures only essential information is disclosed.",
- projectStatus: "archived",
+ projectStatus: "inactive",
tags: {
keywords: ["social", "reputation"],
},
diff --git a/data/projects/unirep-protocol.ts b/data/projects/unirep-protocol.ts
index c05d28c..a292234 100644
--- a/data/projects/unirep-protocol.ts
+++ b/data/projects/unirep-protocol.ts
@@ -9,7 +9,7 @@ Using anonymous identifiers (epoch keys), the protocol allows for trustless enga
export const unirepProtocol: ProjectInterface = {
id: "unirep-protocol",
section: "pse",
- projectStatus: "archived",
+ projectStatus: "inactive",
image: "unirep.svg",
name: "UniRep Protocol",
tldr: "A Zero-Knowledge Protocol built to handle anonymous user data.",
@@ -26,22 +26,22 @@ export const unirepProtocol: ProjectInterface = {
types: ["Legos/dev tools, Protocol"],
builtWith: ["semaphore", "circom"],
},
- extraLinks: {
+ extraLinks: {
buildWith: [
{
label: "Getting Started with create-unirep-app",
- url: 'https://developer.unirep.io/docs/next/getting-started/create-unirep-app',
+ url: "https://developer.unirep.io/docs/next/getting-started/create-unirep-app",
},
],
play: [
{
label: "Try it out: UniRep.social (Staging)",
- url: 'https://social-staging.unirep.workers.dev',
+ url: "https://social-staging.unirep.workers.dev",
},
{
label: "Try it out: Trustlist (coming soon) ",
- url: 'https://trustlist.pse.dev',
- }
+ url: "https://trustlist.pse.dev",
+ },
],
},
}
diff --git a/data/projects/zkitter.ts b/data/projects/zkitter.ts
index f16914c..b2d32c0 100644
--- a/data/projects/zkitter.ts
+++ b/data/projects/zkitter.ts
@@ -7,7 +7,7 @@ Zkitter is a decentralized social network that emphasizes privacy by default. It
export const zkitter: ProjectInterface = {
id: "zkitter",
section: "pse",
- projectStatus: "archived",
+ projectStatus: "inactive",
image: "zkitter.webp",
name: "Zkitter",
tldr: "A decentralized social network prioritizing privacy and anonymity",
diff --git a/data/projects/zkopru.ts b/data/projects/zkopru.ts
index 5c06bb0..f82744c 100644
--- a/data/projects/zkopru.ts
+++ b/data/projects/zkopru.ts
@@ -8,7 +8,7 @@ export const Zkopru: ProjectInterface = {
tldr: "Optimistic Rollup with zk-SNARKs for private Ethereum transactions.",
description:
"ZKOPRU is one of the initial projects of EF's PSE team. It is a Layer 2 scaling solution for Ethereum, emphasizing private transactions through zk-SNARKs and optimistic rollups. It provides an economical Ethereum privacy wallet, enabling users to transact with ETH, ERC-20s, and NFTs anonymously",
- projectStatus: "archived",
+ projectStatus: "inactive",
links: {
website: "https://zkopru.network/",
github: "https://github.com/zkopru-network",
diff --git a/hooks/useAppSettings.ts b/hooks/useAppSettings.ts
index 87a7be2..3cdb6de 100644
--- a/hooks/useAppSettings.ts
+++ b/hooks/useAppSettings.ts
@@ -1,7 +1,7 @@
+import { siteConfig } from "@/config/site"
+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")
@@ -15,60 +15,28 @@ export function useAppSettings(lang: LocaleTypes) {
{
title: t("menu.home"),
href: "/",
- order: 1,
+ onlyMobile: true,
},
{
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.openIssues"),
- href: "https://pse-gfis.vercel.app",
- external: true,
- onlyFooter: true,
- order: 2,
},
]
diff --git a/lib/types.ts b/lib/types.ts
index 40ffe72..5b510cc 100644
--- a/lib/types.ts
+++ b/lib/types.ts
@@ -9,6 +9,18 @@ export interface Faq {
answer: ReactNode
}
+export const ProjectStatusList = ["active", "inactive"] as const
+export type ProjectStatusType = (typeof ProjectStatusList)[number]
+
+export const ProjectSectionLabelMapping: Record = {
+ pse: "PSE projects",
+ grant: "Grants",
+ collaboration: "Collaborations",
+}
+export const ProjectStatusLabelMapping: Record = {
+ active: "Active",
+ inactive: "Not Currently Active",
+}
export interface AnnounceInterface {
id: number
type?: number
@@ -42,7 +54,12 @@ export type ProjectLinkWebsite =
export type ProjectLinkType = Partial>
export type ProjectExtraLinkType = "buildWith" | "play" | "research" | "learn"
-export type TagType = "types" | "themes" | "builtWith" | "keywords"
+export type TagType =
+ | "types"
+ | "themes"
+ | "builtWith"
+ | "keywords"
+ | "fundingSource"
export type ProjectTags = Partial>
export type ActionLinkTypeLink = {
label: string
@@ -52,7 +69,6 @@ export type ActionLinkType = Partial<
Record>
>
-export type ProjectStatusType = "active" | "inactive" | "archived"
export interface ProjectInterface {
id: string
section: ProjectSection
diff --git a/public/icons/lens.webp b/public/icons/lens.webp
new file mode 100644
index 0000000..73fd547
Binary files /dev/null and b/public/icons/lens.webp differ
diff --git a/public/icons/resource-illustration.webp b/public/icons/resource-illustration.webp
new file mode 100644
index 0000000..75f55b2
Binary files /dev/null and b/public/icons/resource-illustration.webp differ
diff --git a/public/images/lens.svg b/public/images/lens.svg
new file mode 100644
index 0000000..7530104
--- /dev/null
+++ b/public/images/lens.svg
@@ -0,0 +1,9 @@
+
diff --git a/public/logos/pse-logo-circle-white.svg b/public/logos/pse-logo-circle-white.svg
new file mode 100644
index 0000000..d81ef95
--- /dev/null
+++ b/public/logos/pse-logo-circle-white.svg
@@ -0,0 +1,34 @@
+
diff --git a/public/social-medias/github-fill.svg b/public/social-medias/github-fill.svg
index 691c786..e5ca733 100644
--- a/public/social-medias/github-fill.svg
+++ b/public/social-medias/github-fill.svg
@@ -1,10 +1,10 @@
-