├── .env ├── public ├── atlas.png ├── meta.png ├── M3taloot.png ├── aquest.png ├── banners.png ├── favicon.ico ├── lootswag.png ├── thecrypt.png ├── therift.png ├── community.png ├── look-at-us.png ├── hyperloot@2x.jpg ├── Logomark-White.png ├── lootExplorers.jpeg ├── cryptsandcaverns.png ├── lootWatcher.svg ├── exchangeLogo2.svg ├── syntheticheader.svg ├── lootheader.svg ├── mlootheader.svg └── genesis.svg ├── postcss.config.js ├── .babelrc ├── .vscode └── settings.json ├── utils ├── formatters.ts ├── gtm.ts ├── headerLinks.ts ├── constants.ts ├── inspiredByLoot.ts ├── newLists.ts ├── developerTools.ts └── projects.tsx ├── components ├── Link.tsx ├── Footer.tsx ├── SyntheticLoot.tsx ├── Layout.tsx ├── Row.tsx ├── MobileNav.tsx ├── Head.tsx ├── Header.tsx └── Card.tsx ├── next-env.d.ts ├── img ├── menu.svg ├── globe.svg ├── twitter.svg ├── github.svg ├── mainnet.svg ├── path.svg ├── exchangeIcon2.svg ├── discord.svg ├── opensea.svg └── Logomark-Transparent White.svg ├── styles ├── global.scss ├── pages │ ├── Resources.module.scss │ ├── FAQ.module.scss │ └── Home.module.scss ├── app.css └── components │ └── Layout.module.scss ├── .gitignore ├── pull_request_template.md ├── .eslintrc.json ├── tsconfig.json ├── pages ├── _app.tsx ├── marketplaces.tsx ├── resourceList.tsx ├── resources.tsx ├── synthloot.tsx ├── faq.tsx ├── build.tsx └── index.tsx ├── types └── interface.ts ├── tailwind.config.js ├── package.json ├── LICENSE.md ├── README.md └── hooks ├── useSyntheticLoot.tsx └── useWalletContext.tsx /.env: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_ALCHEMY_API_KEY=h3JM2jDET8ZW9hsf_PNnygYuLVpCuhor -------------------------------------------------------------------------------- /public/atlas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/atlas.png -------------------------------------------------------------------------------- /public/meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/meta.png -------------------------------------------------------------------------------- /public/M3taloot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/M3taloot.png -------------------------------------------------------------------------------- /public/aquest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/aquest.png -------------------------------------------------------------------------------- /public/banners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/banners.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/lootswag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/lootswag.png -------------------------------------------------------------------------------- /public/thecrypt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/thecrypt.png -------------------------------------------------------------------------------- /public/therift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/therift.png -------------------------------------------------------------------------------- /public/community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/community.png -------------------------------------------------------------------------------- /public/look-at-us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/look-at-us.png -------------------------------------------------------------------------------- /public/hyperloot@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/hyperloot@2x.jpg -------------------------------------------------------------------------------- /public/Logomark-White.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/Logomark-White.png -------------------------------------------------------------------------------- /public/lootExplorers.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/lootExplorers.jpeg -------------------------------------------------------------------------------- /public/cryptsandcaverns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lootproject/website/HEAD/public/cryptsandcaverns.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "next/babel" 4 | ], 5 | "plugins": [ 6 | "inline-react-svg" 7 | ] 8 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.format.enable": true, 3 | "editor.formatOnSave": true, 4 | "eslint.lintTask.enable": true 5 | } -------------------------------------------------------------------------------- /utils/formatters.ts: -------------------------------------------------------------------------------- 1 | export function shortenAddress(address: string) { 2 | if (!address) return ""; 3 | return address.slice(0, 3) + "..." + address.slice(-3); 4 | } 5 | -------------------------------------------------------------------------------- /components/Link.tsx: -------------------------------------------------------------------------------- 1 | export function Link(props: any) { 2 | return ( 3 | {props.children} 4 | ) 5 | } -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | // NOTE: This file should not be edited 6 | // see https://nextjs.org/docs/basic-features/typescript for more information. 7 | -------------------------------------------------------------------------------- /img/menu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /styles/global.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | padding: 0; 4 | margin: 0; 5 | 6 | // Color 7 | color: white; 8 | background-color: hsl(0deg 0% 10%); 9 | 10 | // Text 11 | font-family: "EB Garamond", serif, sans-serif; 12 | } 13 | 14 | a { 15 | text-decoration: none; 16 | } 17 | 18 | h1, 19 | h2, 20 | h3, 21 | h4, 22 | h5, 23 | h6 { 24 | font-weight: normal; 25 | } 26 | -------------------------------------------------------------------------------- /img/globe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/twitter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/gtm.ts: -------------------------------------------------------------------------------- 1 | export const GTMPageView = (url: string) => { 2 | interface PageEventProps { 3 | event: string; 4 | page: string; 5 | } 6 | 7 | const pageEvent: PageEventProps = { 8 | event: 'pageview', 9 | page: url, 10 | }; 11 | //@ts-ignore 12 | window && window.dataLayer && window.dataLayer.push(pageEvent); 13 | return pageEvent; 14 | }; -------------------------------------------------------------------------------- /utils/headerLinks.ts: -------------------------------------------------------------------------------- 1 | import { Links } from "../types/interface"; 2 | export const headerLinks: Array = [ 3 | 4 | { 5 | name: "Build", 6 | path: "/build" 7 | }, 8 | { 9 | name: "Resources", 10 | path: "/resources", 11 | }, 12 | { 13 | name: "FAQ", 14 | path: "/faq" 15 | }, 16 | { 17 | name: "Forum", 18 | path: "https://loot-talk.com/" 19 | }, 20 | ]; -------------------------------------------------------------------------------- /styles/pages/Resources.module.scss: -------------------------------------------------------------------------------- 1 | .resources { 2 | max-width: 800px; 3 | margin: 0px auto; 4 | padding: 15px 20px; 5 | 6 | p { 7 | color: #8e8e8e; 8 | font-size: 20px; 9 | margin: 0px auto; 10 | } 11 | 12 | ul { 13 | li { 14 | p { 15 | margin: 15px 0px; 16 | 17 | a { 18 | color: white; 19 | 20 | &:hover { 21 | text-decoration: underline; 22 | } 23 | } 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /img/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /img/mainnet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /styles/pages/FAQ.module.scss: -------------------------------------------------------------------------------- 1 | // Page wrapper 2 | .faq { 3 | max-width: 800px; 4 | margin: 0px auto; 5 | padding: 15px 20px; 6 | } 7 | 8 | // FAQ Item 9 | .faq__item { 10 | h3 { 11 | font-size: 22px; 12 | border-bottom: 1px solid white; 13 | margin: 20px 0px 0px 0px; 14 | display: inline-block; 15 | } 16 | 17 | p { 18 | color: #8e8e8e; 19 | font-size: 20px; 20 | margin: 20px 0px; 21 | 22 | a { 23 | color: #cbcbcb; 24 | 25 | &:hover { 26 | text-decoration: underline; 27 | } 28 | } 29 | 30 | &:nth-of-type(1) { 31 | margin-top: 10px; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | 11 | 12 | ## Project Name 13 | 14 | Etherscan link: https://etherscan.io/address/ 15 | 16 | Website: https:// 17 | 18 | Twitter: https://twitter.com/ 19 | 20 | Discord: https://discord.com/ 21 | -------------------------------------------------------------------------------- /components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import styles from "@styles/components/Layout.module.scss"; // Styles 2 | import React, { ReactElement } from 'react'; 3 | 4 | export function Footer(): ReactElement { 5 | return ( 6 |
7 |

8 | This website is community maintained and{" "} 9 | 14 | open source 15 | 16 | . 17 |

18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals", 3 | "rules": { 4 | "comma-dangle": [ 5 | "error", 6 | { 7 | "arrays": "always-multiline", 8 | "objects": "always-multiline" 9 | } 10 | ] 11 | }, 12 | "overrides": [ 13 | { 14 | "files": [ 15 | "*.ts", 16 | "*.tsx" 17 | ], 18 | "extends": [ 19 | "plugin:@typescript-eslint/eslint-recommended", 20 | "plugin:@typescript-eslint/recommended", 21 | "prettier/@typescript-eslint" 22 | ], 23 | "parser": "@typescript-eslint/parser", 24 | "plugins": [ 25 | "@typescript-eslint" 26 | ] 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /styles/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | h1, h2, h3, h4, h5, h6 { 6 | @apply font-display; 7 | } 8 | h1{ 9 | @apply text-3xl sm:text-4xl md:text-6xl mb-4; 10 | } 11 | h2 { 12 | @apply text-2xl sm:text-2xl md:text-4xl mb-2; 13 | } 14 | h3 { 15 | @apply text-lg sm:text-xl md:text-2xl mb-2; 16 | } 17 | h4 { 18 | @apply text-xl; 19 | } 20 | 21 | button { 22 | @apply font-display; 23 | } 24 | 25 | body { 26 | @apply font-body text-white; 27 | } 28 | 29 | html { 30 | scroll-behavior: smooth; 31 | } 32 | .hero-img { 33 | background-image: linear-gradient(rgba(0,0,0,0.9), rgba(0,0,0,0.9)), url('/community.png'); 34 | 35 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "baseUrl": "./", 17 | "paths": { 18 | "@utils/*": ["./utils/*"], 19 | "@styles/*": ["./styles/*"], 20 | "@components/*": ["./components/*"] 21 | } 22 | }, 23 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 24 | "exclude": ["node_modules"] 25 | } 26 | -------------------------------------------------------------------------------- /pages/_app.tsx: -------------------------------------------------------------------------------- 1 | // Imports 2 | import { WalletProvider } from "hooks/useWalletContext"; 3 | import { GTMPageView } from '../utils/gtm'; 4 | import Router from 'next/router'; 5 | import React, { useEffect } from 'react'; 6 | import "@styles/global.scss"; 7 | import "@styles/app.css"; 8 | 9 | // Types 10 | import type { AppProps } from "next/app"; 11 | 12 | // Export application 13 | export default function LootRNG({ Component, pageProps }: AppProps) { 14 | useEffect(() => { 15 | const handleRouteChange = (url: string) => GTMPageView(url); 16 | Router.events.on('routeChangeComplete', handleRouteChange); 17 | return () => { 18 | Router.events.off('routeChangeComplete', handleRouteChange); 19 | }; 20 | }, []); 21 | return ( 22 | 23 | {" "} 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /types/interface.ts: -------------------------------------------------------------------------------- 1 | interface CardDetails { 2 | name: String; 3 | description: String; 4 | project: Array; 5 | } 6 | 7 | interface Project { 8 | name: String; 9 | heading?: String; 10 | description: String; 11 | whatToDo?: Array; 12 | roadMap?: Content; 13 | website?: Content; 14 | contract?: Content; 15 | twitter?: Content; 16 | discord?: Content; 17 | opensea?: Content; 18 | github?: Content; 19 | mintPrice?: Price; 20 | image?: String; 21 | neededProject?: Project; 22 | logo?: String; 23 | } 24 | 25 | interface Content { 26 | content?: String, 27 | url?: String 28 | component?: JSX.Element; 29 | } 30 | 31 | interface Price { 32 | mint?: Number 33 | } 34 | 35 | interface Links { 36 | name: String, 37 | path: String 38 | } 39 | 40 | export type { 41 | CardDetails, 42 | Project, 43 | Links 44 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: [], 3 | darkMode: false, // or 'media' or 'class' 4 | theme: { 5 | extend: { 6 | fontFamily: { 7 | display: ['EB Garamond', 'serif'], 8 | body: ['Inconsolata', 'monospace'], 9 | }, 10 | colors: { 11 | gray: { 12 | 100: '#edece9', 13 | 200: '#eeeeee', 14 | 300: '#e0e0e0', 15 | 400: '#bdbdbd', 16 | 500: '#9e9e9e', 17 | 600: '#757575', 18 | 700: '#616161', 19 | 800: '#424242', 20 | 900: '#161619', 21 | 1000: '#0e0e0e', 22 | }, 23 | }, 24 | minHeight: { 25 | 0: '0', 26 | 45: '45px', 27 | '1/4': '25vh', 28 | '1/2': '50vh', 29 | '3/4': '75vh', 30 | full: '100vh', 31 | }, 32 | }, 33 | }, 34 | variants: { 35 | extend: {}, 36 | }, 37 | plugins: [], 38 | } 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lootrng.com", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "export": "next export", 10 | "lint": "next lint" 11 | }, 12 | "dependencies": { 13 | "@walletconnect/web3-provider": "^1.6.6", 14 | "autoprefixer": "^10.3.6", 15 | "babel-plugin-inline-react-svg": "^2.0.1", 16 | "ethers": "^5.4.7", 17 | "next": "11.1.0", 18 | "postcss": "^8.3.8", 19 | "react": "17.0.2", 20 | "react-dom": "17.0.2", 21 | "sass": "^1.38.2", 22 | "tailwindcss": "^2.2.16", 23 | "usehooks-ts": "^1.0.4", 24 | "web3modal": "^1.9.4" 25 | }, 26 | "devDependencies": { 27 | "@types/react": "17.0.19", 28 | "eslint": "7.32.0", 29 | "eslint-config-next": "11.1.0", 30 | "typescript": "4.4.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /components/SyntheticLoot.tsx: -------------------------------------------------------------------------------- 1 | import useSyntheticLoot from 'hooks/useSyntheticLoot'; 2 | import { useWalletContext } from 'hooks/useWalletContext'; 3 | import React from 'react'; 4 | 5 | const SyntheticLoot = () => { 6 | const { connectWallet, account } = useWalletContext(); 7 | const syntheticLootSVG = useSyntheticLoot(); 8 | console.log({ syntheticLootSVG }); 9 | return ( 10 |
11 | {!account ? ( 12 | 18 | ) : syntheticLootSVG ? ( 19 |
20 | 21 |
22 | 23 | ) : null} 24 |
25 | ); 26 | }; 27 | 28 | export default SyntheticLoot; 29 | -------------------------------------------------------------------------------- /components/Layout.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement, useState } from 'react'; 2 | import { MobileNav } from "./MobileNav" 3 | import { Header } from "./Header" 4 | import { Head } from "./Head" 5 | import { Footer } from "./Footer" 6 | import { headerLinks } from "../utils/headerLinks" 7 | export default function Layout({ 8 | children, 9 | }: { 10 | children: ReactElement | ReactElement[]; 11 | }) { 12 | 13 | const [hidden, setHidden] = useState(false); 14 | 15 | return ( 16 |
17 | {/* Meta */} 18 | 19 | {/* End Google Tag Manager (noscript) */} 20 | {/* Top header */} 21 |
32 | ); 33 | } 34 | 35 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 lootproject 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /components/Row.tsx: -------------------------------------------------------------------------------- 1 | import { ReactElement, useRef, useState } from "react"; 2 | import { Card } from "@components/Card"; 3 | import { CardDetails } from "../types/interface"; 4 | import { useOnClickOutside } from "usehooks-ts"; 5 | 6 | export function CardRow(props: CardDetails): ReactElement { 7 | const [selected, setSelected] = useState(-1); 8 | const cardRef = useRef(null); 9 | 10 | useOnClickOutside(cardRef, () => { 11 | setSelected(-1); 12 | }); 13 | function onCardSelect(index: number) { 14 | setSelected(selected === index ? -1 : index); 15 | } 16 | 17 | return ( 18 |
19 |
20 |

{props.name}

21 |

{props.description}

22 |
23 | 24 |
25 | {props.project.map((project, i) => { 26 | return ( 27 | onCardSelect(i)} 32 | /> 33 | ); 34 | })} 35 |
36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Loot 2 | 3 | ## Community-operated [website](https://www.lootproject.com/) for the Loot project guided by the Loot Alliance. 4 |
5 | 6 | ### What is the Loot Alliance? 7 | The Loot Alliance is a collective of builders, designers, and geeks working together to channel the voice of the wider Lootverse community. 8 | 9 | Our goal is to shepherd the ongoing Lootverse in the direction of positivity, inclusiveness and fun in order to create a strong foundation for players and builders. 10 | 11 | Read here for more: https://genesisproject.notion.site/The-Loot-Alliance-3baf82e7bd06432da21b3a70906ce305 12 |
13 | 14 | ## Propose PR for new Project 15 | 16 | All new projects need to first submit a PR adding their project to the resources page. 17 | 18 | - Add project into `/utils/lists.ts` 19 | 20 | Principles for what makes it to the "Main Page" vs. on the "Resources Page” 21 | 22 | ### Objective principles 23 | - Has website 24 | - Has shipped code 25 | - Isn't a rug 26 | - Isn't deeply offensive 27 | - Has active usage 28 | - Has an active team/builders 29 | 30 | ### Subjective and decentralized principles 31 | - Loot Alliance voting mechanism 32 | - Community input 33 | - Lootwatcher votes 34 | - LootProject retweets as tacit votes 35 | - Canon 36 | 37 |
38 | 39 | ### Run locally 40 | 41 | ```bash 42 | # Install dependencies 43 | yarn 44 | 45 | # Run 46 | 47 | yarn dev 48 | ``` 49 | -------------------------------------------------------------------------------- /styles/components/Layout.module.scss: -------------------------------------------------------------------------------- 1 | // Header 2 | .header { 3 | max-width: 800px; 4 | margin: 0px auto; 5 | padding: 15px 20px; 6 | 7 | // Alignment 8 | display: flex; 9 | justify-content: space-between; 10 | -webkit-box-pack: justify; 11 | align-items: center; 12 | 13 | > div { 14 | width: auto; 15 | display: flex; 16 | align-items: center; 17 | } 18 | } 19 | 20 | .header__logo { 21 | a { 22 | font-size: 24px; 23 | color: white; 24 | transition: 50ms ease-in-out; 25 | 26 | &:hover { 27 | opacity: 0.8; 28 | } 29 | } 30 | } 31 | 32 | .header__links { 33 | justify-content: flex-end; 34 | 35 | ul { 36 | list-style-type: none; 37 | margin: 0px; 38 | padding: 0px; 39 | 40 | li { 41 | display: inline-block; 42 | margin: 0px 15px; 43 | 44 | a { 45 | color: #838383; 46 | font-size: 18px; 47 | 48 | &:hover { 49 | text-decoration: underline; 50 | } 51 | } 52 | 53 | &:nth-last-of-type(1) { 54 | margin-right: 0px; 55 | } 56 | } 57 | } 58 | } 59 | 60 | .header__links_active { 61 | color: white !important; 62 | } 63 | 64 | .footer { 65 | padding: 20px 0px; 66 | text-align: center; 67 | 68 | p { 69 | font-size: 20px; 70 | color: #838383; 71 | 72 | > a { 73 | text-decoration: underline; 74 | color: #838383; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /pages/marketplaces.tsx: -------------------------------------------------------------------------------- 1 | // Imports 2 | import Image from 'next/image' 3 | import Link from "next/link"; // Local routing 4 | import Layout from "@components/Layout"; // Layout wrapper 5 | import { CardRow } from "@components/Row"; // Layout wrapper 6 | import { defaultBags } from "@utils/constants"; // Bags to render 7 | import { marketPlaces } from "../utils/newLists" 8 | // Types 9 | import type { ReactElement } from "react"; 10 | 11 | export default function MarketPlaces(): ReactElement { 12 | return ( 13 | 14 |
15 |
16 |
17 |
18 | Buy & trade 19 |

Loot Marketplaces

20 |

Find and buy Loot and other Loot items here

21 |
22 |
23 | 24 | 25 | {marketPlaces.map(({ name, description, project }, i) => { 26 | return ( 27 | 28 | ); 29 | })} 30 |
31 |
32 |
33 | 34 | ) 35 | } -------------------------------------------------------------------------------- /hooks/useSyntheticLoot.tsx: -------------------------------------------------------------------------------- 1 | import { Contract } from '@ethersproject/contracts'; 2 | import { useEffect, useState } from 'react'; 3 | import { useWalletContext } from './useWalletContext'; 4 | 5 | const useSyntheticLoot = () => { 6 | const { account, provider } = useWalletContext(); 7 | const [svg, setSVG] = useState(); 8 | useEffect(() => { 9 | if (!account || !provider) return; 10 | const contract = new Contract( 11 | SyntheticLootMainnetAddress, 12 | SyntheticLootPartialABI, 13 | provider 14 | ); 15 | contract.functions 16 | .tokenURI(account) 17 | .then(([tokenURI]: [tokenURI: string]) => { 18 | try { 19 | const _svg = atob( 20 | JSON.parse( 21 | atob(tokenURI.replace('data:application/json;base64,', '')) 22 | ).image.replace('data:image/svg+xml;base64,', '') 23 | ); 24 | setSVG(_svg); 25 | } catch (err) { 26 | console.log(err); 27 | } 28 | }); 29 | }, [account, provider]); 30 | return svg; 31 | }; 32 | 33 | const SyntheticLootMainnetAddress = 34 | '0x869ad3dfb0f9acb9094ba85228008981be6dbdde'; 35 | 36 | const SyntheticLootPartialABI = [ 37 | { 38 | inputs: [ 39 | { internalType: 'address', name: 'walletAddress', type: 'address' } 40 | ], 41 | name: 'tokenURI', 42 | outputs: [{ internalType: 'string', name: '', type: 'string' }], 43 | stateMutability: 'view', 44 | type: 'function' 45 | } 46 | ]; 47 | 48 | export default useSyntheticLoot; 49 | -------------------------------------------------------------------------------- /img/path.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /img/exchangeIcon2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /components/MobileNav.tsx: -------------------------------------------------------------------------------- 1 | import { MouseEventHandler } from "react"; 2 | import Link from "next/link"; // Routing 3 | import { Links } from "../types/interface"; 4 | type NavProps = { 5 | onClick?: MouseEventHandler; 6 | hidden: boolean; 7 | links: Array 8 | }; 9 | 10 | export function MobileNav(props: NavProps) { 11 | const { hidden, onClick } = props; 12 | 13 | const open = "ease-in-out transition-all duration-300 transform fixed h-full top-0 z-30 w-full sm:w-1/3 flex flex-wrap left-0 bg-gray-1000 sm:p-8 overflow-y-scroll -translate-x-full" 14 | 15 | const closed = "ease-in-out transition-all duration-300 transform fixed h-full top-0 z-30 w-full sm:w-1/3 flex flex-wrap left-0 bg-gray-1000 sm:p-8 overflow-y-scroll translate-x-0" 16 | 17 | return ( 18 |
20 |
21 | 22 |
23 |
24 |
25 |
    26 | {props.links.map(({ name, path }, i) => { 27 | // For each link, render link 28 | return ( 29 |
  • 30 | 31 | 34 | {name} 35 | 36 | 37 |
  • 38 | ); 39 | })} 40 |
41 |
42 |
43 |
44 | ) 45 | } -------------------------------------------------------------------------------- /img/discord.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /styles/pages/Home.module.scss: -------------------------------------------------------------------------------- 1 | .home__cta { 2 | max-width: 800px; 3 | margin: 0px auto; 4 | padding: 15px 20px; 5 | text-align: center; 6 | 7 | h1 { 8 | font-size: 5rem; 9 | margin: 15px 0px 0px 0px; 10 | } 11 | 12 | p { 13 | color: #8e8e8e; 14 | font-size: 22px; 15 | margin: 0px; 16 | } 17 | 18 | ul { 19 | list-style-type: none; 20 | margin: 10px auto 30px auto; 21 | padding: 0px; 22 | 23 | li { 24 | display: inline-block; 25 | margin: 0px 10px; 26 | 27 | a { 28 | color: white; 29 | font-size: 22px; 30 | 31 | &:hover { 32 | text-decoration: underline; 33 | } 34 | } 35 | } 36 | } 37 | } 38 | 39 | .home__feature { 40 | padding-top: 40px; 41 | text-align: center; 42 | 43 | > span { 44 | display: block; 45 | color: #8e8e8e; 46 | font-size: 18px; 47 | padding: 10px 0px; 48 | } 49 | } 50 | 51 | .home__bag { 52 | display: inline-block; 53 | vertical-align: top; 54 | margin: 15px; 55 | color: white; 56 | 57 | &:hover { 58 | opacity: 0.8; 59 | } 60 | } 61 | 62 | .home__bag_attributes { 63 | background-color: black; 64 | width: 400px; 65 | height: 400px; 66 | position: relative; 67 | 68 | > span { 69 | position: absolute; 70 | right: 10px; 71 | top: 10px; 72 | } 73 | 74 | ul { 75 | list-style-type: none; 76 | margin: 0px; 77 | padding: 20px; 78 | text-align: left; 79 | 80 | li { 81 | margin: 5px 0px; 82 | 83 | span { 84 | font-size: 20px; 85 | } 86 | } 87 | } 88 | } 89 | 90 | // Responsive 91 | @media screen and (max-width: 850px) { 92 | .home__cta { 93 | p { 94 | br { 95 | display: none; 96 | } 97 | } 98 | } 99 | } 100 | 101 | @media screen and (max-width: 600px) { 102 | .home__bag_attributes { 103 | background-color: black; 104 | width: 300px; 105 | height: 300px; 106 | position: relative; 107 | 108 | ul { 109 | li { 110 | span { 111 | font-size: 16px; 112 | } 113 | } 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /utils/constants.ts: -------------------------------------------------------------------------------- 1 | // Export selected default bags 2 | export const defaultBags = [ 3 | { 4 | id: 1, 5 | attributes: [ 6 | "Hard Leather Armor", 7 | '"Death Root" Ornate Greaves of Skill', 8 | "Studded Leather Gloves", 9 | "Divine Hood", 10 | "Necklace of Enlightenment", 11 | "Gold Ring", 12 | "Hard Leather Belt", 13 | '"Grim Shout" Grave Wand of Skill +1', 14 | ], 15 | }, 16 | { 17 | id: 111, 18 | attributes: [ 19 | "Ring Mail of Giants", 20 | "Demonhide Boots of the Fox", 21 | "Heavy Gloves", 22 | "Cap", 23 | "Necklace", 24 | "Gold Ring", 25 | "Wool Sash of Protection", 26 | "Ghost Wand", 27 | ], 28 | }, 29 | { 30 | id: 420, 31 | attributes: [ 32 | "Chain Mail", 33 | "Shoes of Enlightenment", 34 | "Demon's Hands", 35 | "Ancient Helm", 36 | "Necklace", 37 | "Platinum Ring of Vitriol", 38 | "Heavy Belt", 39 | '"Honour Grasp" Katana of Protection +1', 40 | ], 41 | }, 42 | { 43 | id: 6969, 44 | attributes: [ 45 | "Chain Mail", 46 | "Holy Greaves of Giants", 47 | "Silk Gloves", 48 | "Dragon's Crown", 49 | "Pendant of Perfection", 50 | "Titanium Ring of Giants", 51 | "Heavy Belt", 52 | "Bone Wand", 53 | ], 54 | }, 55 | { 56 | id: 1234, 57 | attributes: [ 58 | "Holy Chestplate", 59 | "Divine Slippers of Perfection", 60 | "Dragonskin Gloves", 61 | '"Woe Shout" Demon Crown of Protection +1', 62 | "Necklace", 63 | "Titanium Ring", 64 | "Silk Sash", 65 | "Book", 66 | ], 67 | }, 68 | { 69 | id: 1337, 70 | attributes: [ 71 | "Divine Robe", 72 | '"Foe Peak" Shoes of Reflection +1', 73 | "Divine Gloves", 74 | "Full Helm", 75 | "Necklace", 76 | "Titanium Ring", 77 | "Ornate Belt", 78 | "Falchion of Reflection", 79 | ], 80 | }, 81 | { 82 | id: 6969, 83 | attributes: [ 84 | "Chain Mail", 85 | "Holy Greaves of Giants", 86 | "Silk Gloves", 87 | "Dragon's Crown", 88 | "Pendant of Perfection", 89 | "Titanium Ring of Giants", 90 | "Heavy Belt", 91 | "Bone Wand", 92 | ], 93 | }, 94 | ]; 95 | -------------------------------------------------------------------------------- /pages/resourceList.tsx: -------------------------------------------------------------------------------- 1 | // Imports 2 | import { 3 | derivativesList, 4 | guildsList, 5 | marketsList, 6 | resourceList, 7 | communityList 8 | } from "@utils/lists"; // Lists 9 | import Layout from "@components/Layout"; // Layout wrapper 10 | import styles from "@styles/pages/Resources.module.scss"; // Page styles 11 | 12 | // Types 13 | import type { ReactElement } from "react"; 14 | 15 | const resources = [ 16 | { 17 | title: "Communities", 18 | description: "Spaces run by the community for Loot enthusiasts to share news and build together:", 19 | list: communityList, 20 | }, 21 | { 22 | title: "Developer Tooling", 23 | description: "Aggregated resources built by the Loot community:", 24 | list: resourceList, 25 | }, 26 | { 27 | title: "Guilds", 28 | description: "Guild divided by items and attributes:", 29 | list: guildsList, 30 | }, 31 | { 32 | title: "Market Trackers", 33 | description: "Tools to keep track of Loot by attributes:", 34 | list: marketsList, 35 | }, 36 | { 37 | title: "Derivative Projects", 38 | description: "Projects that remix or build on top of Loot. Because Loot is decentralized, there are *no* 'official' derivatives, tokens, or DAOs. Please note that this list is community submitted and projects are *not* audited. Large errors are possible, up to and including loss of funds. Do your own research and proceed with caution:", 39 | list: derivativesList, 40 | }, 41 | ]; 42 | 43 | export default function Resources(): ReactElement { 44 | return ( 45 | 46 | {resources.map(({ title, description, list }, i) => { 47 | return ( 48 |
49 |

{title}

50 |

{description}

51 | 52 |
    53 | {list.map(({ name, description, url }, i) => { 54 | // For each resource, render link and description 55 | return ( 56 |
  • 57 |

    58 | 59 | {name} 60 | {" "} 61 | — {description} 62 |

    63 |
  • 64 | ); 65 | })} 66 |
67 |
68 | ); 69 | })} 70 |
71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /components/Head.tsx: -------------------------------------------------------------------------------- 1 | // Imports 2 | import { default as HTMLHead } from "next/head"; // Meta 3 | import React, { ReactElement, useState } from 'react'; 4 | 5 | export function Head(): ReactElement { 6 | return ( 7 | 8 | {/* Primary Meta Tags */} 9 | Loot 10 | 11 | 15 | 16 | {/* OG + Faceook */} 17 | 18 | 19 | 20 | 24 | 25 | 26 | {/* Twitter */} 27 | 28 | 29 | 30 | 34 | 35 | 36 | {/* Font */} 37 | 38 | 43 | {/* eslint-disable-next-line @next/next/no-page-custom-font */} 44 | 48 | {/* Google Tag Manager */} 49 | 50 | 53 |