import React from "react"; import { NextPage } from "next"; import Head from "next/head"; import logoImg from "../ui/assets/logo.png"; import Image from "next/image"; import { Button, Card, Colors, Icon, Text } from "@blueprintjs/core"; import Link from "next/link"; import { useDarkMode } from "../ui/providers/dark-mode-provider"; import LANGUAGES from "./languages.json"; import { GitHubIcon } from "../ui/custom-icons"; const REPO_URL = "https://github.com/nilaymaj/esolang-park"; const WIKI_URL = REPO_URL + "/wiki"; const GUIDE_URL = REPO_URL + "/wiki/Language-Providers"; const ISSUE_URL = REPO_URL + "/issues/new"; const styles = { topPanel: { position: "absolute" as "absolute", top: 0, right: 0, padding: 10, }, rootContainer: { height: "100%", display: "flex", flexDirection: "column" as "column", alignItems: "center", justifyContent: "center", padding: "10%", textAlign: "center" as "center", }, headerContainer: { display: "flex", alignItems: "center", }, langsContainer: { marginTop: 30, width: "100%", display: "flex", flexWrap: "wrap" as "wrap", alignContent: "flex-start", justifyContent: "center", }, langCard: { minWidth: 200, textAlign: "center" as "center", margin: 20, padding: "30px 0", }, }; const Index: NextPage = () => { const DarkMode = useDarkMode(); const backgroundColor = DarkMode.isDark ? Colors.DARK_GRAY3 : Colors.WHITE; return ( <> <Head> <title>Esolang Park</title> </Head> {/* Buttons in the top-right */} <div style={styles.topPanel}> <Button minimal title="Toggle between dark and light mode" icon={<Icon icon={DarkMode.isDark ? "flash" : "moon"} />} onClick={DarkMode.toggleDark} /> <a href={WIKI_URL} title="Visit the project's wiki"> <Button minimal icon={<Icon icon="book" />} /> </a> <a href={REPO_URL} title="Visit the GitHub repository"> <Button minimal icon={<Icon icon={<GitHubIcon />} />} /> </a> </div> {/* Container for center content */} <div style={{ ...styles.rootContainer, backgroundColor }}> {/* Project heading */} <div style={styles.headerContainer}> <div style={{ flexGrow: 0, marginRight: 10 }}> <Image src={logoImg} alt="logo" width={52} height={52} /> </div> <Text tagName="div"> <h1>Esolang Park</h1> </Text> </div> <Text> <p>An online visual debugger for esoteric languages</p> </Text> {/* Language cards */} <div style={styles.langsContainer}> {LANGUAGES.map(({ display, id }) => ( <Link href={`/ide/${id}`} key={id}> <a style={{ all: "unset" }}> <Card interactive style={styles.langCard}> <Text style={{ fontWeight: "bold" }}>{display}</Text> </Card> </a> </Link> ))} </div> {/* "More esolangs" section */} <Text> <p> Need support for your favorite esolang? Submit an{" "} <a href={ISSUE_URL}>issue on GitHub</a> (or{" "} <a href={GUIDE_URL}>implement it yourself</a>!) </p> </Text> </div> </> ); }; export default Index;