diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml index f0cfa2dfb8..1cc9559893 100644 --- a/.github/workflows/typos.yml +++ b/.github/workflows/typos.yml @@ -16,6 +16,6 @@ jobs: steps: - uses: actions/checkout@v4 - name: Use typos with config file - uses: crate-ci/typos@v1.24.3 + uses: crate-ci/typos@v1.24.5 with: config: .github/workflows/config/typos.toml diff --git a/apps/website/package.json b/apps/website/package.json index 0cb911b7a5..c57ac928cf 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -29,7 +29,7 @@ "docusaurus-plugin-image-zoom": "^2.0.0", "docusaurus-plugin-matomo": "^0.0.8", "gray-matter": "^4.0.3", - "prism-react-renderer": "^2.3.1", + "prism-react-renderer": "^2.4.0", "react": "^18.3.1", "react-dom": "^18.3.1", "rehype-katex": "^7.0.1", diff --git a/apps/website/src/components/ActionCard/index.tsx b/apps/website/src/components/ActionCard/index.tsx new file mode 100644 index 0000000000..8f4bd30f72 --- /dev/null +++ b/apps/website/src/components/ActionCard/index.tsx @@ -0,0 +1,30 @@ +import styles from "./styles.module.css"; + +interface ActionCardProps { + title: string; + description: string; + buttonText: string; + buttonUrl: string; +} + +const ActionCard: React.FC = ({ buttonText, buttonUrl, description, title }: ActionCardProps) => ( +
+
+
+
+

{title}

+ +

{description}

+
+ +
+ + {buttonText} + +
+
+
+
+); + +export default ActionCard; diff --git a/apps/website/src/components/ActionCard/styles.module.css b/apps/website/src/components/ActionCard/styles.module.css new file mode 100644 index 0000000000..b91840698d --- /dev/null +++ b/apps/website/src/components/ActionCard/styles.module.css @@ -0,0 +1,96 @@ +.actionCard { + background-color: #1a202c; /* darkBlue */ + color: white; + border-radius: 24px; + width: 100%; + padding: 64px 32px; +} + +.actionCardBody { + padding: 0; +} + +.actionCardContent { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + gap: 2rem; +} + +.actionCardText { + width: 100%; +} + +.actionCardTitle { + font-size: 30px; + line-height: 44px; + font-weight: normal; + color: white; +} + +.actionCardDescription { + margin-top: 1rem; + font-size: 16px; + line-height: 25px; + font-weight: normal; + color: #a0aec0; /* text.400 */ +} + +.actionCardButtonContainer { + width: 100%; +} + +.actionCardButton { + display: inline-block; + padding: 0.5rem 1rem; + background-color: #3182ce; /* primary */ + color: white; + text-decoration: none; + border-radius: 0.25rem; + font-size: 1rem; + line-height: 1.5; + text-align: center; +} + +@media (min-width: 768px) { + .actionCardContent { + flex-direction: row; + gap: 0; + } + + .actionCardText { + width: 522px; + } + + .actionCardTitle { + font-size: 40px; + } + + .actionCardDescription { + font-size: 20px; + line-height: 32px; + } + + .actionCardButtonContainer { + width: auto; + } + + .actionCardButton { + padding: 0.75rem 1.5rem; + font-size: 1.125rem; + border-radius: 30px; + } +} + +@media (min-width: 992px) { + .actionCard { + padding: 41px 80px; + } +} + +@media (min-width: 1280px) { + .actionCard { + width: 1110px; + } +} diff --git a/apps/website/src/components/ProjectCard/index.tsx b/apps/website/src/components/ProjectCard/index.tsx new file mode 100644 index 0000000000..dfd4c4259d --- /dev/null +++ b/apps/website/src/components/ProjectCard/index.tsx @@ -0,0 +1,74 @@ +import { useColorMode } from "@docusaurus/theme-common"; + +import IconDiscord from "../../icons/IconDiscord"; +import IconGithub from "../../icons/IconGithub"; +import IconWebsite from "../../icons/IconWebsite"; + +import styles from "./styles.module.css"; + +interface ProjectLinks { + website?: string; + github?: string; + discord?: string; +} + +interface ProjectCardProps { + name: string; + description: string; + hackathon?: string; + status?: string; + links: ProjectLinks; +} + +const ProjectCard: React.FC = ({ + description, + hackathon = "", + links, + name, + status = "", +}: ProjectCardProps) => { + const categories = hackathon ? [hackathon] : [status]; + const { colorMode } = useColorMode(); + + return ( +
+
+ {categories.map((category) => ( + + {category} + + ))} +
+ +
+

{name}

+ +

{description}

+
+ + {(links.website || links.github || links.discord) && ( +
+ {links.github && ( + + + + )} + + {links.website && ( + + + + )} + + {links.discord && ( + + + + )} +
+ )} +
+ ); +}; + +export default ProjectCard; diff --git a/apps/website/src/components/ProjectCard/styles.module.css b/apps/website/src/components/ProjectCard/styles.module.css new file mode 100644 index 0000000000..5e618f41fa --- /dev/null +++ b/apps/website/src/components/ProjectCard/styles.module.css @@ -0,0 +1,77 @@ +.card { + border-radius: 18px; + padding: 34px; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + transition: border-color 0.3s ease; +} + +.card.light { + background-color: var(--ifm-color-gray-100); + border: 1px solid var(--ifm-color-gray-300); + color: var(--ifm-color-gray-900); +} + +.card.dark { + background-color: var(--ifm-color-gray-900); + border: 1px solid var(--ifm-color-gray-800); + color: var(--ifm-color-gray-100); +} + +.card:hover { + border-color: var(--ifm-color-primary); +} + +.cardTags { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 2rem; +} + +.tag { + border: 1px solid var(--ifm-color-gray-600); + border-radius: 9999px; + padding: 0.25rem 0.75rem; + font-size: 0.875rem; +} + +.cardBody { + flex-grow: 1; +} + +.cardTitle { + font-size: 24px; + line-height: 33px; + margin-bottom: 1rem; +} + +.cardDescription { + font-size: 14px; + line-height: 22.4px; +} + +.cardFooter { + display: flex; + gap: 1rem; + padding-top: 1rem; +} + +.cardFooter a { + color: inherit; + text-decoration: none; +} + +.cardFooter svg { + width: 24px; + height: 24px; +} + +@media (max-width: 768px) { + .cardFooter svg { + width: 16px; + height: 16px; + } +} diff --git a/apps/website/src/components/ProjectList/index.tsx b/apps/website/src/components/ProjectList/index.tsx new file mode 100644 index 0000000000..562714200c --- /dev/null +++ b/apps/website/src/components/ProjectList/index.tsx @@ -0,0 +1,197 @@ +import { useColorMode } from "@docusaurus/theme-common"; +import React, { useState, useEffect, useCallback } from "react"; + +import projects from "../../content/projects.json"; +import { getProjectsByFilter, getUniqueHackathons, getUniqueStatuses } from "../../utils/getProjectsByFilter"; +import ActionCard from "../ActionCard"; +import ProjectCard from "../ProjectCard"; + +import styles from "./styles.module.css"; + +interface Project { + name: string; + description: string; + hackathon: string | null; + status: string; + links: { + website?: string; + github?: string; + discord?: string; + }; +} + +const typedProjects = projects as unknown as Project[]; + +const sortedProjects = typedProjects.slice().sort((a, b) => a.name.localeCompare(b.name)); + +function chunkArray(array: Project[]): Project[][] { + const result = []; + for (let i = 0; i < array.length; i += 9) { + const chunk = array.slice(i, i + 9); + result.push(chunk); + } + return result.length === 0 ? [[]] : result; +} + +const typedGetProjectsByFilter = getProjectsByFilter as ( + projects: Project[], + filters: { hackathon: string; status: string }, +) => Project[]; +const typedGetUniqueHackathons = getUniqueHackathons as (projects: Project[]) => string[]; +const typedGetUniqueStatuses = getUniqueStatuses as (projects: Project[]) => string[]; + +const ProjectList: React.FC = () => { + const [filteredProjects, setFilteredProjects] = useState(chunkArray(sortedProjects)); + const [selectedHackathon, setSelectedHackathon] = useState(""); + const [selectedStatus, setSelectedStatus] = useState(""); + const [currentPage, setCurrentPage] = useState(0); + const { colorMode } = useColorMode(); + + const filterProjects = useCallback(() => { + const filtered = typedGetProjectsByFilter(sortedProjects, { + hackathon: selectedHackathon, + status: selectedStatus, + }); + setFilteredProjects(chunkArray(filtered)); + setCurrentPage(0); + }, [selectedHackathon, selectedStatus]); + + useEffect(() => { + filterProjects(); + }, [filterProjects]); + + const hackathons = typedGetUniqueHackathons(sortedProjects); + const statuses = typedGetUniqueStatuses(sortedProjects); + + return ( +
+
+
+

Status

+ +
+ + + {statuses.map((status) => ( + + ))} +
+
+ +
+

Hackathon

+ +
+ + + {hackathons.map((hackathon) => ( + + ))} +
+
+
+ +
+ {filteredProjects[currentPage]?.length > 0 ? ( + filteredProjects[currentPage].map((project) => ( + + )) + ) : ( +
+

+ No results found. +

+ +

No projects matching these filters. Try changing your search.

+
+ )} +
+ + {filteredProjects.length > 1 && ( +
+ { + setCurrentPage((prev) => Math.max(0, prev - 1)); + }} + > + ← + + + {filteredProjects.map((_, index) => ( + { + setCurrentPage(index); + }} + > + {index + 1} + + ))} + + { + setCurrentPage((prev) => Math.min(filteredProjects.length - 1, prev + 1)); + }} + > + → + +
+ )} + +
+ +
+
+ ); +}; + +export default ProjectList; diff --git a/apps/website/src/components/ProjectList/styles.module.css b/apps/website/src/components/ProjectList/styles.module.css new file mode 100644 index 0000000000..e758a0abf6 --- /dev/null +++ b/apps/website/src/components/ProjectList/styles.module.css @@ -0,0 +1,180 @@ +.projectList { + width: 100%; +} + +.projectList.light { + color: var(--ifm-color-gray-800); +} + +.projectList.dark { + color: var(--ifm-color-gray-300); +} + +.filters { + display: flex; + flex-direction: column; + gap: 1.5rem; + margin-bottom: 2rem; +} + +.filterGroup h3 { + font-size: 20px; + margin-bottom: 1rem; +} + +.filterOptions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; +} + +.filterOptions button { + padding: 0.5rem 1rem; + border: 1px solid var(--ifm-color-gray-600); + border-radius: 9999px; + background-color: transparent; + color: inherit; + cursor: pointer; + transition: all 0.3s ease; +} + +.filterOptions button:hover { + background-color: var(--ifm-color-gray-200); + color: var(--ifm-color-gray-900); +} + +.light .filterOptions button.active { + background-color: var(--ifm-color-primary); + border-color: var(--ifm-color-primary); + color: white; +} + +.dark .filterOptions button.active { + background-color: var(--ifm-color-primary-dark); + border-color: var(--ifm-color-primary-dark); + color: white; +} + +.projectsGrid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.5rem; + margin-bottom: 2rem; +} + +.noResults { + grid-column: 1 / -1; + text-align: center; + padding: 2rem; +} + +.pagination { + display: flex; + justify-content: center; + align-items: center; + margin-top: 2rem; + font-size: 1rem; +} + +.paginationNumber { + margin: 0 0.5rem; + cursor: pointer; + color: inherit; + transition: color 0.3s ease; +} + +.paginationNumber:hover { + color: var(--ifm-color-primary); +} + +.paginationNumber.active { + color: var(--ifm-color-primary); + font-weight: bold; +} + +.paginationArrow { + cursor: pointer; + margin: 0 1rem; + font-size: 1.4rem; + font-weight: bolder; + color: var(--ifm-color-primary); + transition: opacity 0.3s ease; +} + +.paginationArrow:hover { + opacity: 0.7; +} + +.paginationArrow.disabled { + opacity: 0.3; + cursor: not-allowed; +} + +.actionCardContainer { + display: flex; + justify-content: center; + margin-top: 128px; + margin-bottom: 128px; + width: 100%; +} + +.actionCard { + background-color: #f8f9fa; + border-radius: 8px; + padding: 2rem; + text-align: center; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.actionCard h2 { + font-size: 24px; + margin-bottom: 1rem; + color: #333; +} + +.actionCard p { + font-size: 16px; + margin-bottom: 1.5rem; + color: #666; +} + +.actionButton { + display: inline-block; + background-color: #007bff; + color: white; + padding: 0.75rem 1.5rem; + border-radius: 9999px; + text-decoration: none; + font-weight: bold; + transition: background-color 0.3s ease; +} + +.actionButton:hover { + background-color: #0056b3; +} + +@media (max-width: 768px) { + .actionCard { + padding: 1.5rem; + } + + .actionCard h2 { + font-size: 20px; + } + + .actionCard p { + font-size: 14px; + } +} + +@media (max-width: 1024px) { + .projectsGrid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .projectsGrid { + grid-template-columns: 1fr; + } +} diff --git a/apps/website/src/content/projects.json b/apps/website/src/content/projects.json new file mode 100644 index 0000000000..5e57d17e66 --- /dev/null +++ b/apps/website/src/content/projects.json @@ -0,0 +1,159 @@ +[ + { + "name": "clr.fund", + "description": "a protocol for efficiently allocating funds to public goods that benefit the Ethereum Network.", + "hackathon": null, + "status": "Production", + "links": { + "website": "https://clr.fund/", + "github": "https://github.com/clrfund/monorepo/", + "discord": "https://discord.com/invite/ZnsYPV6dCv" + } + }, + { + "name": "MACI_QF in Allo", + "description": "a MACI Quadratic Funding strategy to be used within Gitcoin's Allo Protocol.", + "hackathon": null, + "status": "Production", + "links": { + "github": "https://github.com/gitcoinco/MACI_QF" + } + }, + { + "name": "MACI Platform", + "description": "a platform that allows to run different types of vote and funding rounds using MACI.", + "hackathon": null, + "status": "Production", + "links": { + "github": "https://github.com/privacy-scaling-explorations/maci-platform", + "website": "https://maci-platform.vercel.app/" + } + }, + { + "name": "MACI Starter Kit", + "description": "a starter kit for quickly prototyping applications with MACI.", + "hackathon": null, + "status": "Utility", + "links": { + "github": "https://github.com/yashgo0018/maci-wrapper" + } + }, + { + "name": "Voto", + "description": "Voto is an on-chain censorship-resistant anonymous voting solution built on decentralised identities.", + "hackathon": "ETHBerlin 2024", + "status": "Hackathon", + "links": { + "website": "https://projects.ethberlin.org/submissions/334", + "github": "https://github.com/Vote-tech/voto-tech" + } + }, + { + "name": "0xFeedback", + "description": "A privacy preserving B2C Survey Platform.", + "hackathon": "ETHDam 2024", + "status": "Hackathon", + "links": { + "website": "https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluyuw0j200y3yz01yjjd4rap/idea" + } + }, + { + "name": "StealthAlloc", + "description": "MACI as an Allo protocol Quadratic Funding Strategy for collusion-resistant, privacy-protecting allocations.", + "hackathon": "ETHDam 2024", + "status": "Hackathon", + "links": { + "website": "https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluxse8cz00pjz3010wbq3thf/idea", + "github": "https://github.com/tse-lao/ethdam24" + } + }, + { + "name": "NEVO", + "description": "MACI's anti-collusion voting system with Near Protocol's Cross-Chain Signatures.", + "hackathon": "ETHDam 2024", + "status": "Hackathon", + "links": { + "website": "https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluz9746q01c2z301tupriiuq/idea", + "github": "https://github.com/atahanyild/NEVO" + } + }, + { + "name": "EtherTale", + "description": "a decentralized, interactive fiction platform powered by AI.", + "hackathon": "ETHTaipei 2024", + "status": "Hackathon", + "links": { + "website": "https://taikai.network/ethtaipei/hackathons/hackathon-2024/projects/clu501yr50l1ey501e65jj8nr", + "github": "https://github.com/saurabhchalke/EtherTale" + } + }, + { + "name": "Demokratia", + "description": "Offers infrastructure to create and seamlessly integrate personalised AI agents for DAO voting.", + "hackathon": "ETHGlobal London 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/demokratia-c7bab", + "github": "https://github.com/ConfidentiDemokratia" + } + }, + { + "name": "SkaffoldMACI+ZkOSIOS", + "description": "User-friendly voting system UI (powered by Skaffold) for sports fans using MACI for enhanced security and privacy.", + "hackathon": "ETHGlobal London 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/skaffoldmaci-zkosios-2no6q", + "github": "https://github.com/GaetanoMondelli/ETH-GLOBAL-LONDON" + } + }, + { + "name": "Vota Protocol", + "description": "a privacy-preserved fair and trustless election Voting System on Blockchain programmable for global constituencies.", + "hackathon": "ETHGlobal London 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/vota-protocol-qxf3z", + "github": "https://github.com/Vota-Protocol" + } + }, + { + "name": "Votelik Pollerin", + "description": "Sybil- and bribery-resistant polling on Farcaster, utilizing World ID and MACI.", + "hackathon": "ETHGlobal London 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/votelik-pollerin-u0dcs", + "github": "https://github.com/pauldev20/farcaster-frames-polls" + } + }, + { + "name": "Anon Vote", + "description": "an on-chain anonymous voting solution with guaranteed proof of personhood.", + "hackathon": "ETHGlobal London 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/anonvote-uc7w0", + "github": "https://github.com/gasperpre/veripoll" + } + }, + { + "name": "MACI Subgraph", + "description": "a subgraph to index data from MACI protocol to serve as data layer for frontend integration", + "hackathon": "ETHGlobal Circuit Breaker 2024", + "status": "Hackathon", + "links": { + "website": "https://ethglobal.com/showcase/maci-subgraph-89h7c" + } + }, + { + "name": "Quadratic Dollar Homepage", + "description": "The Quadratic Dollar Homepage is a spin on the Million Dollar Homepage.", + "hackathon": null, + "status": "Unmaintained", + "links": { + "github": "https://github.com/privacy-scaling-explorations/qdh", + "website": "https://quadratic.page/" + } + } +] diff --git a/apps/website/src/icons/IconDiscord.tsx b/apps/website/src/icons/IconDiscord.tsx new file mode 100644 index 0000000000..c823855fe9 --- /dev/null +++ b/apps/website/src/icons/IconDiscord.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +interface IconDiscordProps extends React.SVGProps { + size?: number; +} + +const IconDiscord: React.FC = ({ size = 24, ...props }) => ( + + + +); + +export default IconDiscord; diff --git a/apps/website/src/icons/IconGithub.tsx b/apps/website/src/icons/IconGithub.tsx new file mode 100644 index 0000000000..208ec7c1ad --- /dev/null +++ b/apps/website/src/icons/IconGithub.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +interface IconGithubProps extends React.SVGProps { + size?: number; +} + +const IconGithub: React.FC = ({ size = 22, ...props }) => ( + + + +); + +export default IconGithub; diff --git a/apps/website/src/icons/IconWebsite.tsx b/apps/website/src/icons/IconWebsite.tsx new file mode 100644 index 0000000000..2f3bdf0659 --- /dev/null +++ b/apps/website/src/icons/IconWebsite.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +interface IconWebsiteProps extends React.SVGProps { + size?: number; +} + +const IconWebsite: React.FC = ({ size = 18, ...props }) => ( + + + +); + +export default IconWebsite; diff --git a/apps/website/src/pages/index.module.css b/apps/website/src/pages/index.module.css index 037695e49a..79c945faac 100644 --- a/apps/website/src/pages/index.module.css +++ b/apps/website/src/pages/index.module.css @@ -60,6 +60,76 @@ margin-bottom: 1rem; } +.projectsPage { + width: 100%; +} + +.heroSection { + padding-top: 170px; + padding-bottom: 56px; + width: 100%; + position: relative; + display: flex; + justify-content: flex-end; + align-items: flex-start; +} + +.backgroundImage { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 100vw; + height: 100%; + overflow: hidden; + z-index: -1; +} + +.backgroundImage img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.heroContent { + padding-bottom: 64px; +} + +.heroContent h1 { + font-size: 72px; + margin-bottom: 16px; +} + +.heroContent p { + font-size: 20px; +} + +.actionSection { + margin-top: 128px; + margin-bottom: 128px; +} + +/* Responsive styles */ +@media (max-width: 768px) { + .heroContent h1 { + font-size: 46px; + } + + .heroContent p { + font-size: 18px; + } +} + +@media (max-width: 480px) { + .heroContent h1 { + font-size: 40px; + } + + .heroContent p { + font-size: 16px; + } +} + @media screen and (max-width: 996px) { .heroBanner { padding: 1.5rem; diff --git a/apps/website/src/pages/projects.md b/apps/website/src/pages/projects.md deleted file mode 100644 index bba65ab9fd..0000000000 --- a/apps/website/src/pages/projects.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Projects built with MACI -description: A list of projects built with the MACI protocol ---- - -# Projects built with MACI - -Please find below a list of all projects built with MACI. If you have a project that is not listed, please reach out to our team in the [PSE Discord](https://discord.com/invite/sF5CT5rzrR) (`#maci` channel), or [create an issue on our GitHub](https://github.com/privacy-scaling-explorations/maci/issues). - -## Production - -- [clr.fund](https://clr.fund): a protocol for efficiently allocating funds to public goods that benefit the Ethereum Network -- [MACI_QF in Allo](https://github.com/gitcoinco/MACI_QF): a MACI Quadratic Funding strategy to be used within Gitcoin's Allo Protocol -- [MACI-RPGF](https://github.com/privacy-scaling-explorations/maci-rpgf): a fork from Easy-RPGF that enables any community to easily run an RPGF round using MACI - -## Utilities - -- [MACI Starter Kit](https://github.com/yashgo0018/maci-wrapper): a starter kit for quickly prototyping applications with MACI - -## Hackathons - -### ETHBerlin 2024 - -- [Voto](https://projects.ethberlin.org/submissions/334) Voto is an on-chain censorship-resistant anonymous voting solution built on decentralised identities. - -### ETHDam 2024 - -- [0xFeedback](https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluyuw0j200y3yz01yjjd4rap/idea) A privacy preserving B2C Survey Platform -- [StealthAlloc](https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluxse8cz00pjz3010wbq3thf/idea) MACI as an Allo protocol Quadratic Funding Strategy for collusion-resistant, privacy-protecting allocations -- [NEVO](https://taikai.network/cryptocanal/hackathons/ethdam2024/projects/cluz9746q01c2z301tupriiuq/idea) MACI's anti-collusion voting system with Near Protocol's Cross-Chain Signatures - -### ETHTaipei 2024 - -- [EtherTale](https://taikai.network/ethtaipei/hackathons/hackathon-2024/projects/clu501yr50l1ey501e65jj8nr) - -### ETHGlobal London 2024 - -- [Demokratia](https://ethglobal.com/showcase/demokratia-c7bab) -- [SkaffoldMACI+ZkOSIOS](https://ethglobal.com/showcase/skaffoldmaci-zkosios-2no6q) -- [Vota Protocol](https://ethglobal.com/showcase/vota-protocol-qxf3z) -- [Votelik Pollerin](https://ethglobal.com/showcase/votelik-pollerin-u0dcs) -- [Anon Vote](https://ethglobal.com/showcase/anonvote-uc7w0) - -### ETHGlobal Circuit Breaker 2024 - -- [MACI Subgraph](https://ethglobal.com/showcase/maci-subgraph-89h7c) - -## Unmaintained - -- [Quadratic Dollar Homepage](https://github.com/privacy-scaling-explorations/qdh) diff --git a/apps/website/src/pages/projects.tsx b/apps/website/src/pages/projects.tsx new file mode 100644 index 0000000000..9e1b7ca3d9 --- /dev/null +++ b/apps/website/src/pages/projects.tsx @@ -0,0 +1,41 @@ +import Layout from "@theme/Layout"; +import clsx from "clsx"; + +import ProjectsList from "../components/ProjectList"; + +import styles from "./index.module.css"; + +interface ProjectspageHeaderProps { + tagline: string; + title: string; +} + +const ProjectspageHeader = ({ tagline, title }: ProjectspageHeaderProps) => ( +
+
{title}
+ +
+ {tagline} + + . +
+
+); + +const Projects: React.FC = () => ( + +
+ +
+ +
+
+
+ +
+
+
+
+); + +export default Projects; diff --git a/apps/website/src/utils/getProjectsByFilter.ts b/apps/website/src/utils/getProjectsByFilter.ts new file mode 100644 index 0000000000..9ba1fedfbd --- /dev/null +++ b/apps/website/src/utils/getProjectsByFilter.ts @@ -0,0 +1,40 @@ +import type Projects from "../content/projects.json"; + +/** + * Filters projects based on hackathon and status criteria. + * @param projects An array of objects where each object represents a project. + * @param filter An object containing optional hackathon and status filter criteria. + * @returns An array of projects that match the given filter criteria. + */ +export function getProjectsByFilter( + projects: typeof Projects, + filter: { hackathon?: string; status?: string }, +): typeof Projects { + return projects.filter((project) => { + const hackathonMatch = !filter.hackathon || project.hackathon === filter.hackathon; + const statusMatch = !filter.status || project.status === filter.status; + return hackathonMatch && statusMatch; + }); +} + +/** + * Extracts unique hackathons from the projects list. + * @param projects An array of objects where each object represents a project. + * @returns An array of strings, where each string is a unique hackathon from across all projects. + */ +export function getUniqueHackathons(projects: typeof Projects): string[] { + const hackathons = projects + .map((project) => project.hackathon) + .filter((hackathon): hackathon is string => hackathon !== null && hackathon !== ""); + return Array.from(new Set(hackathons)); +} + +/** + * Extracts unique statuses from the projects list. + * @param projects An array of objects where each object represents a project. + * @returns An array of strings, where each string is a unique status from across all projects. + */ +export function getUniqueStatuses(projects: typeof Projects): string[] { + const statuses = projects.map((project) => project.status); + return Array.from(new Set(statuses)); +} diff --git a/package.json b/package.json index 4fa1f5dd2b..3dab680c80 100644 --- a/package.json +++ b/package.json @@ -40,14 +40,14 @@ "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.0.0", "eslint-import-resolver-typescript": "^3.6.3", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-json": "^4.0.1", "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-unused-imports": "^4.1.3", - "husky": "^9.1.4", + "husky": "^9.1.5", "is-ci": "^3.0.1", "lerna": "^8.1.8", "lint-staged": "^15.2.9", @@ -56,7 +56,7 @@ "solhint": "^5.0.3", "tar": "^7.4.3", "ts-node": "^10.9.1", - "typedoc": "^0.26.6", + "typedoc": "^0.26.7", "typedoc-plugin-markdown": "^4.2.6", "typescript": "^5.5.4" }, diff --git a/packages/cli/tests/constants.ts b/packages/cli/tests/constants.ts index 15d7644826..e78c02043e 100644 --- a/packages/cli/tests/constants.ts +++ b/packages/cli/tests/constants.ts @@ -44,11 +44,11 @@ export const testProcessMessagesWasmPath = export const testTallyVotesWasmPath = "./zkeys/TallyVotes_10-1-2_test/TallyVotes_10-1-2_test_js/TallyVotes_10-1-2_test.wasm"; export const testRapidsnarkPath = `${homedir()}/rapidsnark/build/prover`; -export const ceremonyProcessMessagesZkeyPath = "./zkeys/ProcessMessages_14-9-2-3/processMessages_14-9-2-3.zkey"; +export const ceremonyProcessMessagesZkeyPath = "./zkeys/ProcessMessages_14-9-2-3/processmessages_14-9-2-3.zkey"; export const ceremonyProcessMessagesNonQvZkeyPath = - "./zkeys/ProcessMessagesNonQv_14-9-2-3/processMessagesNonQv_14-9-2-3.zkey"; -export const ceremonyTallyVotesZkeyPath = "./zkeys/TallyVotes_14-5-3/tallyVotes_14-5-3.zkey"; -export const ceremonyTallyVotesNonQvZkeyPath = "./zkeys/TallyVotesNonQv_14-5-3/tallyVotesNonQv_14-5-3.zkey"; + "./zkeys/ProcessMessagesNonQv_14-9-2-3/processmessagesnonqv_14-9-2-3.zkey"; +export const ceremonyTallyVotesZkeyPath = "./zkeys/TallyVotes_14-5-3/tallyvotes_14-5-3.zkey"; +export const ceremonyTallyVotesNonQvZkeyPath = "./zkeys/TallyVotesNonQv_14-5-3/tallyvotesnonqv_14-5-3.zkey"; export const ceremonyProcessMessagesWitnessPath = "./zkeys/ProcessMessages_14-9-2-3/ProcessMessages_14-9-2-3_cpp/ProcessMessages_14-9-2-3"; export const ceremonyProcessMessagesNonQvWitnessPath = diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b689e21a68..41b8f70806 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,16 +31,16 @@ importers: version: 8.57.0 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0) + version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0) eslint-config-prettier: specifier: ^9.0.0 version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.3 - version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0) eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + specifier: ^2.30.0 + version: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-json: specifier: ^4.0.1 version: 4.0.1 @@ -60,8 +60,8 @@ importers: specifier: ^4.1.3 version: 4.1.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) husky: - specifier: ^9.1.4 - version: 9.1.4 + specifier: ^9.1.5 + version: 9.1.5 is-ci: specifier: ^3.0.1 version: 3.0.1 @@ -87,11 +87,11 @@ importers: specifier: ^10.9.1 version: 10.9.2(@types/node@22.4.1)(typescript@5.5.4) typedoc: - specifier: ^0.26.6 - version: 0.26.6(typescript@5.5.4) + specifier: ^0.26.7 + version: 0.26.7(typescript@5.5.4) typedoc-plugin-markdown: specifier: ^4.2.6 - version: 4.2.6(typedoc@0.26.6(typescript@5.5.4)) + version: 4.2.6(typedoc@0.26.7(typescript@5.5.4)) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -157,8 +157,8 @@ importers: specifier: ^4.0.3 version: 4.0.3 prism-react-renderer: - specifier: ^2.3.1 - version: 2.3.1(react@18.3.1) + specifier: ^2.4.0 + version: 2.4.0(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -2478,6 +2478,9 @@ packages: '@rescript/std@9.0.0': resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@scure/base@1.1.6': resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} @@ -2521,8 +2524,11 @@ packages: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} - '@shikijs/core@1.10.3': - resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} + '@shikijs/core@1.16.2': + resolution: {integrity: sha512-XSVH5OZCvE4WLMgdoBqfPMYmGHGmCC3OgZhw0S7KcSi2XKZ+5oHGe71GFnTljgdOxvxx5WrRks6QoTLKrl1eAA==} + + '@shikijs/vscode-textmate@9.2.0': + resolution: {integrity: sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==} '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -4898,6 +4904,27 @@ packages: eslint-plugin-import-x: optional: true + eslint-module-utils@2.11.0: + resolution: {integrity: sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + eslint-module-utils@2.8.1: resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} @@ -4919,8 +4946,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.30.0: + resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -5954,8 +5981,8 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - husky@9.1.4: - resolution: {integrity: sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==} + husky@9.1.5: + resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} engines: {node: '>=18'} hasBin: true @@ -6178,6 +6205,10 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} @@ -8298,8 +8329,8 @@ packages: resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} engines: {node: '>=4'} - prism-react-renderer@2.3.1: - resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + prism-react-renderer@2.4.0: + resolution: {integrity: sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==} peerDependencies: react: '>=16.0.0' @@ -8995,8 +9026,8 @@ packages: engines: {node: '>=4'} hasBin: true - shiki@1.10.3: - resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} + shiki@1.16.2: + resolution: {integrity: sha512-gSym0hZf5a1U0iDPsdoOAZbvoi+e0c6c3NKAi03FoSLTm7oG20tum29+gk0wzzivOasn3loxfGUPT+jZXIUbWg==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -9691,12 +9722,12 @@ packages: peerDependencies: typedoc: 0.26.x - typedoc@0.26.6: - resolution: {integrity: sha512-SfEU3SH3wHNaxhFPjaZE2kNl/NFtLNW5c1oHsg7mti7GjmUj1Roq6osBQeMd+F4kL0BoRBBr8gQAuqBlfFu8LA==} + typedoc@0.26.7: + resolution: {integrity: sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==} engines: {node: '>= 18'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} @@ -10226,6 +10257,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -11952,7 +11988,7 @@ snapshots: lodash: 4.17.21 nprogress: 0.2.0 postcss: 8.4.38 - prism-react-renderer: 2.3.1(react@18.3.1) + prism-react-renderer: 2.4.0(react@18.3.1) prismjs: 1.29.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11991,7 +12027,7 @@ snapshots: '@types/react-router-config': 5.0.11 clsx: 2.1.1 parse-numeric-range: 1.3.0 - prism-react-renderer: 2.3.1(react@18.3.1) + prism-react-renderer: 2.4.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 @@ -12017,7 +12053,7 @@ snapshots: '@types/react-router-config': 5.0.11 clsx: 2.1.1 parse-numeric-range: 1.3.0 - prism-react-renderer: 2.3.1(react@18.3.1) + prism-react-renderer: 2.4.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.6.3 @@ -13554,6 +13590,8 @@ snapshots: '@rescript/std@9.0.0': {} + '@rtsao/scc@1.1.0': {} + '@scure/base@1.1.6': {} '@scure/bip32@1.1.5': @@ -13627,10 +13665,13 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@shikijs/core@1.10.3': + '@shikijs/core@1.16.2': dependencies: + '@shikijs/vscode-textmate': 9.2.0 '@types/hast': 3.0.4 + '@shikijs/vscode-textmate@9.2.0': {} + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -16318,20 +16359,20 @@ snapshots: optionalDependencies: source-map: 0.2.0 - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint@8.57.0): + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint@8.57.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -16345,43 +16386,54 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.15.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6(supports-color@8.1.1) enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-bun-module: 1.1.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.11.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: + '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -16390,9 +16442,9 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 - is-core-module: 2.13.1 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -17926,7 +17978,7 @@ snapshots: human-signals@5.0.0: {} - husky@9.1.4: {} + husky@9.1.5: {} hyperlinker@1.0.0: {} @@ -18224,6 +18276,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 @@ -20793,7 +20849,7 @@ snapshots: pretty-time@1.1.0: {} - prism-react-renderer@2.3.1(react@18.3.1): + prism-react-renderer@2.4.0(react@18.3.1): dependencies: '@types/prismjs': 1.26.4 clsx: 2.1.1 @@ -21368,7 +21424,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -21659,9 +21715,10 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki@1.10.3: + shiki@1.16.2: dependencies: - '@shikijs/core': 1.10.3 + '@shikijs/core': 1.16.2 + '@shikijs/vscode-textmate': 9.2.0 '@types/hast': 3.0.4 side-channel@1.0.6: @@ -22501,18 +22558,18 @@ snapshots: typedarray@0.0.6: {} - typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.5.4)): + typedoc-plugin-markdown@4.2.6(typedoc@0.26.7(typescript@5.5.4)): dependencies: - typedoc: 0.26.6(typescript@5.5.4) + typedoc: 0.26.7(typescript@5.5.4) - typedoc@0.26.6(typescript@5.5.4): + typedoc@0.26.7(typescript@5.5.4): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.10.3 + shiki: 1.16.2 typescript: 5.5.4 - yaml: 2.5.0 + yaml: 2.5.1 typescript@5.5.4: {} @@ -23121,6 +23178,8 @@ snapshots: yaml@2.5.0: {} + yaml@2.5.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1