diff --git a/frontend/app/cartridges/page.tsx b/frontend/app/cartridges/page.tsx index 16955a3..3f6cb54 100644 --- a/frontend/app/cartridges/page.tsx +++ b/frontend/app/cartridges/page.tsx @@ -1,4 +1,4 @@ -import Title from "../components/Title"; +// import Title from "../components/Title"; import CartridgesList from "../components/CartridgesList"; import CartridgeInfo from "../components/CartridgeInfo"; import Rivemu from "../components/Rivemu"; @@ -28,11 +28,11 @@ function listLoaderFallback() { export default async function Cartridges() { return (
-
+
-
+ {/*
- </div> + </div> */} <div className="p-4 break-words overflow-auto custom-scrollbar"> <Suspense fallback={listLoaderFallback()}> diff --git a/frontend/app/components/CartridgeDescription.tsx b/frontend/app/components/CartridgeDescription.tsx index ad80c12..64b551f 100644 --- a/frontend/app/components/CartridgeDescription.tsx +++ b/frontend/app/components/CartridgeDescription.tsx @@ -3,6 +3,7 @@ import { useContext } from 'react'; import { selectedCartridgeContext } from '../cartridges/selectedCartridgeProvider'; +import { fontPressStart2P } from '../utils/font'; function CartridgeDescription() { const {selectedCartridge} = useContext(selectedCartridgeContext); @@ -14,12 +15,12 @@ function CartridgeDescription() { return ( <div> <fieldset> - <legend className='font-bold text-xl'>Sumary</legend> + <legend className={`font-bold text-xl ${fontPressStart2P.className}`}>Sumary</legend> <p>{selectedCartridge.info?.summary}</p> </fieldset> <fieldset> - <legend className='font-bold text-xl'>Description</legend> + <legend className={`font-bold text-xl ${fontPressStart2P.className}`}>Description</legend> <pre style={{whiteSpace: "pre-wrap"}}> {selectedCartridge.info?.description} </pre> diff --git a/frontend/app/components/CartridgeInfo.tsx b/frontend/app/components/CartridgeInfo.tsx index ab33905..31111a3 100644 --- a/frontend/app/components/CartridgeInfo.tsx +++ b/frontend/app/components/CartridgeInfo.tsx @@ -26,6 +26,7 @@ import CartridgeDescription from './CartridgeDescription'; import Link from 'next/link'; import CartridgeScoreboard from './CartridgeScoreboard'; import { envClient } from "../utils/clientEnv"; +import { fontPressStart2P } from '../utils/font'; function scoreboardFallback() { @@ -138,9 +139,9 @@ function CartridgeInfo() { return ( <fieldset className='h-full custom-shadow'> <legend className="ms-2 px-1"> - <span className='cartridge-title-text'>{selectedCartridge.name}</span> + <span className={`cartridge-title-text ${fontPressStart2P.className}`}>{selectedCartridge.name}</span> <br/> - <span className='muted-text text-sm'> + <span className='muted-text'> Uploaded by {selectedCartridge.user_address} on {new Date(selectedCartridge.created_at*1000).toLocaleString()} </span> </legend> @@ -205,7 +206,7 @@ function CartridgeInfo() { <></> : <div className='mt-3'> - <span className='ms-2 font-bold text-xl'> + <span className={`ms-2 font-bold text-xl ${fontPressStart2P.className}`}> Creators </span> @@ -243,7 +244,6 @@ function CartridgeInfo() { <Tab className={({selected}) => {return selected?"game-tabs-option-selected":"game-tabs-option-unselected"}} - disabled > <span className='game-tabs-option-text'> <StadiumIcon/> @@ -253,7 +253,6 @@ function CartridgeInfo() { <Tab className={({selected}) => {return selected?"game-tabs-option-selected":"game-tabs-option-unselected"}} - disabled > <span className='game-tabs-option-text'> <CodeIcon/> @@ -281,13 +280,13 @@ function CartridgeInfo() { <Tab.Panel className="game-tab-content" > - <></> + <span className={`${fontPressStart2P.className}`}>Coming Soon!</span> </Tab.Panel> <Tab.Panel className="game-tab-content" > - <></> + <span className={`${fontPressStart2P.className}`}>Coming Soon!</span> </Tab.Panel> </Tab.Panels> </Tab.Group> diff --git a/frontend/app/components/CartridgeSelectButton.tsx b/frontend/app/components/CartridgeSelectButton.tsx index 94833fa..e0b1dab 100644 --- a/frontend/app/components/CartridgeSelectButton.tsx +++ b/frontend/app/components/CartridgeSelectButton.tsx @@ -1,28 +1,36 @@ "use client" -import React, { useContext } from 'react' +import React, { useContext, useEffect } from 'react' import { selectedCartridgeContext } from '../cartridges/selectedCartridgeProvider'; import { CartridgeInfo as Cartridge } from "../backend-libs/app/ifaces" import { cartridgeInfo } from '../backend-libs/app/lib'; +import { fontPressStart2P } from '../utils/font'; -function CartridgeSelectButton({cartridge}:{cartridge:Cartridge}) { +function CartridgeSelectButton({cartridge, index}:{cartridge:Cartridge, index:number}) { const {selectedCartridge, changeCartridge} = useContext(selectedCartridgeContext); + useEffect(() => { + const initialSelection = async () => { + await handleCartridgeSelection({} as React.MouseEvent<HTMLElement>); + } + if (index == 0 && !selectedCartridge) initialSelection(); + }) + const handleCartridgeSelection = async (e:React.MouseEvent<HTMLElement>) => { const cartridgeWithInfo = await cartridgeInfo({id:cartridge.id},{decode:true}); console.log('Select') - + changeCartridge(cartridgeWithInfo); } return ( <button className={ selectedCartridge?.id==cartridge.id? - "games-list-item games-list-selected-item" + `games-list-item games-list-selected-item ${fontPressStart2P.className}` : - "games-list-item" + `games-list-item ${fontPressStart2P.className}` } value={cartridge.id} onClick={handleCartridgeSelection}> {cartridge.name} diff --git a/frontend/app/components/CartridgesList.tsx b/frontend/app/components/CartridgesList.tsx index 4f31565..6da55d3 100644 --- a/frontend/app/components/CartridgesList.tsx +++ b/frontend/app/components/CartridgesList.tsx @@ -2,30 +2,10 @@ import CartridgeSelectButton from './CartridgeSelectButton'; import { cache } from 'react'; import { cartridges as cartridgerequest} from "../backend-libs/app/lib"; -function delay(ms: number) { - return new Promise( resolve => setTimeout(resolve, ms) ); -} const getCartridges = cache(async () => { const cartridges: any[] = (await cartridgerequest({},{decode:true})).data; - // await delay(3000); // artificial fetch cartridges delay - // const cartridges: any[] = [ - // {id: 0, name: "Castlevania", cover: "nes_castlevania_cover.jpeg", date: "01/08/2024", desc: "Castlevania #"+desc}, - // {id: 1, name: "Life Force",cover: "nes_lifeForce_cover.jpg", date: "01/08/2024", desc: "Life Force #"+desc}, - // {id: 2, name: "The Legend of Zelda", cover: "nes_thelegendofzelda_cover.jpg", date: "01/08/2024", desc: "The Legend of Zelda #"+desc}, - // {id: 3, name: "Castlevania", cover: "nes_castlevania_cover.jpeg", date: "01/08/2024", desc: "Castlevania #"+desc}, - // {id: 4, name: "Life Force",cover: "nes_lifeForce_cover.jpg", date: "01/08/2024", desc: "Life Force #"+desc}, - // {id: 5, name: "The Legend of Zelda", cover: "nes_thelegendofzelda_cover.jpg", date: "01/08/2024", desc: "The Legend of Zelda #"+desc}, - // {id: 6, name: "Castlevania", cover: "nes_castlevania_cover.jpeg", date: "01/08/2024", desc: "Castlevania #"+desc}, - // {id: 7, name: "Life Force",cover: "nes_lifeForce_cover.jpg", date: "01/08/2024", desc: "Life Force #"+desc}, - // {id: 8, name: "The Legend of Zelda", cover: "nes_thelegendofzelda_cover.jpg", date: "01/08/2024", desc: "The Legend of Zelda #"+desc}, - // {id: 9, name: "Castlevania", cover: "nes_castlevania_cover.jpeg", date: "01/08/2024", desc: "Castlevania #"+desc}, - // {id: 10, name: "Life Force",cover: "nes_lifeForce_cover.jpg", date: "01/08/2024", desc: "Life Force #"+desc}, - // {id: 11, name: "The Legend of Zelda", cover: "nes_thelegendofzelda_cover.jpg", date: "01/08/2024", desc: "The Legend of Zelda #"+desc}, - // {id: 12, name: "Castlevania", cover: "nes_castlevania_cover.jpeg", date: "01/08/2024", desc: "Castlevania #"+desc}, - // {id: 13, name: "Life Force",cover: "nes_lifeForce_cover.jpg", date: "01/08/2024", desc: "Life Force #"+desc}, - // {id: 14, name: "The Legend of Zelda", cover: "nes_thelegendofzelda_cover.jpg", date: "01/08/2024", desc: "The Legend of Zelda #"+desc} - // ] + return cartridges; }) @@ -38,7 +18,7 @@ async function CartridgesList() { cartridges.map((cartridge: any, index: number) => { return ( <li key={`${cartridge.name}-${index}`} className="flex"> - <CartridgeSelectButton cartridge={cartridge} /> + <CartridgeSelectButton index={index} cartridge={cartridge} /> </li> ); }) diff --git a/frontend/app/components/Navbar.tsx b/frontend/app/components/Navbar.tsx index af890a4..09af880 100644 --- a/frontend/app/components/Navbar.tsx +++ b/frontend/app/components/Navbar.tsx @@ -5,6 +5,8 @@ import { usePathname } from "next/navigation"; import React from 'react' import ThemeSwitch from "@/app/components/ThemeSwitch"; import { useConnectWallet } from '@web3-onboard/react'; +import rivesLogo from '../../public/rives_logo.png'; +import Image from 'next/image' function Navbar() { const pathname = usePathname(); @@ -12,13 +14,15 @@ function Navbar() { return ( <header className='header'> - <Link href={"/"} className='font-semibold title-color'> - <span>World</span> - <br/> - <span className='ps-2'>Arcade</span> + {/* <Link href={"/"} className={`font-semibold title-color ${fontPressStart2P.className}`}> + <span>RiVES</span> + </Link> */} + + <Link href={"/"}> + <Image src={rivesLogo} alt='RiVES' width={96} ></Image> </Link> - <nav className='flex text-lg gap-7 font-medium'> + <nav className='flex gap-7 font-medium'> <Link href={"/cartridges"} className={ pathname === "/cartridges" ? "link-active" : "link-2step-hover" }> <p>Cartridges</p> </Link> @@ -28,7 +32,7 @@ function Navbar() { </Link> </nav> - <div className='flex space-x-8'> + <div className='flex space-x-6'> <ThemeSwitch/> <button className='web3-connect-btn' disabled={connecting} diff --git a/frontend/app/components/Rivemu.tsx b/frontend/app/components/Rivemu.tsx index 55e2a78..555c205 100644 --- a/frontend/app/components/Rivemu.tsx +++ b/frontend/app/components/Rivemu.tsx @@ -13,6 +13,7 @@ import OndemandVideoIcon from '@mui/icons-material/OndemandVideo'; import { selectedCartridgeContext } from '../cartridges/selectedCartridgeProvider'; import { cartridge } from '../backend-libs/app/lib'; +import { fontPressStart2P } from '../utils/font'; // let rivlogData: Uint8Array | undefined = undefined; @@ -53,11 +54,11 @@ function Rivemu() { const data = await cartridge({id:selectedCartridge.id},{decode:true,decodeModel:"bytes"}); setCartridgeData(data); } - + if (!selectedCartridge) { return <></>; } - + var decoder = new TextDecoder("utf-8"); let parser = new Parser(); let scoreFunction = parser.parse('score'); @@ -238,9 +239,9 @@ function Rivemu() { }} /> {/* </Suspense> */} - </div>1 + </div> <div className="text-center d-flex justify-content-center"> - <h3>Score: <span>{overallScore}</span></h3> + <h3 className={fontPressStart2P.className}>Score: <span>{overallScore}</span></h3> </div> <Script src="/rivemu.js" strategy="lazyOnload" /> diff --git a/frontend/app/components/Title.tsx b/frontend/app/components/Title.tsx index 4672450..1b71ab2 100644 --- a/frontend/app/components/Title.tsx +++ b/frontend/app/components/Title.tsx @@ -1,15 +1,23 @@ -import Link from 'next/link' import React from 'react' +import { fontPressStart2P } from '../utils/font'; + +import Image from 'next/image' +import rivesLogo from '../../public/logo.png'; function Title() { return ( - <div className="grid grid-cols-1"> - <h1 className='title-text'> - <span>World</span> - <br/> - <span className='ps-16'>Arcade</span> - </h1> - <span className="subtitle-text justify-self-end">Powered by <Link className="link-2step-hover" href="https://cartesi.io/">Cartesi</Link></span> + // <div className="grid grid-cols-1"> + // <h1 className={`${fontPressStart2P.className} title-text`}> + // <span>RiVES</span> + // </h1> + // <span className="subtitle-text">RiscV Verifiable Entertainment System</span> + // </div> + + <div className="flex space-x-2"> + {/* <h1 className='title-text'> + <span>RiVES</span> + </h1> */} + <Image width={250} src={rivesLogo} alt='RiVES logo'/> </div> ) } diff --git a/frontend/app/favicon.ico b/frontend/app/favicon.ico index 718d6fe..6c67b13 100644 Binary files a/frontend/app/favicon.ico and b/frontend/app/favicon.ico differ diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 21c8182..a3f1903 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -54,13 +54,6 @@ body { --background-start-rgb: 36, 36, 36; --background-end-rgb: 105, 105, 105; --background-end-rgba0: rgba(100, 100, 100, 0.4); - --highlight-text-start-hex: #BFFFFC; - --highlight-text-end-hex: #12B8FF; - --highlight-text-end-rgba0: rgba(18, 184, 255, 0.4); - --highlight-text-end-rgba1: rgba(18, 184, 255, 0.3); - --highlight-text-end-rgba2: rgba(18, 184, 255, 0.2); - --highlight-text-end-rgba3: rgba(18, 184, 255, 0.1); - --highlight-text-end-rgba4: rgba(18, 184, 255, 0.05); } } :root[data-theme="dark"] { @@ -69,13 +62,6 @@ body { --background-start-rgb: 36, 36, 36; --background-end-rgb: 105, 105, 105; --background-end-rgba0: rgba(100, 100, 100, 0.4); - --highlight-text-start-hex: #BFFFFC; - --highlight-text-end-hex: #12B8FF; - --highlight-text-end-rgba0: rgba(18, 184, 255, 0.4); - --highlight-text-end-rgba1: rgba(18, 184, 255, 0.3); - --highlight-text-end-rgba2: rgba(18, 184, 255, 0.2); - --highlight-text-end-rgba3: rgba(18, 184, 255, 0.1); - --highlight-text-end-rgba4: rgba(18, 184, 255, 0.05); } } @@ -231,6 +217,7 @@ body { transform: translateY(225%) translateX(-50%); height: 14px; line-height: 13px; + font-size: 60%; } .button-57:disabled, @@ -271,6 +258,10 @@ body { } .first-section { + @apply mx-auto md:p-16 pb-12 !pt-[126px] px-8 h-svh flex flex-col items-center max-w-screen-lg; + } + + .second-section { @apply mx-auto md:p-16 pb-12 !pt-[126px] px-8 h-svh flex flex-row; } @@ -284,15 +275,15 @@ body { } .title-text { - @apply 2xl:text-9xl xl:text-8xl md:text-6xl sm:text-3xl font-semibold font-poppins title-color leading-none; + @apply 2xl:text-8xl xl:text-7xl md:text-3xl sm:text-2xl font-semibold title-color leading-none; } .subtitle-text { - @apply font-semibold 2xl:text-3xl xl:text-xl md:text-lg sm:text-base relative font-poppins; + @apply font-semibold 2xl:text-2xl xl:text-lg md:text-sm sm:text-base relative; } .cartridge-title-text { - @apply font-semibold sm:text-4xl text-xl relative font-poppins title-color; + @apply font-semibold sm:text-4xl text-xl relative title-color; } .games-list-item { @@ -345,7 +336,7 @@ body { .web3-connect-btn { - @apply rounded p-2 shadow-sm shadow-current;/*bg-gradient-to-r from-[var(--highlight-text-start-hex)] to-[var(--highlight-text-end-hex)];*/ + @apply rounded text-sm p-2 shadow-sm shadow-current;/*bg-gradient-to-r from-[var(--highlight-text-start-hex)] to-[var(--highlight-text-end-hex)];*/ } .web3-connect-btn:hover { diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index c284206..62e8b00 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -1,14 +1,11 @@ import type { Metadata } from 'next' -import { Inter } from 'next/font/google' import './globals.css' import Navbar from '@/app/components/Navbar'; import {Web3OnboardProviderClient} from './utils/web3OnboardProvider'; -const inter = Inter({ subsets: ['latin'] }) - export const metadata: Metadata = { - title: 'World Arcade', - description: 'Generated by create next app', + title: 'RiVES', + description: 'RiscV Verifiable Entertainment System', } export default function RootLayout({ @@ -19,7 +16,7 @@ export default function RootLayout({ return ( <html lang="en-US"> <Web3OnboardProviderClient> - <body className={inter.className}> + <body> <Navbar></Navbar> {children} </body> diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 1cc6063..a2c008b 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,39 +1,24 @@ import Title from "./components/Title"; +import { fontPressStart2P } from './utils/font'; export default function Home() { return ( <main className=""> <section id="presentation-section" className="first-section"> - <div className="basis-1/3 justify-self-start"> <Title /> - </div> - - <div className="basis-2/3 ms-8"> - <h2 className="subtitle-text title-color mb-4">About</h2> - <p className="mb-4"> - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam malesuada arcu ex, vitae gravida felis vestibulum ut. - Morbi congue, est ut dictum dignissim, lacus nibh laoreet est, in molestie metus massa eget nisi. In finibus eu massa vitae mattis. - Quisque iaculis eros vitae diam consectetur accumsan. Mauris efficitur magna tellus. Etiam sagittis mi nec varius congue. - Mauris nibh metus, ultrices ac ante id, vestibulum luctus velit. Morbi at metus tortor. Morbi in nisl lorem. Sed mattis feugiat ultrices. - Pellentesque quis maximus sem. Quisque gravida efficitur lorem, a commodo massa imperdiet vel. + {/* <h2 className={`subtitle-text title-color my-4 ${fontPressStart2P.className}`}>RiSCV Verifiable Entertainment System</h2> */} + <p className="my-6"> + <span className={fontPressStart2P.className}>RiVES</span> (RISC-V Verifiable Entertainment System) is a free and open source verifiable fantasy game console for making and playing small onchain games. + All matches generate an output that can be used by anyone to reproduce and verify the gameplay. + No more lying about that epic speedrun or completing the final stage without taking a hit. + RIVES will enable decentralized trustless tournaments so that no one can deny your bounty after an epic play! </p> - <p className="mb-4"> - Curabitur ut odio eget magna laoreet eleifend a eget justo. Etiam et venenatis nulla. Proin vestibulum luctus arcu, vitae tincidunt quam fringilla nec. - Duis faucibus, mi non scelerisque mattis, nunc orci pretium sapien, sit amet porttitor est tellus vel leo. Suspendisse tempor finibus urna. - Nunc vitae erat a ligula dictum condimentum at at lacus. Morbi a odio sed mi vehicula ornare in scelerisque tortor. - Phasellus ut mauris vitae felis dictum cursus sed nec metus. Curabitur iaculis dignissim tellus, non consequat justo maximus et. - </p> + <div className="w-1/2 bg-black h-1/2 rounded flex items-center justify-center"> + Demo Video + </div> - <p> - Praesent vitae egestas nisl. Suspendisse vitae arcu ac ex volutpat dictum. Pellentesque fringilla sapien massa, non euismod sem cursus id. - Nullam posuere, nisl sit amet rutrum aliquet, sem justo lacinia odio, id sollicitudin sem lacus in orci. - Ut turpis urna, elementum sit amet convallis volutpat, dignissim eget magna. Praesent a tempus leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. - Integer porttitor purus id nunc porta, eu pellentesque ipsum luctus. Donec a luctus ipsum. Ut dictum dolor eu condimentum ornare. Maecenas dictum feugiat mattis. - Maecenas mollis at dolor volutpat tincidunt. Morbi vehicula metus non ipsum tempor, quis venenatis libero iaculis. Nulla facilisi. - </p> - </div> </section> {/* <section id="statistical-section" className="h-svh"> placeholder for statistical info retrieved from DApp diff --git a/frontend/app/utils/font.ts b/frontend/app/utils/font.ts new file mode 100644 index 0000000..cf2a457 --- /dev/null +++ b/frontend/app/utils/font.ts @@ -0,0 +1,8 @@ +import localFont from 'next/font/local' + + +// Font files can be colocated inside of `app` +export const fontPressStart2P = localFont({ + src: '../../public/Press_Start_2P/PressStart2P-Regular.ttf', + weight: '400' + }) \ No newline at end of file diff --git a/frontend/app/utils/web3-onboard.ts b/frontend/app/utils/web3-onboard.ts index 3ed8f97..e3cad74 100644 --- a/frontend/app/utils/web3-onboard.ts +++ b/frontend/app/utils/web3-onboard.ts @@ -22,9 +22,9 @@ const chains = [ethereumRopsten, polygonMainnet] const wallets = [injectedModule()] const appMetadata = { - name: 'World Arcade', + name: 'RiVES', icon: '<svg>My App Icon</svg>', - description: 'The World Arcade allows users to play riscv-binaries of games on a RISC-V Cartesi Machine on the browser. The game moves are submited onchain so the session can be replayed in a Cartesi Rollups DApp to generate a provable score.', + description: 'RiVES allows users to play riscv-binaries of games on a RISC-V Cartesi Machine on the browser. The game moves are submited onchain so the session can be replayed in a Cartesi Rollups DApp to generate a provable score.', recommendedInjectedWallets: [ { name: 'MetaMask', url: 'https://metamask.io' }, { name: 'Coinbase', url: 'https://wallet.coinbase.com/' } diff --git a/frontend/public/Press_Start_2P/OFL.txt b/frontend/public/Press_Start_2P/OFL.txt new file mode 100644 index 0000000..70881e0 --- /dev/null +++ b/frontend/public/Press_Start_2P/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2012 The Press Start 2P Project Authors (cody@zone38.net), with Reserved Font Name "Press Start 2P". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/public/Press_Start_2P/PressStart2P-Regular.ttf b/frontend/public/Press_Start_2P/PressStart2P-Regular.ttf new file mode 100644 index 0000000..2442aff Binary files /dev/null and b/frontend/public/Press_Start_2P/PressStart2P-Regular.ttf differ diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000..e1b8c62 Binary files /dev/null and b/frontend/public/logo.png differ diff --git a/frontend/public/rives_logo.png b/frontend/public/rives_logo.png new file mode 100644 index 0000000..ad8cda2 Binary files /dev/null and b/frontend/public/rives_logo.png differ