From 9dcfad555d867dfaad14484f71357bc786b452bc Mon Sep 17 00:00:00 2001 From: Nilay Majorwar Date: Tue, 22 Feb 2022 02:17:55 +0530 Subject: [PATCH] Add side drawer to display feature guide --- pages/_app.tsx | 28 ++-- pages/index.tsx | 10 +- ui/assets/guide-breakpoints.png | Bin 0 -> 10346 bytes ui/assets/guide-exec-controls.png | Bin 0 -> 9011 bytes ui/assets/guide-info-btn.png | Bin 0 -> 5795 bytes ui/assets/guide-syntax-check.png | Bin 0 -> 20099 bytes ui/features-guide.tsx | 179 +++++++++++++++++++++++ ui/header.tsx | 12 +- ui/providers/features-guide-provider.tsx | 37 +++++ ui/providers/index.tsx | 22 +++ 10 files changed, 274 insertions(+), 14 deletions(-) create mode 100644 ui/assets/guide-breakpoints.png create mode 100644 ui/assets/guide-exec-controls.png create mode 100644 ui/assets/guide-info-btn.png create mode 100644 ui/assets/guide-syntax-check.png create mode 100644 ui/features-guide.tsx create mode 100644 ui/providers/features-guide-provider.tsx create mode 100644 ui/providers/index.tsx diff --git a/pages/_app.tsx b/pages/_app.tsx index b2794ae..34b97e7 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,3 +1,4 @@ +import React from "react"; import "../styles/globals.css"; import "../styles/editor.css"; import "../styles/mosaic.scss"; @@ -5,17 +6,24 @@ import "@blueprintjs/core/lib/css/blueprint.css"; import "@blueprintjs/icons/lib/css/blueprint-icons.css"; import "react-mosaic-component/react-mosaic-component.css"; import type { AppProps } from "next/app"; -import { DarkModeProvider } from "../ui/providers/dark-mode-provider"; -import { ErrorBoundaryProvider } from "../ui/providers/error-boundary-provider"; +import { Providers } from "../ui/providers"; +import { NextPage } from "next"; -function MyApp({ Component, pageProps }: AppProps) { - return ( - - - - - - ); +/** Type for pages that use a custom layout */ +export type NextPageWithLayout = NextPage & { + getLayout?: (page: React.ReactNode) => React.ReactNode; +}; + +/** AppProps type but extended for custom layouts */ +type AppPropsWithLayout = AppProps & { + Component: NextPageWithLayout; +}; + +function MyApp({ Component, pageProps }: AppPropsWithLayout) { + // Use the layout defined at the page level, if available + const getLayout = + Component.getLayout ?? ((page) => {page}); + return getLayout(); } export default MyApp; diff --git a/pages/index.tsx b/pages/index.tsx index d7e7c39..b371240 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { NextPage } from "next"; +import { NextPageWithLayout } from "./_app"; import Head from "next/head"; import logoImg from "../ui/assets/logo.png"; import Image from "next/image"; @@ -8,6 +8,7 @@ import Link from "next/link"; import { useDarkMode } from "../ui/providers/dark-mode-provider"; import LANGUAGES from "./languages.json"; import { GitHubIcon } from "../ui/custom-icons"; +import { Providers } from "../ui/providers"; const REPO_URL = "https://github.com/nilaymaj/esolang-park"; const WIKI_URL = REPO_URL + "/wiki"; @@ -50,7 +51,7 @@ const styles = { }, }; -const Index: NextPage = () => { +const Index: NextPageWithLayout = () => { const DarkMode = useDarkMode(); const backgroundColor = DarkMode.isDark ? Colors.DARK_GRAY3 : Colors.WHITE; @@ -113,4 +114,9 @@ const Index: NextPage = () => { ); }; +// Feature guide should not be shown on the home page +Index.getLayout = function getLayout(page: React.ReactNode) { + return {page}; +}; + export default Index; diff --git a/ui/assets/guide-breakpoints.png b/ui/assets/guide-breakpoints.png new file mode 100644 index 0000000000000000000000000000000000000000..d7178cb69bcc8038d621c6a1faec3d35b341ae8a GIT binary patch literal 10346 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 literal 0 HcmV?d00001 diff --git a/ui/assets/guide-info-btn.png b/ui/assets/guide-info-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..94ea69eae6f46ada4137b4490099cb9d3b60d1c5 GIT binary patch literal 5795 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 KXO1)Ty89nPO|lCB literal 0 HcmV?d00001 diff --git a/ui/assets/guide-syntax-check.png b/ui/assets/guide-syntax-check.png new file mode 100644 index 0000000000000000000000000000000000000000..673323da21427520205c4c3a8ed6a3166ce17452 GIT binary patch literal 20099 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 { + const { children, ...rest } = props; + return ( + + {children} + + ); +}; + +const SideBySideSection = (props: { + title: string; + children: React.ReactNode; + image: JSX.Element; +}) => { + return ( +
+ +

{props.title}

+
+
+
+
+ {props.image} +
+
+ {props.children} +
+
+ ); +}; + +const SyntaxCheckSection = () => { + return ( + } + > +

+ Esolang Park checks the syntax of your source code{" "} + while you're typing. Any errors in the syntax of your program are + marked in the editor with a (mostly) useful error message, without + needing to run the program. +

+
+ ); +}; + +const BreakpointsSection = () => { + return ( + } + > +

+ Esolang Park allows you to set debugging breakpoints in your code + . When you run your program and execution reaches a line with + breakpoint, the program will pause and you can inspect the state of the + program. +

+

+ Click on the left of any line number to set a breakpoint on that line. + Click on the red circle to remove the breakpoint. +

+
+ ); +}; + +const ExecControlsSection = () => { + return ( +
+ +

Pause, inspect and step through execution

+
+
+
+ execution controls +
+
+ +

+ When your run a program, the "Run code" button changes to the + execution controls. Pause execution to{" "} + + inspect the runtime state, start stepping through execution, change + the execution interval or stop execution entirely + + . +

+

+ The execution interval dictates how fast your program should be run by + Esolang Park. The smallest execution interval currently supported is + 5ms. +

+
+
+ ); +}; + +const InfoSection = () => { + return ( + } + > +

+ Click the document button to read a short introduction and view + reference links for the esolang. This also contains{" "} + notes about the implementation of this esolang, including any + incompatibilities and quirks you should take care of while debugging + your code. +

+

+ Click the question mark button to view this guide at any point. +

+
+ ); +}; + +type Props = { + isOpen: boolean; + onClose: () => void; +}; + +export const FeaturesGuide = (props: Props) => { + return ( + +
+ +

+ Esolang Park is an online interpreter and debugger interface{" "} + for esoteric programming languages. Think Repl.it, but a simpler + version for esoteric languages, with a visual debugger catered to + each language, that runs in your browser. +

+

+ The goal of Esolang Park is to be a platform for esolang enthusiasts + to test and debug their code more easily, as well as for other + people to discover and play around with esoteric languages without + leaving the browser. +

+

+ Esolang Park is very early in development, things are by no + means optimal, and there are most certainly bugs hanging around in + the source code. If you catch one, please create an issue on GitHub! +

+
+ + + + + + + + +
+
+ ); +}; diff --git a/ui/header.tsx b/ui/header.tsx index a433037..26e9429 100644 --- a/ui/header.tsx +++ b/ui/header.tsx @@ -3,6 +3,7 @@ import logoImg from "./assets/logo.png"; import { GitHubIcon } from "./custom-icons"; import { useDarkMode } from "./providers/dark-mode-provider"; import { Button, Card, Icon, Tag } from "@blueprintjs/core"; +import { useFeaturesGuide } from "./providers/features-guide-provider"; /** Link to the project's GitHub repository */ const REPO_LINK = "https://github.com/nilaymaj/esolang-park"; @@ -19,6 +20,7 @@ type Props = { export const Header = (props: Props) => { const DarkMode = useDarkMode(); + const featuresGuide = useFeaturesGuide(); const brandSection = (
{
-