From 89683545390f6b6dea18956f87d8c9e6eb782be0 Mon Sep 17 00:00:00 2001 From: Oshioke-Salaki Date: Mon, 29 Jul 2024 21:36:41 +0100 Subject: [PATCH 1/7] refac: frontend redesign --- frontend/public/assets/addressBook.svg | 15 + frontend/public/assets/burnerWalletBg.svg | 116 +++++++ frontend/public/assets/converterBanner.svg | 20 ++ frontend/public/assets/deployerBanner.svg | 15 + frontend/public/assets/faucetBanner.svg | 39 +++ frontend/public/assets/footer-bg.svg | 220 +++++++++++++ frontend/public/assets/footerLogo.svg | 9 + frontend/public/assets/illus1.png | Bin 0 -> 33369 bytes frontend/public/assets/image-7.svg | 9 + frontend/public/assets/linkArrow.svg | 3 + frontend/public/assets/logo.svg | 15 + frontend/public/assets/wikipediaBanner.svg | 45 +++ frontend/public/coolvetica rg.otf | Bin 0 -> 70876 bytes frontend/src/app/components/AddTokenBtn.tsx | 2 +- .../app/components/ui_components/Footer.tsx | 31 ++ .../app/components/ui_components/Header.tsx | 271 +++++++++------- .../ui_components/NetworkSwitcher.tsx | 10 +- .../app/components/ui_components/Theme.tsx | 8 +- frontend/src/app/globals.css | 4 + frontend/src/app/page.tsx | 293 +++++++++++------- frontend/tailwind.config.ts | 6 + 21 files changed, 891 insertions(+), 240 deletions(-) create mode 100644 frontend/public/assets/addressBook.svg create mode 100644 frontend/public/assets/burnerWalletBg.svg create mode 100644 frontend/public/assets/converterBanner.svg create mode 100644 frontend/public/assets/deployerBanner.svg create mode 100644 frontend/public/assets/faucetBanner.svg create mode 100644 frontend/public/assets/footer-bg.svg create mode 100644 frontend/public/assets/footerLogo.svg create mode 100644 frontend/public/assets/illus1.png create mode 100644 frontend/public/assets/image-7.svg create mode 100644 frontend/public/assets/linkArrow.svg create mode 100644 frontend/public/assets/logo.svg create mode 100644 frontend/public/assets/wikipediaBanner.svg create mode 100644 frontend/public/coolvetica rg.otf create mode 100644 frontend/src/app/components/ui_components/Footer.tsx diff --git a/frontend/public/assets/addressBook.svg b/frontend/public/assets/addressBook.svg new file mode 100644 index 0000000..88c3726 --- /dev/null +++ b/frontend/public/assets/addressBook.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/burnerWalletBg.svg b/frontend/public/assets/burnerWalletBg.svg new file mode 100644 index 0000000..9e82928 --- /dev/null +++ b/frontend/public/assets/burnerWalletBg.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/converterBanner.svg b/frontend/public/assets/converterBanner.svg new file mode 100644 index 0000000..e25248e --- /dev/null +++ b/frontend/public/assets/converterBanner.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/deployerBanner.svg b/frontend/public/assets/deployerBanner.svg new file mode 100644 index 0000000..159aa6f --- /dev/null +++ b/frontend/public/assets/deployerBanner.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/faucetBanner.svg b/frontend/public/assets/faucetBanner.svg new file mode 100644 index 0000000..7912ae0 --- /dev/null +++ b/frontend/public/assets/faucetBanner.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/footer-bg.svg b/frontend/public/assets/footer-bg.svg new file mode 100644 index 0000000..1bebe1f --- /dev/null +++ b/frontend/public/assets/footer-bg.svg @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/footerLogo.svg b/frontend/public/assets/footerLogo.svg new file mode 100644 index 0000000..ec6dcd7 --- /dev/null +++ b/frontend/public/assets/footerLogo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/public/assets/illus1.png b/frontend/public/assets/illus1.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1fccb47ed9efa71b553e88f1cdce4b52d52d55 GIT binary patch literal 33369 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 Ss=zm}mz`L|NjMFTjRh0 literal 0 HcmV?d00001 diff --git a/frontend/public/assets/image-7.svg b/frontend/public/assets/image-7.svg new file mode 100644 index 0000000..3dcc258 --- /dev/null +++ b/frontend/public/assets/image-7.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/public/assets/linkArrow.svg b/frontend/public/assets/linkArrow.svg new file mode 100644 index 0000000..63f86bd --- /dev/null +++ b/frontend/public/assets/linkArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/public/assets/logo.svg b/frontend/public/assets/logo.svg new file mode 100644 index 0000000..6a325a6 --- /dev/null +++ b/frontend/public/assets/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/public/assets/wikipediaBanner.svg b/frontend/public/assets/wikipediaBanner.svg new file mode 100644 index 0000000..9454901 --- /dev/null +++ b/frontend/public/assets/wikipediaBanner.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/coolvetica rg.otf b/frontend/public/coolvetica rg.otf new file mode 100644 index 0000000000000000000000000000000000000000..fd493795b0bf43f4218cce4c8fafb5106bead435 GIT binary patch literal 70876 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 literal 0 HcmV?d00001 diff --git a/frontend/src/app/components/AddTokenBtn.tsx b/frontend/src/app/components/AddTokenBtn.tsx index e15f553..64134a8 100644 --- a/frontend/src/app/components/AddTokenBtn.tsx +++ b/frontend/src/app/components/AddTokenBtn.tsx @@ -11,7 +11,7 @@ function AddTokenBtn() { return ( <> + + + +

+

Built with ❤️ by Argent

+
+ + ); +}; + +export default Footer; diff --git a/frontend/src/app/components/ui_components/Header.tsx b/frontend/src/app/components/ui_components/Header.tsx index f81ae7a..4fc5c29 100644 --- a/frontend/src/app/components/ui_components/Header.tsx +++ b/frontend/src/app/components/ui_components/Header.tsx @@ -9,6 +9,8 @@ import ThemeSwitch from "./Theme"; import NetworkSwitcher from "./NetworkSwitcher"; import ConnectModal from "./ConnectModal"; import AddTokenBtn from "../AddTokenBtn"; +import Image from "next/image"; +import logoImage from "../../../../public/assets/logo.svg"; const Header = () => { const { address } = useAccount(); @@ -94,130 +96,38 @@ const Header = () => { <>
- - - - starknet-scaffold - - - - -
- {address ? ( -
- +
- -
+ )} +
+ +
- - -
- -
-
-
- {address ? ( -
- - -
- ) : ( - - )} - - -
-
@@ -236,3 +146,134 @@ const Header = () => { }; export default Header; + +{ + /*
+ + + + starknet-scaffold + + + + +
+ {address ? ( +
+ + +
+ ) : ( + + )} + + + + + +
+ +
+ + + +
+ +
+
+
+ {address ? ( +
+ + +
+ ) : ( + + )} + + +
+
+
+
; */ +} diff --git a/frontend/src/app/components/ui_components/NetworkSwitcher.tsx b/frontend/src/app/components/ui_components/NetworkSwitcher.tsx index fbd4aa4..7242057 100644 --- a/frontend/src/app/components/ui_components/NetworkSwitcher.tsx +++ b/frontend/src/app/components/ui_components/NetworkSwitcher.tsx @@ -63,18 +63,18 @@ export function NetworkSwitcher() { return ( - + + diff --git a/frontend/src/app/components/ui_components/Theme.tsx b/frontend/src/app/components/ui_components/Theme.tsx index 52dccf2..fa3d6df 100644 --- a/frontend/src/app/components/ui_components/Theme.tsx +++ b/frontend/src/app/components/ui_components/Theme.tsx @@ -22,12 +22,12 @@ const ThemeSwitch: React.FC = ({ } md:top-[5rem] w-[3rem] h-[3rem] flex justify-center items-center dark:bg-[#1F2024] bg-white-1 rounded-full p-2 cursor-pointer`} > {theme === "dark" ? ( - - + + ) : ( - - + + )} diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index da08074..ac4124e 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -1,5 +1,9 @@ @tailwind base; @tailwind components; +@font-face { + font-family: "coolvetica"; + src: url("../../public/coolvetica rg.otf"); +} @tailwind utilities; html, diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index ee625cb..6c5006a 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -1,125 +1,188 @@ +"use client"; import Image from "next/image"; import Header from "@/app/components/ui_components/Header"; +import NetworkSwitcher from "./components/ui_components/NetworkSwitcher"; +import AddTokenBtn from "./components/AddTokenBtn"; +import burnerWallet from "../../public/assets/burnerWalletBg.svg"; +import faucet from "../../public/assets/faucetBanner.svg"; +import deployer from "../../public/assets/deployerBanner.svg"; +import wikipedia from "../../public/assets/wikipediaBanner.svg"; +import addressBook from "../../public/assets/addressBook.svg"; +import converter from "../../public/assets/converterBanner.svg"; +import Footer from "./components/ui_components/Footer"; +import arrow from "../../public/assets/linkArrow.svg"; export default function Home() { return ( -
+
- Starknet Scaffold - -
- -

- Scaffold Deployer{" "} - - -> - -

-

- A simple tool for seamlessly deploying smart contracts to Starknet - testnet and mainnet
-
-

-
- -

- Sepolia Faucet{" "} - - -> - -

-

- A sepETH/sepSTRK faucet for claiming ETH/STRK sepolia testnet tokens{" "} -

-
- - -

- Scaffold Burner Wallet{" "} - - -> - -

-

- Generate temporary wallets, which can be used during the course of - development
-
-

-
- - -

- Scaffold Wikipedia{" "} - - -> - -

-

- A collection of Starknet/Cairo learning resources in the ecosystem{" "} -

-
- - -

- Stark Converter{" "} - - -> - -

-

- A collection of utility functions for Starknet related conversions{" "} -

-
- - -

- Address Book{" "} - - -> - -

-

- A collection of all relevant contract addresses on Starknet{" "} -

-
+
+

+ Everything you need to buidl dApps on Ethereum +

+

+ A modern clean veersion of Starknet-Scaffold with NextJS, Rainbowkit, + Wagmi and Typescript. Supports Hardhat and Foundry +

+
+ + +
+
+
+
+
+
+ + Scaffold Burner Wallet + + redirect + + +

+ Generate temporary wallets which can be used during the course + of development +

+
+ burner banner +
+
+
+ + Scaffold Faucet + + redirect + + +

+ A SepETH/SepSTRK faucet for claiming ETH/STRK Sepolia testnet + tokens +

+
+ faucet banner +
+
+
+
+
+ + Scaffold Deployer + + redirect + + +

+ A simple tool for seamlessly deploying smart contracts to + Starknet testnet and mainnet +

+
+ deployer banner +
+
+
+
+
+ + Scaffold Wikipedia + + redirect + + +

+ A collection of Starknet/Cairo learning resources in the + ecosystem +

+
+ wikipedia banner +
+
+
+ + Stark Converter + + redirect + + +

+ A collection of utility functions for Starknet/Cairo related + conversions +

+
+ converter banner +
+
+
+
+ + Address Book + + redirect + + +

+ A collection of all relevant contract addresses on Starknet +

+
+ Address book banner +
+
+
+
); } diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index 871a6a3..2832085 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -24,10 +24,16 @@ const config: Config = { primary: "#f77448", secondary: "#3B82F6", }, + fontFamily: { + coolvetica: ["coolvetica", "sans-serif"], + }, backgroundImage: { + "footer-image": "url('/assets/footer-bg.svg')", "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + primaryGradient: + "linear-gradient(180deg, #FF8D4E -9.12%, #FF6734 39.7%)", }, }, }, From f601188025937ea93765ae6bb75f62b621e6e4aa Mon Sep 17 00:00:00 2001 From: Oshioke-Salaki Date: Mon, 29 Jul 2024 23:27:28 +0100 Subject: [PATCH 2/7] fix: deployment error --- frontend/src/app/components/ui_components/Footer.tsx | 3 ++- frontend/src/app/components/ui_components/Header.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/ui_components/Footer.tsx b/frontend/src/app/components/ui_components/Footer.tsx index 8dd094a..971b40a 100644 --- a/frontend/src/app/components/ui_components/Footer.tsx +++ b/frontend/src/app/components/ui_components/Footer.tsx @@ -12,7 +12,8 @@ const Footer = () => {

Join our community to learn and build together! And please raise an - issue on our Github if there's a new feature you'll like to see + issue on our Github if there's a new feature you'll like + to see

+ + + + ); +} diff --git a/frontend/src/app/wikipedia/category-button.tsx b/frontend/src/app/wikipedia/category-button.tsx new file mode 100644 index 0000000..34e3af7 --- /dev/null +++ b/frontend/src/app/wikipedia/category-button.tsx @@ -0,0 +1,18 @@ +export default function CategoryButton({ + category, + onClick, + disabled, + active, +}: any) { + return ( + + ); +} diff --git a/frontend/src/app/wikipedia/filter.tsx b/frontend/src/app/wikipedia/filter.tsx new file mode 100644 index 0000000..7c5a35e --- /dev/null +++ b/frontend/src/app/wikipedia/filter.tsx @@ -0,0 +1,56 @@ +import Image from "next/image"; +import CategoryButton from "./category-button"; +import arrDown from "../../../public/assets/cheveron-down.svg"; +import filterIcon from "../../../public/assets/filter-icon.svg"; +import { useSearchParams } from "next/navigation"; +import { useRouter } from "next/navigation"; + +export default function Filter({ + field, + options, +}: { + field: string; + options: any; +}) { + const router = useRouter(); + const searchParams = useSearchParams(); + const currentCategory = searchParams.get(field) || ""; + + function handleClick(value: string) { + const currentUrl = new URL(window.location.href); + currentUrl.searchParams.set(field, value); + currentUrl.searchParams.set("page", "1"); + router.push(currentUrl.toString()); + } + return ( +
+
+

Sort by:

+
+ Popular + cheveron +
+
+
+ filter + Filters +
+
+
+ Categories +
+
+ {options.map((option: any) => ( + handleClick(option.value)} + disabled={option.value === currentCategory} + active={option.value === currentCategory} + /> + ))} +
+
+
+ ); +} diff --git a/frontend/src/app/wikipedia/page.tsx b/frontend/src/app/wikipedia/page.tsx index 04e75db..2d5aa71 100644 --- a/frontend/src/app/wikipedia/page.tsx +++ b/frontend/src/app/wikipedia/page.tsx @@ -1,417 +1,953 @@ -import { Resource, columns } from "./columns"; -import { DataTable } from "./data-table"; +"use client"; +import Image from "next/image"; +import logoImage from "../../../public/assets/logo.svg"; +import search from "../../../public/assets/search-icon.svg"; -async function getData(): Promise { - return [ - { - id: "0", - name: "Starknet Website", - description: "Official Website of Starknet.", - status: "Up to date", - url: "https://www.starknet.io/en", - }, - { - id: "1", - name: "Starknet Documentation", - description: "Official Documentation for Starknet.", - status: "Up to date", - url: "https://docs.starknet.io/", - }, - { - id: "2", - name: "The Starknet Book", - description: - "The Starknet Book is a step-by-step guide aimed at teaching you the essentials of Starknet development. This book works hand-in-hand with the Cairo Book.", - status: "Up to date", - url: "https://book.starknet.io/", - }, - { - id: "3", - name: "Starklings", - description: - "Interactive tutorial to get you up and running with Cairo v1 and Starknet.", - status: "Up to date", - url: "https://github.com/shramee/starklings-cairo1", - }, - { - id: "4", - name: "Awesome Starknet", - description: "A curated list of awesome StarkNet resources, libraries, tools and more", - status: "Up to date", - url: "https://github.com/keep-starknet-strange/awesome-starknet" - }, - { - id: "5", - name: "Node Guardians", - description: "Cairo 1.0 interactive tutorials.", - status: "Up to date", - url: "https://nodeguardians.io/dev-hub?s=devhub-campaigns&sc=starting-cairo", - }, - { - id: "6", - name: "Starknet messaging tutorial", - description: - "Detailed tutorial to test messaging with Anvil and Katana.", - status: "Out of date", - url: "https://github.com/starknet-edu/starknet-erc721", - }, - { - id: "7", - name: "Starknet Blog Posts", - description: "Official blog posts related to Starknet.", - status: "Up to date", - url: "https://www.starknet.io/en/content", - }, - { - id: "8", - name: "Developers Blog", - description: "Official Developers Blog for Starknet.", - status: "Up to date", - url: "https://www.starknet.io/en/content/category/developers", - }, - { - id: "9", - name: "Starknet research hub", - description: - "The place to learn more about the Starknet ecosystem and stay-up-to-date with the latest news.", - status: "Up to date", - url: "https://starknet-research.beehiiv.com/", - }, - { - id: "10", - name: "Starknet Hardhat plugin", - description: - "A plugin for integrating Starknet tools into Hardhat projects.", - status: "Up to date", - url: "https://github.com/0xSpaceShard/starknet-hardhat-plugin", - }, - { - id: "11", - name: "STARK Math: The Journey Begins", - description: - "Starkware's series of blog posts explaining the theory behind STARKs.", - status: "Up to date", - url: "https://medium.com/starkware/stark-math-the-journey-begins-51bd2b063c71", - }, - { - id: "12", - name: "Cryptography and maths", - description: "Educational resources on cryptography and maths.", - status: "Up to date", - url: "https://medium.com/starkware/tagged/math", - }, - { - id: "13", - name: "Starkware verifier (StarkEx)", - description: "Official Starkware verifier.", - status: "Up to date", - url: "https://github.com/starkware-libs/starkex-contracts", - }, - { - id: "14", - name: "STONE", - description: "Prover and verifier for STARKs.", - status: "Up to date", - url: "https://github.com/starkware-libs/stone-prover", - }, - { - id: "15", - name: "sandstorm", - description: "Cairo prover powered by miniSTARK.", - status: "Up to date", - url: "https://github.com/andrewmilson/sandstorm", - }, - { - id: "16", - name: "awesome-prover-mechanisms", - description: "List of resources for prover mechanisms in the zkrollup ecosystem.", - status: "Up to date", - url: "https://github.com/niluferokay/awesome-prover-mechanisms", - }, - { - id: "17", - name: "Arithmetization I", - description: "Part of Starkware's series on STARKs.", - status: "Up to date", - url: "https://medium.com/starkware/arithmetization-i-15c046390862", - }, - { - id: "18", - name: "Arithmetization II", - description: "Part of Starkware's series on STARKs.", - status: "Up to date", - url: "https://medium.com/starkware/arithmetization-ii-403c3b3f4355", - }, - { - id: "19", - name: "YouTube channel", - description: "Official StarkWare YouTube channel.", - status: "Up to date", - url: "https://www.youtube.com/@starkware_ltd", - }, - { - id: "20", - name: "Roadmap", - description: "What’s coming next for Starknet.", - status: "Up to date", - url: "https://starknet.io/#roadmap", - }, - { - id: "21", - name: "SNIPs", - description: "Starknet Improvement Proposals (SNIPs) repository.", - status: "Up to date", - url: "https://github.com/starknet-io/snips", - }, - { - id: "22", - name: "starkware-libs/cairo", - description: "Official Cairo Github repository.", - status: "Up to date", - url: "https://github.com/starkware-libs/cairo", - }, - { - id: "23", - name: "Cairopractice", - description: "Cairo blog covering various aspects of the language and its applications.", - status: "Up to date", - url: "https://cairopractice.com/", - }, - { - id: "24", - name: "Cairo – a Turing-complete STARK-friendly CPU architecture", - description: "Whitepaper providing an in-depth look into the Cairo architecture and its STARK-friendly features.", - status: "Up to date", - url: "https://eprint.iacr.org/2021/1063.pdf", - }, - { - id: "25", - name: "A verified algebraic representation of Cairo program execution", - description: "Proof demonstrating the soundness of Cairo's execution using the Lean proof assistant.", - status: "Up to date", - url: "https://arxiv.org/abs/2109.14534", - }, - { - id: "26", - name: "WTF Starknet", - description: "English and Chinese tutorials covering various aspects of Starknet.", - status: "Up to date", - url: "https://github.com/WTFAcademy/WTF-Starknet", - }, - { - id: "27", - name: "ethSTARK Documentation", - description: "Explanation of the computational integrity of STARKs.", - status: "Up to date", - url: "https://eprint.iacr.org/2021/58", - }, - { - id: "28", - name: "STARK Paper", - description: "Original paper introducing STARKs.", - status: "Up to date", - url: "https://www.starkware.co/stark", - }, - { - id: "29", - name: "FRI Protocol", - description: "Explanation of the Fast Reed-Solomon Interactive Oracle Proofs (FRI) protocol.", - status: "Up to date", - url: "https://en.wikipedia.org/wiki/FRI_protocol", - }, - { - id: "30", - name: "DEEP-FRI Protocol", - description: "Explanation of the DEEP-FRI protocol, an improvement over FRI.", - status: "Up to date", - url: "https://arxiv.org/abs/1903.12243", - }, - { - id: "31", - name: "Aurora", - description: "Transparent Succinct Arguments for R1CS.", - status: "Up to date", - url: "https://eprint.iacr.org/2020/705.pdf", - }, - { - id: "32", - name: "Starknet Developer Tools", - description: "Official documentation for Starknet developer tools, including setup guides and usage instructions.", - status: "Up to date", - url: "https://docs.starknet.io/documentation/tools/devtools/", - }, - { - id: "33", - name: "Starknet.js SDK", - description: "Javascript library.", - status: "Up to date", - url: "https://www.starknetjs.com/", - }, - { - id: "34", - name: "Starknet.py SDK", - description: "Python library.", - status: "Up to date", - url: "https://github.com/software-mansion/starknet.py", - }, - { - id: "35", - name: "Starknet-rs SDK", - description: "Rust Library.", - status: "Up to date", - url: "https://github.com/xJonathanLEI/starknet-rs", - }, - { - id: "36", - name: "cairo-vm", - description: "Rust implementation of the Cairo VM.", - status: "Up to date", - url: "https://github.com/lambdaclass/cairo-vm", - }, - { - id: "37", - name: "cairo-vm-go", - description: "Golang implementation of the Cairo VM.", - status: "Up to date", - url: "https://github.com/NethermindEth/cairo-vm-go", - }, - { - id: "38", - name: "cairo-vm_in_go", - description: "Another Golang implementation of the Cairo VM.", - status: "Up to date", - url: "https://github.com/lambdaclass/cairo-vm_in_go", - }, - { - id: "39", - name: "cairo-zig", - description: "Zig implementation of the Cairo VM.", - status: "Up to date", - url: "https://github.com/keep-starknet-strange/ziggy-starkdust", - }, - { - id: "40", - name: "Setting up your environment", - description: "Environment setup guide for Starknet development.", - status: "Up to date", - url: "https://docs.starknet.io/documentation/quick_start/environment_setup/", - }, - { - id: "41", - name: "Starkli", - description: "The recommended CLI for Starknet development.", - status: "Up to date", - url: "https://book.starkli.rs/", - }, - { - id: "42", - name: "Scarb", - description: "The recommended build toolchain and package manager for Starknet development.", - status: "Up to date", - url: "https://docs.swmansion.com/scarb", - }, - { - id: "43", - name: "Vscode Cairo extension", - description: "Official Cairo extension for VSCode with diagnostics, go-to-definition, completion and more.", - status: "Up to date", - url: "https://marketplace.visualstudio.com/items?itemName=starkware.cairo1", - }, - { - id: "44", - name: "Vim plugin for Scarb projects", - description: "Vim plugin for projects built with Scarb.", - status: "Up to date", - url: "https://github.com/swan-of-bodom/scarb-vim", - }, - { - id: "45", - name: "Starknet Foundry", - description: "Toolchain for smart contracts development, testing and deployment on Starknet.", - status: "Up to date", - url: "https://foundry-rs.github.io/starknet-foundry/", - }, - { - id: "46", - name: "Starknet Foundry Forge Template", - description: "Template for starting projects with Starknet Foundry.", - status: "Up to date", - url: "https://github.com/foundry-rs/starknet_forge_template", - }, - { - id: "47", - name: "Starknet Remix", - description: "The official Starknet plugin for Remix, a browser-based IDE without the need for any installation.", - status: "Up to date", - url: "https://remix.ethereum.org/?#activate=Starknet", - }, - { - id: "48", - name: "Starknet Devnet", - description: "Local testnet for Starknet development.", - status: "Up to date", - url: "https://github.com/0xSpaceShard/starknet-devnet-rs", - }, - { - id: "49", - name: "Katana", - description: "High performance sequencer that can be used as a local testnet for Starknet.", - status: "Up to date", - url: "https://book.dojoengine.org/toolchain/katana/overview", - }, - { - id: "50", - name: "Starknet Hardhat plugin", - description: "Plugin for integrating Starknet tools into Hardhat projects.", - status: "Up to date", - url: "https://github.com/Shard-Labs/starknet-hardhat-plugin", - }, - { - id: "51", - name: "starknet-hardhat-example", - description: "Example project demonstrating the usage of the Starknet Hardhat plugin.", - status: "Up to date", - url: "https://github.com/0xSpaceShard/starknet-hardhat-example", - }, - { - id: "52", - name: "docker-cairo", - description: "Multi-arch Docker images with Cairo binaries.", - status: "Up to date", - url: "https://github.com/xJonathanLEI/docker-cairo", - }, - { - id: "53", - name: "DappLand", - description: "The best Starknet Dapps. Built by Argent.", - status: "Up to date", - url: "https://www.dappland.com/", - }, - { - id: "54", - name: "Starknet dApps and tools", - description: - "Unofficial ecosystem page for Ethereum and its layer 2s like Starknet.", - status: "Up to date", - url: "https://www.ethereum-ecosystem.com/blockchains/starknet", - }, - { - id: "55", - name: "The Cairo Book", - description: - "Official Cairo documentation by the community", - status: "Up to date", - url: "https://book.cairo-lang.org/", - }, - ]; -} +import useTheme from "../components/ui_components/hooks/useTheme"; +import ThemeSwitch from "../components/ui_components/Theme"; +import { useState } from "react"; +import Filter from "./filter"; +import Resources from "./resources"; + +// async function getData(): Promise { +// return [ +// { +// id: "0", +// name: "Starknet Website", +// description: "Official Website of Starknet.", +// status: "Up to date", +// url: "https://www.starknet.io/en", +// }, +// { +// id: "1", +// name: "Starknet Documentation", +// description: "Official Documentation for Starknet.", +// status: "Up to date", +// url: "https://docs.starknet.io/", +// }, +// { +// id: "2", +// name: "The Starknet Book", +// description: +// "The Starknet Book is a step-by-step guide aimed at teaching you the essentials of Starknet development. This book works hand-in-hand with the Cairo Book.", +// status: "Up to date", +// url: "https://book.starknet.io/", +// }, +// { +// id: "3", +// name: "Starklings", +// description: +// "Interactive tutorial to get you up and running with Cairo v1 and Starknet.", +// status: "Up to date", +// url: "https://github.com/shramee/starklings-cairo1", +// }, +// { +// id: "4", +// name: "Awesome Starknet", +// description: +// "A curated list of awesome StarkNet resources, libraries, tools and more", +// status: "Up to date", +// url: "https://github.com/keep-starknet-strange/awesome-starknet", +// }, +// { +// id: "5", +// name: "Node Guardians", +// description: "Cairo 1.0 interactive tutorials.", +// status: "Up to date", +// url: "https://nodeguardians.io/dev-hub?s=devhub-campaigns&sc=starting-cairo", +// }, +// { +// id: "6", +// name: "Starknet messaging tutorial", +// description: "Detailed tutorial to test messaging with Anvil and Katana.", +// status: "Out of date", +// url: "https://github.com/starknet-edu/starknet-erc721", +// }, +// { +// id: "7", +// name: "Starknet Blog Posts", +// description: "Official blog posts related to Starknet.", +// status: "Up to date", +// url: "https://www.starknet.io/en/content", +// }, +// { +// id: "8", +// name: "Developers Blog", +// description: "Official Developers Blog for Starknet.", +// status: "Up to date", +// url: "https://www.starknet.io/en/content/category/developers", +// }, +// { +// id: "9", +// name: "Starknet research hub", +// description: +// "The place to learn more about the Starknet ecosystem and stay-up-to-date with the latest news.", +// status: "Up to date", +// url: "https://starknet-research.beehiiv.com/", +// }, +// { +// id: "10", +// name: "Starknet Hardhat plugin", +// description: +// "A plugin for integrating Starknet tools into Hardhat projects.", +// status: "Up to date", +// url: "https://github.com/0xSpaceShard/starknet-hardhat-plugin", +// }, +// { +// id: "11", +// name: "STARK Math: The Journey Begins", +// description: +// "Starkware's series of blog posts explaining the theory behind STARKs.", +// status: "Up to date", +// url: "https://medium.com/starkware/stark-math-the-journey-begins-51bd2b063c71", +// }, +// { +// id: "12", +// name: "Cryptography and maths", +// description: "Educational resources on cryptography and maths.", +// status: "Up to date", +// url: "https://medium.com/starkware/tagged/math", +// }, +// { +// id: "13", +// name: "Starkware verifier (StarkEx)", +// description: "Official Starkware verifier.", +// status: "Up to date", +// url: "https://github.com/starkware-libs/starkex-contracts", +// }, +// { +// id: "14", +// name: "STONE", +// description: "Prover and verifier for STARKs.", +// status: "Up to date", +// url: "https://github.com/starkware-libs/stone-prover", +// }, +// { +// id: "15", +// name: "sandstorm", +// description: "Cairo prover powered by miniSTARK.", +// status: "Up to date", +// url: "https://github.com/andrewmilson/sandstorm", +// }, +// { +// id: "16", +// name: "awesome-prover-mechanisms", +// description: +// "List of resources for prover mechanisms in the zkrollup ecosystem.", +// status: "Up to date", +// url: "https://github.com/niluferokay/awesome-prover-mechanisms", +// }, +// { +// id: "17", +// name: "Arithmetization I", +// description: "Part of Starkware's series on STARKs.", +// status: "Up to date", +// url: "https://medium.com/starkware/arithmetization-i-15c046390862", +// }, +// { +// id: "18", +// name: "Arithmetization II", +// description: "Part of Starkware's series on STARKs.", +// status: "Up to date", +// url: "https://medium.com/starkware/arithmetization-ii-403c3b3f4355", +// }, +// { +// id: "19", +// name: "YouTube channel", +// description: "Official StarkWare YouTube channel.", +// status: "Up to date", +// url: "https://www.youtube.com/@starkware_ltd", +// }, +// { +// id: "20", +// name: "Roadmap", +// description: "What’s coming next for Starknet.", +// status: "Up to date", +// url: "https://starknet.io/#roadmap", +// }, +// { +// id: "21", +// name: "SNIPs", +// description: "Starknet Improvement Proposals (SNIPs) repository.", +// status: "Up to date", +// url: "https://github.com/starknet-io/snips", +// }, +// { +// id: "22", +// name: "starkware-libs/cairo", +// description: "Official Cairo Github repository.", +// status: "Up to date", +// url: "https://github.com/starkware-libs/cairo", +// }, +// { +// id: "23", +// name: "Cairopractice", +// description: +// "Cairo blog covering various aspects of the language and its applications.", +// status: "Up to date", +// url: "https://cairopractice.com/", +// }, +// { +// id: "24", +// name: "Cairo – a Turing-complete STARK-friendly CPU architecture", +// description: +// "Whitepaper providing an in-depth look into the Cairo architecture and its STARK-friendly features.", +// status: "Up to date", +// url: "https://eprint.iacr.org/2021/1063.pdf", +// }, +// { +// id: "25", +// name: "A verified algebraic representation of Cairo program execution", +// description: +// "Proof demonstrating the soundness of Cairo's execution using the Lean proof assistant.", +// status: "Up to date", +// url: "https://arxiv.org/abs/2109.14534", +// }, +// { +// id: "26", +// name: "WTF Starknet", +// description: +// "English and Chinese tutorials covering various aspects of Starknet.", +// status: "Up to date", +// url: "https://github.com/WTFAcademy/WTF-Starknet", +// }, +// { +// id: "27", +// name: "ethSTARK Documentation", +// description: "Explanation of the computational integrity of STARKs.", +// status: "Up to date", +// url: "https://eprint.iacr.org/2021/58", +// }, +// { +// id: "28", +// name: "STARK Paper", +// description: "Original paper introducing STARKs.", +// status: "Up to date", +// url: "https://www.starkware.co/stark", +// }, +// { +// id: "29", +// name: "FRI Protocol", +// description: +// "Explanation of the Fast Reed-Solomon Interactive Oracle Proofs (FRI) protocol.", +// status: "Up to date", +// url: "https://en.wikipedia.org/wiki/FRI_protocol", +// }, +// { +// id: "30", +// name: "DEEP-FRI Protocol", +// description: +// "Explanation of the DEEP-FRI protocol, an improvement over FRI.", +// status: "Up to date", +// url: "https://arxiv.org/abs/1903.12243", +// }, +// { +// id: "31", +// name: "Aurora", +// description: "Transparent Succinct Arguments for R1CS.", +// status: "Up to date", +// url: "https://eprint.iacr.org/2020/705.pdf", +// }, +// { +// id: "32", +// name: "Starknet Developer Tools", +// description: +// "Official documentation for Starknet developer tools, including setup guides and usage instructions.", +// status: "Up to date", +// url: "https://docs.starknet.io/documentation/tools/devtools/", +// }, +// { +// id: "33", +// name: "Starknet.js SDK", +// description: "Javascript library.", +// status: "Up to date", +// url: "https://www.starknetjs.com/", +// }, +// { +// id: "34", +// name: "Starknet.py SDK", +// description: "Python library.", +// status: "Up to date", +// url: "https://github.com/software-mansion/starknet.py", +// }, +// { +// id: "35", +// name: "Starknet-rs SDK", +// description: "Rust Library.", +// status: "Up to date", +// url: "https://github.com/xJonathanLEI/starknet-rs", +// }, +// { +// id: "36", +// name: "cairo-vm", +// description: "Rust implementation of the Cairo VM.", +// status: "Up to date", +// url: "https://github.com/lambdaclass/cairo-vm", +// }, +// { +// id: "37", +// name: "cairo-vm-go", +// description: "Golang implementation of the Cairo VM.", +// status: "Up to date", +// url: "https://github.com/NethermindEth/cairo-vm-go", +// }, +// { +// id: "38", +// name: "cairo-vm_in_go", +// description: "Another Golang implementation of the Cairo VM.", +// status: "Up to date", +// url: "https://github.com/lambdaclass/cairo-vm_in_go", +// }, +// { +// id: "39", +// name: "cairo-zig", +// description: "Zig implementation of the Cairo VM.", +// status: "Up to date", +// url: "https://github.com/keep-starknet-strange/ziggy-starkdust", +// }, +// { +// id: "40", +// name: "Setting up your environment", +// description: "Environment setup guide for Starknet development.", +// status: "Up to date", +// url: "https://docs.starknet.io/documentation/quick_start/environment_setup/", +// }, +// { +// id: "41", +// name: "Starkli", +// description: "The recommended CLI for Starknet development.", +// status: "Up to date", +// url: "https://book.starkli.rs/", +// }, +// { +// id: "42", +// name: "Scarb", +// description: +// "The recommended build toolchain and package manager for Starknet development.", +// status: "Up to date", +// url: "https://docs.swmansion.com/scarb", +// }, +// { +// id: "43", +// name: "Vscode Cairo extension", +// description: +// "Official Cairo extension for VSCode with diagnostics, go-to-definition, completion and more.", +// status: "Up to date", +// url: "https://marketplace.visualstudio.com/items?itemName=starkware.cairo1", +// }, +// { +// id: "44", +// name: "Vim plugin for Scarb projects", +// description: "Vim plugin for projects built with Scarb.", +// status: "Up to date", +// url: "https://github.com/swan-of-bodom/scarb-vim", +// }, +// { +// id: "45", +// name: "Starknet Foundry", +// description: +// "Toolchain for smart contracts development, testing and deployment on Starknet.", +// status: "Up to date", +// url: "https://foundry-rs.github.io/starknet-foundry/", +// }, +// { +// id: "46", +// name: "Starknet Foundry Forge Template", +// description: "Template for starting projects with Starknet Foundry.", +// status: "Up to date", +// url: "https://github.com/foundry-rs/starknet_forge_template", +// }, +// { +// id: "47", +// name: "Starknet Remix", +// description: +// "The official Starknet plugin for Remix, a browser-based IDE without the need for any installation.", +// status: "Up to date", +// url: "https://remix.ethereum.org/?#activate=Starknet", +// }, +// { +// id: "48", +// name: "Starknet Devnet", +// description: "Local testnet for Starknet development.", +// status: "Up to date", +// url: "https://github.com/0xSpaceShard/starknet-devnet-rs", +// }, +// { +// id: "49", +// name: "Katana", +// description: +// "High performance sequencer that can be used as a local testnet for Starknet.", +// status: "Up to date", +// url: "https://book.dojoengine.org/toolchain/katana/overview", +// }, +// { +// id: "50", +// name: "Starknet Hardhat plugin", +// description: +// "Plugin for integrating Starknet tools into Hardhat projects.", +// status: "Up to date", +// url: "https://github.com/Shard-Labs/starknet-hardhat-plugin", +// }, +// { +// id: "51", +// name: "starknet-hardhat-example", +// description: +// "Example project demonstrating the usage of the Starknet Hardhat plugin.", +// status: "Up to date", +// url: "https://github.com/0xSpaceShard/starknet-hardhat-example", +// }, +// { +// id: "52", +// name: "docker-cairo", +// description: "Multi-arch Docker images with Cairo binaries.", +// status: "Up to date", +// url: "https://github.com/xJonathanLEI/docker-cairo", +// }, +// { +// id: "53", +// name: "DappLand", +// description: "The best Starknet Dapps. Built by Argent.", +// status: "Up to date", +// url: "https://www.dappland.com/", +// }, +// { +// id: "54", +// name: "Starknet dApps and tools", +// description: +// "Unofficial ecosystem page for Ethereum and its layer 2s like Starknet.", +// status: "Up to date", +// url: "https://www.ethereum-ecosystem.com/blockchains/starknet", +// }, +// { +// id: "55", +// name: "The Cairo Book", +// description: "Official Cairo documentation by the community", +// status: "Up to date", +// url: "https://book.cairo-lang.org/", +// }, +// ]; +// } -export default async function Page() { - const data = await getData(); +const data = [ + { + id: "0", + name: "Starknet Website", + description: "Official Website of Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en", + category: "official-website", + }, + { + id: "1", + name: "Starknet Documentation", + description: "Official Documentation for Starknet.", + status: "Up to date", + url: "https://docs.starknet.io/", + category: "documentation", + }, + { + id: "2", + name: "The Starknet Book", + description: + "The Starknet Book is a step-by-step guide aimed at teaching you the essentials of Starknet development. This book works hand-in-hand with the Cairo Book.", + status: "Up to date", + url: "https://book.starknet.io/", + category: "tutorials", + }, + { + id: "3", + name: "Starklings", + description: + "Interactive tutorial to get you up and running with Cairo v1 and Starknet.", + status: "Up to date", + url: "https://github.com/shramee/starklings-cairo1", + category: "tutorials", + }, + { + id: "4", + name: "Awesome Starknet", + description: + "A curated list of awesome StarkNet resources, libraries, tools and more", + status: "Up to date", + url: "https://github.com/keep-starknet-strange/awesome-starknet", + category: "documentation", + }, + { + id: "5", + name: "Node Guardians", + description: "Cairo 1.0 interactive tutorials.", + status: "Up to date", + url: "https://nodeguardians.io/dev-hub?s=devhub-campaigns&sc=starting-cairo", + category: "tutorials", + }, + { + id: "6", + name: "Starknet messaging tutorial", + description: "Detailed tutorial to test messaging with Anvil and Katana.", + status: "Out of date", + url: "https://github.com/starknet-edu/starknet-erc721", + category: "tutorials", + }, + { + id: "7", + name: "Starknet Blog Posts", + description: "Official blog posts related to Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en/content", + category: "blogs", + }, + { + id: "8", + name: "Developers Blog", + description: "Official Developers Blog for Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en/content/category/developers", + category: "blogs", + }, + { + id: "9", + name: "Starknet research hub", + description: + "The place to learn more about the Starknet ecosystem and stay-up-to-date with the latest news.", + status: "Up to date", + url: "https://starknet-research.beehiiv.com/", + category: "official-website", + }, + { + id: "10", + name: "Starknet Hardhat plugin", + description: + "A plugin for integrating Starknet tools into Hardhat projects.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-hardhat-plugin", + category: "plugins", + }, + { + id: "11", + name: "STARK Math: The Journey Begins", + description: + "Starkware's series of blog posts explaining the theory behind STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/stark-math-the-journey-begins-51bd2b063c71", + category: "blogs", + }, + { + id: "12", + name: "Cryptography and maths", + description: "Educational resources on cryptography and maths.", + status: "Up to date", + url: "https://medium.com/starkware/tagged/math", + category: "tutorials", + }, + { + id: "13", + name: "Starkware verifier (StarkEx)", + description: "Official Starkware verifier.", + status: "Up to date", + url: "https://github.com/starkware-libs/starkex-contracts", + category: "documentation", + }, + { + id: "14", + name: "STONE", + description: "Prover and verifier for STARKs.", + status: "Up to date", + url: "https://github.com/starkware-libs/stone-prover", + category: "documentation", + }, + { + id: "15", + name: "sandstorm", + description: "Cairo prover powered by miniSTARK.", + status: "Up to date", + url: "https://github.com/andrewmilson/sandstorm", + category: "documentation", + }, + { + id: "16", + name: "awesome-prover-mechanisms", + description: + "List of resources for prover mechanisms in the zkrollup ecosystem.", + status: "Up to date", + url: "https://github.com/niluferokay/awesome-prover-mechanisms", + category: "documentation", + }, + { + id: "17", + name: "Arithmetization I", + description: "Part of Starkware's series on STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/arithmetization-i-15c046390862", + category: "blogs", + }, + { + id: "18", + name: "Arithmetization II", + description: "Part of Starkware's series on STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/arithmetization-ii-403c3b3f4355", + category: "blogs", + }, + { + id: "19", + name: "YouTube channel", + description: "Official StarkWare YouTube channel.", + status: "Up to date", + url: "https://www.youtube.com/@starkware_ltd", + category: "tutorials", + }, + { + id: "20", + name: "Roadmap", + description: "What’s coming next for Starknet.", + status: "Up to date", + url: "https://starknet.io/#roadmap", + category: "official-website", + }, + { + id: "21", + name: "SNIPs", + description: "Starknet Improvement Proposals (SNIPs) repository.", + status: "Up to date", + url: "https://github.com/starknet-io/snips", + category: "documentation", + }, + { + id: "22", + name: "starkware-libs/cairo", + description: "Official Cairo Github repository.", + status: "Up to date", + url: "https://github.com/starkware-libs/cairo", + category: "documentation", + }, + { + id: "23", + name: "Cairopractice", + description: + "Cairo blog covering various aspects of the language and its applications.", + status: "Up to date", + url: "https://cairopractice.com/", + category: "blogs", + }, + { + id: "24", + name: "Cairo – a Turing-complete STARK-friendly CPU architecture", + description: + "Whitepaper providing an in-depth look into the Cairo architecture and its STARK-friendly features.", + status: "Up to date", + url: "https://eprint.iacr.org/2021/1063.pdf", + category: "documentation", + }, + { + id: "25", + name: "A verified algebraic representation of Cairo program execution", + description: + "Proof demonstrating the soundness of Cairo's execution using the Lean proof assistant.", + status: "Up to date", + url: "https://arxiv.org/abs/2109.14534", + category: "documentation", + }, + { + id: "26", + name: "WTF Starknet", + description: + "English and Chinese tutorials covering various aspects of Starknet.", + status: "Up to date", + url: "https://github.com/WTFAcademy/WTF-Starknet", + category: "tutorials", + }, + { + id: "27", + name: "ethSTARK Documentation", + description: "Explanation of the computational integrity of STARKs.", + status: "Up to date", + url: "https://eprint.iacr.org/2021/58", + category: "documentation", + }, + { + id: "28", + name: "STARK Paper", + description: "Original paper introducing STARKs.", + status: "Up to date", + url: "https://www.starkware.co/stark", + category: "documentation", + }, + { + id: "29", + name: "FRI Protocol", + description: + "Explanation of the Fast Reed-Solomon Interactive Oracle Proofs (FRI) protocol.", + status: "Up to date", + url: "https://en.wikipedia.org/wiki/FRI_protocol", + category: "documentation", + }, + { + id: "30", + name: "DEEP-FRI Protocol", + description: + "Explanation of the DEEP-FRI protocol, an improvement over FRI.", + status: "Up to date", + url: "https://arxiv.org/abs/1903.12243", + category: "documentation", + }, + { + id: "31", + name: "Aurora", + description: "Transparent Succinct Arguments for R1CS.", + status: "Up to date", + url: "https://eprint.iacr.org/2020/705.pdf", + category: "documentation", + }, + { + id: "32", + name: "Starknet Developer Tools", + description: + "Official documentation for Starknet developer tools, including setup guides and usage instructions.", + status: "Up to date", + url: "https://docs.starknet.io/documentation/tools/devtools/", + category: "documentation", + }, + { + id: "33", + name: "Starknet.js SDK", + description: "Javascript library.", + status: "Up to date", + url: "https://www.starknetjs.com/", + category: "sdk", + }, + { + id: "34", + name: "Starknet.py SDK", + description: "Python library.", + status: "Up to date", + url: "https://github.com/software-mansion/starknet.py", + category: "sdk", + }, + { + id: "35", + name: "Starknet-rs SDK", + description: "Rust Library.", + status: "Up to date", + url: "https://github.com/xJonathanLEI/starknet-rs", + category: "sdk", + }, + { + id: "36", + name: "cairo-vm", + description: "Rust implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/lambdaclass/cairo-vm", + category: "documentation", + }, + { + id: "37", + name: "cairo-vm-go", + description: "Golang implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/NethermindEth/cairo-vm-go", + category: "documentation", + }, + { + id: "38", + name: "cairo-vm_in_go", + description: "Another Golang implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/lambdaclass/cairo-vm_in_go", + category: "documentation", + }, + { + id: "39", + name: "cairo-zig", + description: "Zig implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/keep-starknet-strange/ziggy-starkdust", + category: "documentation", + }, + { + id: "40", + name: "Setting up your environment", + description: "Environment setup guide for Starknet development.", + status: "Up to date", + url: "https://docs.starknet.io/documentation/quick_start/environment_setup/", + category: "tutorials", + }, + { + id: "41", + name: "Starkli", + description: "The recommended CLI for Starknet development.", + status: "Up to date", + url: "https://book.starkli.rs/", + category: "documentation", + }, + { + id: "42", + name: "Scarb", + description: + "The recommended build toolchain and package manager for Starknet development.", + status: "Up to date", + url: "https://docs.swmansion.com/scarb", + category: "documentation", + }, + { + id: "43", + name: "Vscode Cairo extension", + description: + "Official Cairo extension for VSCode with diagnostics, go-to-definition, completion and more.", + status: "Up to date", + url: "https://marketplace.visualstudio.com/items?itemName=starkware.cairo1", + category: "plugins", + }, + { + id: "44", + name: "Vim plugin for Scarb projects", + description: "Vim plugin for projects built with Scarb.", + status: "Up to date", + url: "https://github.com/swan-of-bodom/scarb-vim", + category: "plugins", + }, + { + id: "45", + name: "Starknet Foundry", + description: + "Toolchain for smart contracts development, testing and deployment on Starknet.", + status: "Up to date", + url: "https://foundry-rs.github.io/starknet-foundry/", + category: "documentation", + }, + { + id: "46", + name: "Starknet Foundry Forge Template", + description: "Template for starting projects with Starknet Foundry.", + status: "Up to date", + url: "https://github.com/foundry-rs/starknet_forge_template", + category: "documentation", + }, + { + id: "47", + name: "Starknet Remix", + description: + "The official Starknet plugin for Remix, a browser-based IDE without the need for any installation.", + status: "Up to date", + url: "https://remix.ethereum.org/?#activate=Starknet", + category: "plugins", + }, + { + id: "48", + name: "Starknet Devnet", + description: "Local testnet for Starknet development.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-devnet-rs", + category: "documentation", + }, + { + id: "49", + name: "Katana", + description: + "High performance sequencer that can be used as a local testnet for Starknet.", + status: "Up to date", + url: "https://book.dojoengine.org/toolchain/katana/overview", + category: "documentation", + }, + { + id: "50", + name: "Starknet Hardhat plugin", + description: "Plugin for integrating Starknet tools into Hardhat projects.", + status: "Up to date", + url: "https://github.com/Shard-Labs/starknet-hardhat-plugin", + category: "plugins", + }, + { + id: "51", + name: "starknet-hardhat-example", + description: + "Example project demonstrating the usage of the Starknet Hardhat plugin.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-hardhat-example", + category: "documentation", + }, + { + id: "52", + name: "docker-cairo", + description: "Multi-arch Docker images with Cairo binaries.", + status: "Up to date", + url: "https://github.com/xJonathanLEI/docker-cairo", + category: "documentation", + }, + { + id: "53", + name: "DappLand", + description: "The best Starknet Dapps. Built by Argent.", + status: "Up to date", + url: "https://www.dappland.com/", + category: "official-website", + }, + { + id: "54", + name: "Starknet dApps and tools", + description: + "Unofficial ecosystem page for Ethereum and its layer 2s like Starknet.", + status: "Up to date", + url: "https://www.ethereum-ecosystem.com/blockchains/starknet", + category: "official-website", + }, + { + id: "55", + name: "The Cairo Book", + description: "Official Cairo documentation by the community", + status: "Up to date", + url: "https://book.cairo-lang.org/", + category: "documentation", + }, +]; +export default function Page() { + const { theme, changeTheme } = useTheme(); + const [openMenu, setOpenMenu] = useState(false); return ( -
- +
+
+
+
+ logo +

+ wikipedia +

+
+ +
+
+ + search +
+
+
+ + +
); } diff --git a/frontend/src/app/wikipedia/resource-card.tsx b/frontend/src/app/wikipedia/resource-card.tsx new file mode 100644 index 0000000..12c7f84 --- /dev/null +++ b/frontend/src/app/wikipedia/resource-card.tsx @@ -0,0 +1,43 @@ +"use client"; +import Image from "next/image"; +import logo from "../../../public/assets/starknetLogo.svg"; +import arr from "../../../public/assets/linkArrow.svg"; +import verify from "../../../public/assets/verified-icon.svg"; +import Link from "next/link"; + +export default function ResourceCard({ resource }: { resource: any }) { + return ( + +
+
+
+ resource-logo +
+
+

+ {resource.name} +

+

+ {resource.url} +

+
+
+ redirect +
+
+ {resource.description} +
+
+
+ verify + UP TO DATE +
+
+ + ); +} diff --git a/frontend/src/app/wikipedia/resources.tsx b/frontend/src/app/wikipedia/resources.tsx new file mode 100644 index 0000000..5043286 --- /dev/null +++ b/frontend/src/app/wikipedia/resources.tsx @@ -0,0 +1,67 @@ +"use client"; +import { useSearchParams } from "next/navigation"; +import Pagination from "../components/ui_components/pagination"; +import ResourceCard from "./resource-card"; +import { useEffect, useState } from "react"; + +export default function Resources({ data }: { data: any }) { + const searchParams = useSearchParams(); + const [filteredResources, setFilteredResources] = useState([]); + // 1. FILTER + const category = searchParams.get("category") || "all"; + const page = searchParams.get("page") || "1"; + + const from = (+page - 1) * 10; + const to = from + (10 - 1); + + useEffect(() => { + if (category === "all") { + setFilteredResources(data); + } + if (category === "tutorials") { + setFilteredResources( + data.filter((resource: any) => resource.category === "tutorials"), + ); + } + if (category === "blogs") { + setFilteredResources( + data.filter((resource: any) => resource.category === "blogs"), + ); + } + if (category === "plugins") { + setFilteredResources( + data.filter((resource: any) => resource.category === "plugins"), + ); + } + if (category === "sdk") { + setFilteredResources( + data.filter((resource: any) => resource.category === "sdk"), + ); + } + if (category === "documentation") { + setFilteredResources( + data.filter((resource: any) => resource.category === "documentation"), + ); + } + if (category === "official-website") { + setFilteredResources( + data.filter( + (resource: any) => resource.category === "official-website", + ), + ); + } + }, [category]); + + return ( +
+
+ {filteredResources.slice(from, to).map((item: any, i: number) => ( + + ))} +
+
+ +
+
+ ); +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 656abc8..fc68efd 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4044,10 +4044,10 @@ react-hot-toast@^2.4.1: dependencies: goober "^2.1.10" -react-icons@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz" - integrity sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw== +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== react-is@^16.13.1: version "16.13.1" From 2f2ed4a76e1b462745e438e5fcc0de8aea1a3a0f Mon Sep 17 00:00:00 2001 From: Oshioke-Salaki Date: Sat, 3 Aug 2024 20:34:44 +0100 Subject: [PATCH 5/7] refac: card hover, wiki dark mode, search --- frontend/public/assets/cheveron-down.svg | 3 - frontend/public/assets/cheveron-up.svg | 3 - frontend/public/assets/filter-icon.svg | 10 - .../components/ui_components/pagination.tsx | 4 +- frontend/src/app/hooks/index.ts | 15 + frontend/src/app/page.tsx | 110 +- frontend/src/app/types/index.ts | 8 + frontend/src/app/utils/index.ts | 492 +++++++++ .../src/app/wikipedia/category-button.tsx | 10 +- frontend/src/app/wikipedia/filter.tsx | 20 +- frontend/src/app/wikipedia/page.tsx | 937 +----------------- frontend/src/app/wikipedia/resources.tsx | 49 +- 12 files changed, 634 insertions(+), 1027 deletions(-) delete mode 100644 frontend/public/assets/cheveron-down.svg delete mode 100644 frontend/public/assets/cheveron-up.svg delete mode 100644 frontend/public/assets/filter-icon.svg create mode 100644 frontend/src/app/hooks/index.ts create mode 100644 frontend/src/app/types/index.ts create mode 100644 frontend/src/app/utils/index.ts diff --git a/frontend/public/assets/cheveron-down.svg b/frontend/public/assets/cheveron-down.svg deleted file mode 100644 index 1b54428..0000000 --- a/frontend/public/assets/cheveron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/public/assets/cheveron-up.svg b/frontend/public/assets/cheveron-up.svg deleted file mode 100644 index a391f4d..0000000 --- a/frontend/public/assets/cheveron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/public/assets/filter-icon.svg b/frontend/public/assets/filter-icon.svg deleted file mode 100644 index 190a156..0000000 --- a/frontend/public/assets/filter-icon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/src/app/components/ui_components/pagination.tsx b/frontend/src/app/components/ui_components/pagination.tsx index d68e025..542292d 100644 --- a/frontend/src/app/components/ui_components/pagination.tsx +++ b/frontend/src/app/components/ui_components/pagination.tsx @@ -27,13 +27,13 @@ export default function Pagination({ count }: { count: number }) { if (pageCount <= 1) return null; return ( -
+

Showing {(currentPage - 1) * PAGE_SIZE + 1} to{" "} {currentPage === pageCount ? count : currentPage * PAGE_SIZE} {" "} - of {count} results + of {count} results

-
+
- +

Scaffold Burner Wallet redirect - +

Generate temporary wallets which can be used during the course of development

-
-
+ +
- +

Scaffold Faucet redirect - +

A SepETH/SepSTRK faucet for claiming ETH/STRK Sepolia testnet tokens @@ -73,22 +73,22 @@ export default function Home() { alt="faucet banner" className="absolute z-[1] top-[60px] left-[-10px]" /> -

+
-
+
- +

Scaffold Deployer redirect - +

A simple tool for seamlessly deploying smart contracts to Starknet testnet and mainnet @@ -99,22 +99,22 @@ export default function Home() { alt="deployer banner" className="absolute z-[1] top-[140px] left-[-2px]" /> -

+
-
+
- +

Scaffold Wikipedia redirect - +

A collection of Starknet/Cairo learning resources in the ecosystem @@ -125,20 +125,20 @@ export default function Home() { alt="wikipedia banner" className="absolute z-[1] top-[126px] left-[41px]" /> -

-
+ +
- +

Stark Converter redirect - +

A collection of utility functions for Starknet/Cairo related conversions @@ -149,21 +149,21 @@ export default function Home() { alt="converter banner" className="absolute z-[1] top-[40px] right-[0px]" /> -

+
-
+
- +

Address Book redirect - +

A collection of all relevant contract addresses on Starknet

@@ -173,7 +173,7 @@ export default function Home() { alt="Address book banner" className="absolute z-[1] top-[0px] right-[0px]" /> -
+
diff --git a/frontend/src/app/types/index.ts b/frontend/src/app/types/index.ts new file mode 100644 index 0000000..44881a6 --- /dev/null +++ b/frontend/src/app/types/index.ts @@ -0,0 +1,8 @@ +export interface WikipediaResource { + id: string; + name: string; + description: string; + status: string; + url: string; + category: string; +} diff --git a/frontend/src/app/utils/index.ts b/frontend/src/app/utils/index.ts new file mode 100644 index 0000000..df72ff8 --- /dev/null +++ b/frontend/src/app/utils/index.ts @@ -0,0 +1,492 @@ +import { WikipediaResource } from "../types"; + +export const wikipediaResources = [ + { + id: "0", + name: "Starknet Website", + description: "Official Website of Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en", + category: "official-website", + }, + { + id: "1", + name: "Starknet Documentation", + description: "Official Documentation for Starknet.", + status: "Up to date", + url: "https://docs.starknet.io/", + category: "documentation", + }, + { + id: "2", + name: "The Starknet Book", + description: + "The Starknet Book is a step-by-step guide aimed at teaching you the essentials of Starknet development. This book works hand-in-hand with the Cairo Book.", + status: "Up to date", + url: "https://book.starknet.io/", + category: "tutorials", + }, + { + id: "3", + name: "Starklings", + description: + "Interactive tutorial to get you up and running with Cairo v1 and Starknet.", + status: "Up to date", + url: "https://github.com/shramee/starklings-cairo1", + category: "tutorials", + }, + { + id: "4", + name: "Awesome Starknet", + description: + "A curated list of awesome StarkNet resources, libraries, tools and more", + status: "Up to date", + url: "https://github.com/keep-starknet-strange/awesome-starknet", + category: "documentation", + }, + { + id: "5", + name: "Node Guardians", + description: "Cairo 1.0 interactive tutorials.", + status: "Up to date", + url: "https://nodeguardians.io/dev-hub?s=devhub-campaigns&sc=starting-cairo", + category: "tutorials", + }, + { + id: "6", + name: "Starknet messaging tutorial", + description: "Detailed tutorial to test messaging with Anvil and Katana.", + status: "Out of date", + url: "https://github.com/starknet-edu/starknet-erc721", + category: "tutorials", + }, + { + id: "7", + name: "Starknet Blog Posts", + description: "Official blog posts related to Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en/content", + category: "blogs", + }, + { + id: "8", + name: "Developers Blog", + description: "Official Developers Blog for Starknet.", + status: "Up to date", + url: "https://www.starknet.io/en/content/category/developers", + category: "blogs", + }, + { + id: "9", + name: "Starknet research hub", + description: + "The place to learn more about the Starknet ecosystem and stay-up-to-date with the latest news.", + status: "Up to date", + url: "https://starknet-research.beehiiv.com/", + category: "official-website", + }, + { + id: "10", + name: "Starknet Hardhat plugin", + description: + "A plugin for integrating Starknet tools into Hardhat projects.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-hardhat-plugin", + category: "plugins", + }, + { + id: "11", + name: "STARK Math: The Journey Begins", + description: + "Starkware's series of blog posts explaining the theory behind STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/stark-math-the-journey-begins-51bd2b063c71", + category: "blogs", + }, + { + id: "12", + name: "Cryptography and maths", + description: "Educational resources on cryptography and maths.", + status: "Up to date", + url: "https://medium.com/starkware/tagged/math", + category: "tutorials", + }, + { + id: "13", + name: "Starkware verifier (StarkEx)", + description: "Official Starkware verifier.", + status: "Up to date", + url: "https://github.com/starkware-libs/starkex-contracts", + category: "documentation", + }, + { + id: "14", + name: "STONE", + description: "Prover and verifier for STARKs.", + status: "Up to date", + url: "https://github.com/starkware-libs/stone-prover", + category: "documentation", + }, + { + id: "15", + name: "sandstorm", + description: "Cairo prover powered by miniSTARK.", + status: "Up to date", + url: "https://github.com/andrewmilson/sandstorm", + category: "documentation", + }, + { + id: "16", + name: "awesome-prover-mechanisms", + description: + "List of resources for prover mechanisms in the zkrollup ecosystem.", + status: "Up to date", + url: "https://github.com/niluferokay/awesome-prover-mechanisms", + category: "documentation", + }, + { + id: "17", + name: "Arithmetization I", + description: "Part of Starkware's series on STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/arithmetization-i-15c046390862", + category: "blogs", + }, + { + id: "18", + name: "Arithmetization II", + description: "Part of Starkware's series on STARKs.", + status: "Up to date", + url: "https://medium.com/starkware/arithmetization-ii-403c3b3f4355", + category: "blogs", + }, + { + id: "19", + name: "YouTube channel", + description: "Official StarkWare YouTube channel.", + status: "Up to date", + url: "https://www.youtube.com/@starkware_ltd", + category: "tutorials", + }, + { + id: "20", + name: "Roadmap", + description: "What’s coming next for Starknet.", + status: "Up to date", + url: "https://starknet.io/#roadmap", + category: "official-website", + }, + { + id: "21", + name: "SNIPs", + description: "Starknet Improvement Proposals (SNIPs) repository.", + status: "Up to date", + url: "https://github.com/starknet-io/snips", + category: "documentation", + }, + { + id: "22", + name: "starkware-libs/cairo", + description: "Official Cairo Github repository.", + status: "Up to date", + url: "https://github.com/starkware-libs/cairo", + category: "documentation", + }, + { + id: "23", + name: "Cairopractice", + description: + "Cairo blog covering various aspects of the language and its applications.", + status: "Up to date", + url: "https://cairopractice.com/", + category: "blogs", + }, + { + id: "24", + name: "Cairo – a Turing-complete STARK-friendly CPU architecture", + description: + "Whitepaper providing an in-depth look into the Cairo architecture and its STARK-friendly features.", + status: "Up to date", + url: "https://eprint.iacr.org/2021/1063.pdf", + category: "documentation", + }, + { + id: "25", + name: "A verified algebraic representation of Cairo program execution", + description: + "Proof demonstrating the soundness of Cairo's execution using the Lean proof assistant.", + status: "Up to date", + url: "https://arxiv.org/abs/2109.14534", + category: "documentation", + }, + { + id: "26", + name: "WTF Starknet", + description: + "English and Chinese tutorials covering various aspects of Starknet.", + status: "Up to date", + url: "https://github.com/WTFAcademy/WTF-Starknet", + category: "tutorials", + }, + { + id: "27", + name: "ethSTARK Documentation", + description: "Explanation of the computational integrity of STARKs.", + status: "Up to date", + url: "https://eprint.iacr.org/2021/58", + category: "documentation", + }, + { + id: "28", + name: "STARK Paper", + description: "Original paper introducing STARKs.", + status: "Up to date", + url: "https://www.starkware.co/stark", + category: "documentation", + }, + { + id: "29", + name: "FRI Protocol", + description: + "Explanation of the Fast Reed-Solomon Interactive Oracle Proofs (FRI) protocol.", + status: "Up to date", + url: "https://en.wikipedia.org/wiki/FRI_protocol", + category: "documentation", + }, + { + id: "30", + name: "DEEP-FRI Protocol", + description: + "Explanation of the DEEP-FRI protocol, an improvement over FRI.", + status: "Up to date", + url: "https://arxiv.org/abs/1903.12243", + category: "documentation", + }, + { + id: "31", + name: "Aurora", + description: "Transparent Succinct Arguments for R1CS.", + status: "Up to date", + url: "https://eprint.iacr.org/2020/705.pdf", + category: "documentation", + }, + { + id: "32", + name: "Starknet Developer Tools", + description: + "Official documentation for Starknet developer tools, including setup guides and usage instructions.", + status: "Up to date", + url: "https://docs.starknet.io/documentation/tools/devtools/", + category: "documentation", + }, + { + id: "33", + name: "Starknet.js SDK", + description: "Javascript library.", + status: "Up to date", + url: "https://www.starknetjs.com/", + category: "sdk", + }, + { + id: "34", + name: "Starknet.py SDK", + description: "Python library.", + status: "Up to date", + url: "https://github.com/software-mansion/starknet.py", + category: "sdk", + }, + { + id: "35", + name: "Starknet-rs SDK", + description: "Rust Library.", + status: "Up to date", + url: "https://github.com/xJonathanLEI/starknet-rs", + category: "sdk", + }, + { + id: "36", + name: "cairo-vm", + description: "Rust implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/lambdaclass/cairo-vm", + category: "documentation", + }, + { + id: "37", + name: "cairo-vm-go", + description: "Golang implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/NethermindEth/cairo-vm-go", + category: "documentation", + }, + { + id: "38", + name: "cairo-vm_in_go", + description: "Another Golang implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/lambdaclass/cairo-vm_in_go", + category: "documentation", + }, + { + id: "39", + name: "cairo-zig", + description: "Zig implementation of the Cairo VM.", + status: "Up to date", + url: "https://github.com/keep-starknet-strange/ziggy-starkdust", + category: "documentation", + }, + { + id: "40", + name: "Setting up your environment", + description: "Environment setup guide for Starknet development.", + status: "Up to date", + url: "https://docs.starknet.io/documentation/quick_start/environment_setup/", + category: "tutorials", + }, + { + id: "41", + name: "Starkli", + description: "The recommended CLI for Starknet development.", + status: "Up to date", + url: "https://book.starkli.rs/", + category: "documentation", + }, + { + id: "42", + name: "Scarb", + description: + "The recommended build toolchain and package manager for Starknet development.", + status: "Up to date", + url: "https://docs.swmansion.com/scarb", + category: "documentation", + }, + { + id: "43", + name: "Vscode Cairo extension", + description: + "Official Cairo extension for VSCode with diagnostics, go-to-definition, completion and more.", + status: "Up to date", + url: "https://marketplace.visualstudio.com/items?itemName=starkware.cairo1", + category: "plugins", + }, + { + id: "44", + name: "Vim plugin for Scarb projects", + description: "Vim plugin for projects built with Scarb.", + status: "Up to date", + url: "https://github.com/swan-of-bodom/scarb-vim", + category: "plugins", + }, + { + id: "45", + name: "Starknet Foundry", + description: + "Toolchain for smart contracts development, testing and deployment on Starknet.", + status: "Up to date", + url: "https://foundry-rs.github.io/starknet-foundry/", + category: "documentation", + }, + { + id: "46", + name: "Starknet Foundry Forge Template", + description: "Template for starting projects with Starknet Foundry.", + status: "Up to date", + url: "https://github.com/foundry-rs/starknet_forge_template", + category: "documentation", + }, + { + id: "47", + name: "Starknet Remix", + description: + "The official Starknet plugin for Remix, a browser-based IDE without the need for any installation.", + status: "Up to date", + url: "https://remix.ethereum.org/?#activate=Starknet", + category: "plugins", + }, + { + id: "48", + name: "Starknet Devnet", + description: "Local testnet for Starknet development.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-devnet-rs", + category: "documentation", + }, + { + id: "49", + name: "Katana", + description: + "High performance sequencer that can be used as a local testnet for Starknet.", + status: "Up to date", + url: "https://book.dojoengine.org/toolchain/katana/overview", + category: "documentation", + }, + { + id: "50", + name: "Starknet Hardhat plugin", + description: "Plugin for integrating Starknet tools into Hardhat projects.", + status: "Up to date", + url: "https://github.com/Shard-Labs/starknet-hardhat-plugin", + category: "plugins", + }, + { + id: "51", + name: "starknet-hardhat-example", + description: + "Example project demonstrating the usage of the Starknet Hardhat plugin.", + status: "Up to date", + url: "https://github.com/0xSpaceShard/starknet-hardhat-example", + category: "documentation", + }, + { + id: "52", + name: "docker-cairo", + description: "Multi-arch Docker images with Cairo binaries.", + status: "Up to date", + url: "https://github.com/xJonathanLEI/docker-cairo", + category: "documentation", + }, + { + id: "53", + name: "DappLand", + description: "The best Starknet Dapps. Built by Argent.", + status: "Up to date", + url: "https://www.dappland.com/", + category: "official-website", + }, + { + id: "54", + name: "Starknet dApps and tools", + description: + "Unofficial ecosystem page for Ethereum and its layer 2s like Starknet.", + status: "Up to date", + url: "https://www.ethereum-ecosystem.com/blockchains/starknet", + category: "official-website", + }, + { + id: "55", + name: "The Cairo Book", + description: "Official Cairo documentation by the community", + status: "Up to date", + url: "https://book.cairo-lang.org/", + category: "documentation", + }, +]; + +export const searchResources = async ({ + resources, + search, +}: { + search: string; + resources: WikipediaResource[]; +}) => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + const lowerCaseSearch = search.toLocaleLowerCase(); + + return resources.filter( + (resource) => + resource.name.toLocaleLowerCase().includes(lowerCaseSearch) || + resource.description.toLocaleLowerCase().includes(lowerCaseSearch) || + resource.url.toLocaleLowerCase().includes(lowerCaseSearch) || + resource.category.toLocaleLowerCase().includes(lowerCaseSearch), + ); +}; diff --git a/frontend/src/app/wikipedia/category-button.tsx b/frontend/src/app/wikipedia/category-button.tsx index 34e3af7..a38eac7 100644 --- a/frontend/src/app/wikipedia/category-button.tsx +++ b/frontend/src/app/wikipedia/category-button.tsx @@ -1,14 +1,8 @@ -export default function CategoryButton({ - category, - onClick, - disabled, - active, -}: any) { +export default function CategoryButton({ category, onClick, active }: any) { return (