From d6bd11f65ef3a5cff4ceff5ae4c4b75dd45f82e2 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Tue, 14 Dec 2021 23:08:18 +0100 Subject: [PATCH 01/15] First REPL mock --- .eslintrc.json | 6 +++++- components/REPLInput.tsx | 35 +++++++++++++++++++++++++++++++++++ lib/commands.ts | 7 +++++++ pages/index.tsx | 3 ++- styles/REPLInput.module.css | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 components/REPLInput.tsx create mode 100644 lib/commands.ts create mode 100644 styles/REPLInput.module.css diff --git a/.eslintrc.json b/.eslintrc.json index bffb357..ef752f8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,7 @@ { - "extends": "next/core-web-vitals" + "extends": "next/core-web-vitals", + "rules": { + "semi": ["warn", "always"], + "quotes": ["warn", "double"] + } } diff --git a/components/REPLInput.tsx b/components/REPLInput.tsx new file mode 100644 index 0000000..2a753a8 --- /dev/null +++ b/components/REPLInput.tsx @@ -0,0 +1,35 @@ +import type { NextPage } from "next"; +import React from "react" +import { commandCompletion } from "../lib/commands" +import styles from "../styles/REPLInput.module.css" + +const REPLInput: NextPage = () => { + const typed = React.createRef(); + const completion = React.createRef(); + const [currentCmd, setCurrentCmd] = React.useState(""); + + const replinOnChange = (e: React.FormEvent) => { + const currentInput = (e.target as HTMLInputElement).value; + const suggest = commandCompletion(currentInput); + setCurrentCmd(suggest); + if (typed.current) typed.current.innerHTML = currentInput; + if (completion.current) completion.current.innerHTML = suggest.substring(currentInput.length); + } + + const tabComplete = (e: React.KeyboardEvent) => { + if (e.key === "Tab" && currentCmd !== "") { + e.preventDefault(); + (e.target as HTMLInputElement).value = currentCmd; + if(typed.current) typed.current.innerHTML = currentCmd; + if(completion.current) completion.current.innerHTML = ""; + } + return false; + } + + return
+ + +
+} + +export default REPLInput; \ No newline at end of file diff --git a/lib/commands.ts b/lib/commands.ts new file mode 100644 index 0000000..572cca7 --- /dev/null +++ b/lib/commands.ts @@ -0,0 +1,7 @@ +const commandList = ["about", "navigate", "external", "help", "ed", "nano"] + +export function commandCompletion(input: string): string { + if (input === "") return ""; + const candidates = commandList.map((cmd) => [cmd.substring(0, input.length), cmd]).filter((cmd) => cmd[0] === input); + return candidates.length > 0 ? candidates[0][1] : ""; +} \ No newline at end of file diff --git a/pages/index.tsx b/pages/index.tsx index 7c06fcf..73be612 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,8 +1,9 @@ import type { NextPage } from 'next' +import REPLInput from '../components/REPLInput' const Home: NextPage = () => { return ( - <>Hallu + ) } diff --git a/styles/REPLInput.module.css b/styles/REPLInput.module.css new file mode 100644 index 0000000..8da6aef --- /dev/null +++ b/styles/REPLInput.module.css @@ -0,0 +1,37 @@ +.wrapper > input, .wrapper > span { + font-size: 1.25rem; + font-family: "CascadiaCode"; + padding: .125rem .25rem; + width: calc(100% - 1rem); +} + +.wrapper { + position: relative; +} + +.in, .in:focus { + border: 0; + outline-width: 0; +} + +.completionWrapper { + position: absolute; + pointer-events: none; + left: 0; + top: 0; + width: min-content; +} + +.completionWrapper span { + padding: 0; + margin: 0; + display: inline-block; +} + +.typed { + opacity: 0; +} + +.completion { + color: #ccc +} From 92e32e06747512cac1200b3e60b42eeb1fffde84 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Tue, 14 Dec 2021 23:45:00 +0100 Subject: [PATCH 02/15] Lint --- components/REPLInput.tsx | 14 +++++++------- lib/commands.ts | 2 +- pages/_app.tsx | 8 ++++---- pages/api/hello.ts | 4 ++-- pages/index.tsx | 10 +++++----- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/components/REPLInput.tsx b/components/REPLInput.tsx index 2a753a8..ece4031 100644 --- a/components/REPLInput.tsx +++ b/components/REPLInput.tsx @@ -1,7 +1,7 @@ import type { NextPage } from "next"; -import React from "react" -import { commandCompletion } from "../lib/commands" -import styles from "../styles/REPLInput.module.css" +import React from "react"; +import { commandCompletion } from "../lib/commands"; +import styles from "../styles/REPLInput.module.css"; const REPLInput: NextPage = () => { const typed = React.createRef(); @@ -14,7 +14,7 @@ const REPLInput: NextPage = () => { setCurrentCmd(suggest); if (typed.current) typed.current.innerHTML = currentInput; if (completion.current) completion.current.innerHTML = suggest.substring(currentInput.length); - } + }; const tabComplete = (e: React.KeyboardEvent) => { if (e.key === "Tab" && currentCmd !== "") { @@ -24,12 +24,12 @@ const REPLInput: NextPage = () => { if(completion.current) completion.current.innerHTML = ""; } return false; - } + }; return
-
-} + ; +}; export default REPLInput; \ No newline at end of file diff --git a/lib/commands.ts b/lib/commands.ts index 572cca7..9032157 100644 --- a/lib/commands.ts +++ b/lib/commands.ts @@ -1,4 +1,4 @@ -const commandList = ["about", "navigate", "external", "help", "ed", "nano"] +const commandList = ["about", "navigate", "external", "help", "ed", "nano"]; export function commandCompletion(input: string): string { if (input === "") return ""; diff --git a/pages/_app.tsx b/pages/_app.tsx index d173012..490625b 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,8 @@ -import type { AppProps } from 'next/app' -import "../styles/globals.css" +import type { AppProps } from "next/app"; +import "../styles/globals.css"; function MyApp({ Component, pageProps }: AppProps) { - return + return ; } -export default MyApp +export default MyApp; diff --git a/pages/api/hello.ts b/pages/api/hello.ts index f8bcc7e..941d4fa 100644 --- a/pages/api/hello.ts +++ b/pages/api/hello.ts @@ -1,5 +1,5 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' +import type { NextApiRequest, NextApiResponse } from "next"; type Data = { name: string @@ -9,5 +9,5 @@ export default function handler( req: NextApiRequest, res: NextApiResponse ) { - res.status(200).json({ name: 'John Doe' }) + res.status(200).json({ name: "John Doe" }); } diff --git a/pages/index.tsx b/pages/index.tsx index 73be612..5950576 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,10 +1,10 @@ -import type { NextPage } from 'next' -import REPLInput from '../components/REPLInput' +import type { NextPage } from "next"; +import REPLInput from "../components/REPLInput"; const Home: NextPage = () => { return ( - ) -} + ); +}; -export default Home +export default Home; From ced2559551fd263bcb8fa077440db8ea54bc27ed Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Wed, 15 Dec 2021 18:56:32 +0100 Subject: [PATCH 03/15] New structure and more tabbing --- components/{ => REPL}/REPLInput.tsx | 19 +++++++++++-------- components/REPL/index.tsx | 9 +++++++++ lib/commands.ts | 8 ++++---- pages/index.tsx | 4 ++-- 4 files changed, 26 insertions(+), 14 deletions(-) rename components/{ => REPL}/REPLInput.tsx (64%) create mode 100644 components/REPL/index.tsx diff --git a/components/REPLInput.tsx b/components/REPL/REPLInput.tsx similarity index 64% rename from components/REPLInput.tsx rename to components/REPL/REPLInput.tsx index ece4031..23bd174 100644 --- a/components/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -1,27 +1,30 @@ import type { NextPage } from "next"; import React from "react"; -import { commandCompletion } from "../lib/commands"; -import styles from "../styles/REPLInput.module.css"; +import { commandCompletion } from "../../lib/commands"; +import styles from "../../styles/REPLInput.module.css"; -const REPLInput: NextPage = () => { +const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallback}) => { const typed = React.createRef(); const completion = React.createRef(); - const [currentCmd, setCurrentCmd] = React.useState(""); + const [currentCmd, setCurrentCmd] = React.useState([]); + const [justTabbed, setJustTabbed] = React.useState(0); const replinOnChange = (e: React.FormEvent) => { const currentInput = (e.target as HTMLInputElement).value; const suggest = commandCompletion(currentInput); setCurrentCmd(suggest); + if (suggest.length === 0) suggest.push(""); if (typed.current) typed.current.innerHTML = currentInput; - if (completion.current) completion.current.innerHTML = suggest.substring(currentInput.length); + if (completion.current) completion.current.innerHTML = suggest[0].substring(currentInput.length); }; const tabComplete = (e: React.KeyboardEvent) => { - if (e.key === "Tab" && currentCmd !== "") { + if (e.key === "Tab" && currentCmd.length !== 0) { e.preventDefault(); - (e.target as HTMLInputElement).value = currentCmd; - if(typed.current) typed.current.innerHTML = currentCmd; + (e.target as HTMLInputElement).value = currentCmd[justTabbed % currentCmd.length]; + if(typed.current) typed.current.innerHTML = currentCmd[justTabbed % currentCmd.length]; if(completion.current) completion.current.innerHTML = ""; + setJustTabbed(justTabbed + 1); } return false; }; diff --git a/components/REPL/index.tsx b/components/REPL/index.tsx new file mode 100644 index 0000000..a3bdfc8 --- /dev/null +++ b/components/REPL/index.tsx @@ -0,0 +1,9 @@ +import { useCallback, useState } from "react"; +import REPLInput from "./REPLInput"; + +const REPL = () => { + const [history, manipulateHistory] = useState([]); + return ; +}; + +export default REPL; \ No newline at end of file diff --git a/lib/commands.ts b/lib/commands.ts index 9032157..0006724 100644 --- a/lib/commands.ts +++ b/lib/commands.ts @@ -1,7 +1,7 @@ const commandList = ["about", "navigate", "external", "help", "ed", "nano"]; -export function commandCompletion(input: string): string { - if (input === "") return ""; - const candidates = commandList.map((cmd) => [cmd.substring(0, input.length), cmd]).filter((cmd) => cmd[0] === input); - return candidates.length > 0 ? candidates[0][1] : ""; +export function commandCompletion(input: string): string[] { + if (input === "") return []; + const candidates = commandList.filter((cmd) => cmd.substring(0, input.length) === input); + return candidates; } \ No newline at end of file diff --git a/pages/index.tsx b/pages/index.tsx index 5950576..b81bd9d 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,9 +1,9 @@ import type { NextPage } from "next"; -import REPLInput from "../components/REPLInput"; +import REPL from "../components/REPL"; const Home: NextPage = () => { return ( - + ); }; From ec595650fd026b11a4c8748b5e4be67b8c163fb6 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 00:21:14 +0100 Subject: [PATCH 04/15] Command framework --- components/REPL/REPLHistory.tsx | 10 +++ components/REPL/REPLInput.tsx | 13 +++- components/REPL/index.tsx | 12 +++- lib/commands.ts | 7 --- lib/commands/definitions.tsx | 85 ++++++++++++++++++++++++++ lib/commands/index.ts | 31 ++++++++++ lib/commands/types.tsx | 19 ++++++ styles/REPL/REPLHistory.module.css | 10 +++ styles/{ => REPL}/REPLInput.module.css | 1 + styles/globals.css | 10 ++- 10 files changed, 183 insertions(+), 15 deletions(-) create mode 100644 components/REPL/REPLHistory.tsx delete mode 100644 lib/commands.ts create mode 100644 lib/commands/definitions.tsx create mode 100644 lib/commands/index.ts create mode 100644 lib/commands/types.tsx create mode 100644 styles/REPL/REPLHistory.module.css rename styles/{ => REPL}/REPLInput.module.css (94%) diff --git a/components/REPL/REPLHistory.tsx b/components/REPL/REPLHistory.tsx new file mode 100644 index 0000000..894f1ec --- /dev/null +++ b/components/REPL/REPLHistory.tsx @@ -0,0 +1,10 @@ +import { NextPage } from "next"; +import styles from "../../styles/REPL/REPLHistory.module.css"; + +const REPLHistory: NextPage<{history: string[]}> = ({history}) => { + return
+ { history.map((value, idx) =>
{value === "" ? "\u00A0" : value}
) } +
; +}; + +export default REPLHistory; \ No newline at end of file diff --git a/components/REPL/REPLInput.tsx b/components/REPL/REPLInput.tsx index 23bd174..d8c2c27 100644 --- a/components/REPL/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -1,7 +1,7 @@ import type { NextPage } from "next"; import React from "react"; -import { commandCompletion } from "../../lib/commands"; -import styles from "../../styles/REPLInput.module.css"; +import { commandCompletion, executeCommand } from "../../lib/commands"; +import styles from "../../styles/REPL/REPLInput.module.css"; const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallback}) => { const typed = React.createRef(); @@ -25,7 +25,16 @@ const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallba if(typed.current) typed.current.innerHTML = currentCmd[justTabbed % currentCmd.length]; if(completion.current) completion.current.innerHTML = ""; setJustTabbed(justTabbed + 1); + } else setJustTabbed(0); + + if (e.key === "Enter") { + const result = executeCommand((e.target as HTMLInputElement).value); + (e.target as HTMLInputElement).value = ""; + if(typed.current) typed.current.innerHTML = ""; + if(completion.current) completion.current.innerHTML = ""; + historyCallback(result); } + return false; }; diff --git a/components/REPL/index.tsx b/components/REPL/index.tsx index a3bdfc8..e1a5a5b 100644 --- a/components/REPL/index.tsx +++ b/components/REPL/index.tsx @@ -1,9 +1,15 @@ -import { useCallback, useState } from "react"; +import { useState } from "react"; import REPLInput from "./REPLInput"; +import REPLHistory from "./REPLHistory"; const REPL = () => { - const [history, manipulateHistory] = useState([]); - return ; + const [history, manipulateHistory] = useState([]); + const onCommandExecuted = (result: string[]) => manipulateHistory(result.reverse().concat(history).slice(0, 1000)); + + return (<> + + + ); }; export default REPL; \ No newline at end of file diff --git a/lib/commands.ts b/lib/commands.ts deleted file mode 100644 index 0006724..0000000 --- a/lib/commands.ts +++ /dev/null @@ -1,7 +0,0 @@ -const commandList = ["about", "navigate", "external", "help", "ed", "nano"]; - -export function commandCompletion(input: string): string[] { - if (input === "") return []; - const candidates = commandList.filter((cmd) => cmd.substring(0, input.length) === input); - return candidates; -} \ No newline at end of file diff --git a/lib/commands/definitions.tsx b/lib/commands/definitions.tsx new file mode 100644 index 0000000..f75c140 --- /dev/null +++ b/lib/commands/definitions.tsx @@ -0,0 +1,85 @@ +import type { Command } from "./types"; + +function illegalUse(raw: string, cmd: Command): string[] { + return [ + "Syntax error!", + `Cannot parse "${raw}"`, + "" + ].concat(printSyntax(cmd)); +} + +function checkFlags(flags: string[], cmd: Command): boolean { + if (!flags || flags === []) return true; + if (!cmd.flags) return false; + + for (const flag of flags) { + const isLong = flag.substring(0,2) === "--"; + const flagObj = cmd.flags.find(f => isLong ? f.long === flag.substring(2) : f.short === flag.substring(1)); + if (!flagObj) return false; + } + return true; +} + +function checkSubcmd(subcmds: string[], cmd: Command): boolean { + if (!subcmds || subcmds === []) return true; + if (!cmd.subcommands) return false; + + for (const sc of subcmds) { + const flagObj = cmd.subcommands.find(s => s.name === sc); + if (!flagObj) return false; + } + return true; +} + +export function printSyntax(cmd: Command): string[] { + let flagsOption = ""; + let flagsDesc = []; + if (cmd.flags && cmd.flags.length > 0) { + flagsOption = " ["; + flagsDesc.push("Flags:"); + cmd.flags.forEach((flag => { + flagsOption += `-${flag.short} `; + flagsDesc.push(`\t-${flag.short}\t--${flag.long}\t${flag.desc}`); + })); + flagsOption = flagsOption.substring(0, flagsOption.length-1) + "]"; + flagsDesc.push(""); + } + + let subcmdOption = ""; + let subcmdDesc = []; + if (cmd.subcommands && cmd.subcommands.length > 0) { + subcmdOption = " ["; + subcmdDesc.push("Subcommands:"); + cmd.subcommands.forEach((subcmd => { + subcmdOption += `${subcmd.name}|`; + subcmdDesc.push(`\t${subcmd.name}\t${subcmd.desc}`); + })); + subcmdOption = subcmdOption.substring(0, subcmdOption.length-1) + "]"; + subcmdDesc.push(""); + } + + return [`Usage: ${cmd.name}${flagsOption}${subcmdOption}`, ""].concat(flagsDesc).concat(subcmdDesc); +} + +const about: Command = { + name: "about", + desc: "Show information about this page.", + execute: (_flags, _args, _raw) => { + return [ + "Hello there wanderer.", + "So you want to know what this is about?", + "", + "Well, the answer is pretty unspectecular:", + "This site presents some stuff that the user named C0ntroller created.", + "If you wander arround you will find various projects.", + "", + "The navigation is done via this console interface.", + "Even when you open a project page you don't need your mouse - just press Esc to close it.", + "", + "I hope you enjoy your stay here!", + "If you wanted more information about the page itself, type 'project this'." + ]; + } +}; + +export const commandList = [about]; \ No newline at end of file diff --git a/lib/commands/index.ts b/lib/commands/index.ts new file mode 100644 index 0000000..462e68e --- /dev/null +++ b/lib/commands/index.ts @@ -0,0 +1,31 @@ +import { printSyntax, commandList } from "./definitions"; + +//const commandList = ["about", "navigate", "external", "help", "ed", "nano"]; + +export function commandCompletion(input: string): string[] { + if (input === "") return []; + const candidates = commandList.filter(cmd => cmd.name.substring(0, input.length) === input).map(cmd => cmd.name); + return candidates; +} + +export function executeCommand(command: string): string[] { + if (!command) return [`$ ${command}`].concat(illegalCommand(command)); + const args = command.split(" "); + const cmd = commandList.find(cmd => cmd.name === args[0]); + if (!cmd) return [`$ ${command}`].concat(illegalCommand(command)); + + const parsed = seperateFlags(args.splice(1)); + const result = parsed.flags.includes("--help") ? printSyntax(cmd) : cmd.execute(parsed.flags, parsed.subcmds, command); + + return [`$ ${command}`].concat(result); +} + +function seperateFlags(args: string[]): {flags: string[], subcmds: string[]} { + const flags = args.filter(arg => arg.substring(0,1) === "-"); + const subcmds = args.filter(arg => arg.substring(0,1) !== "-"); + return {flags, subcmds}; +} + +function illegalCommand(command: string): string[] { + return [`Command '${command}' not found.`, "Type 'help' for help."]; +} \ No newline at end of file diff --git a/lib/commands/types.tsx b/lib/commands/types.tsx new file mode 100644 index 0000000..c515cd7 --- /dev/null +++ b/lib/commands/types.tsx @@ -0,0 +1,19 @@ +interface Flag { + short: string; + long: string; + desc: string; +} + +interface SubCommand { + name: string; + desc: string; +} + +export interface Command { + name: string; + hidden?: boolean; + desc: string; + flags?: Flag[]; + subcommands?: SubCommand[]; + execute: (flags: string[], args: string[], raw: string) => string[]; +} diff --git a/styles/REPL/REPLHistory.module.css b/styles/REPL/REPLHistory.module.css new file mode 100644 index 0000000..397458e --- /dev/null +++ b/styles/REPL/REPLHistory.module.css @@ -0,0 +1,10 @@ +.container { + height: 70vh; + overflow: auto; + display: flex; + flex-direction: column-reverse; +} + +.line { + border-bottom: 1px solid #000; +} \ No newline at end of file diff --git a/styles/REPLInput.module.css b/styles/REPL/REPLInput.module.css similarity index 94% rename from styles/REPLInput.module.css rename to styles/REPL/REPLInput.module.css index 8da6aef..f2e024e 100644 --- a/styles/REPLInput.module.css +++ b/styles/REPL/REPLInput.module.css @@ -7,6 +7,7 @@ .wrapper { position: relative; + border: 2px solid #000; } .in, .in:focus { diff --git a/styles/globals.css b/styles/globals.css index f1bd48a..22d9b4d 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -1,4 +1,8 @@ @font-face { - font-family: CascadiaCode; - src: url(fonts/CascadiaCode.woff2); - } \ No newline at end of file + font-family: CascadiaCode; + src: url(fonts/CascadiaCode.woff2); +} + +* { + box-sizing: border-box; +} \ No newline at end of file From 2403816461ba252e7de08253b31efdea9dfb8fb4 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 01:03:54 +0100 Subject: [PATCH 05/15] Haxxor! --- components/REPL/REPLInput.tsx | 9 ++++++--- lib/commands/definitions.tsx | 6 +++--- pages/index.tsx | 5 ++++- styles/Home.module.css | 7 +++++++ styles/REPL/REPLHistory.module.css | 6 ++++-- styles/REPL/REPLInput.module.css | 28 +++++++++++++++++++++++----- styles/globals.css | 9 +++++++++ 7 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 styles/Home.module.css diff --git a/components/REPL/REPLInput.tsx b/components/REPL/REPLInput.tsx index d8c2c27..b83b458 100644 --- a/components/REPL/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -38,9 +38,12 @@ const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallba return false; }; - return
- - + return
+ +
+ + +
; }; diff --git a/lib/commands/definitions.tsx b/lib/commands/definitions.tsx index f75c140..9956680 100644 --- a/lib/commands/definitions.tsx +++ b/lib/commands/definitions.tsx @@ -36,29 +36,29 @@ export function printSyntax(cmd: Command): string[] { let flagsDesc = []; if (cmd.flags && cmd.flags.length > 0) { flagsOption = " ["; + flagsDesc.push(""); flagsDesc.push("Flags:"); cmd.flags.forEach((flag => { flagsOption += `-${flag.short} `; flagsDesc.push(`\t-${flag.short}\t--${flag.long}\t${flag.desc}`); })); flagsOption = flagsOption.substring(0, flagsOption.length-1) + "]"; - flagsDesc.push(""); } let subcmdOption = ""; let subcmdDesc = []; if (cmd.subcommands && cmd.subcommands.length > 0) { subcmdOption = " ["; + subcmdDesc.push(""); subcmdDesc.push("Subcommands:"); cmd.subcommands.forEach((subcmd => { subcmdOption += `${subcmd.name}|`; subcmdDesc.push(`\t${subcmd.name}\t${subcmd.desc}`); })); subcmdOption = subcmdOption.substring(0, subcmdOption.length-1) + "]"; - subcmdDesc.push(""); } - return [`Usage: ${cmd.name}${flagsOption}${subcmdOption}`, ""].concat(flagsDesc).concat(subcmdDesc); + return [`Usage: ${cmd.name}${flagsOption}${subcmdOption}`].concat(flagsDesc).concat(subcmdDesc); } const about: Command = { diff --git a/pages/index.tsx b/pages/index.tsx index b81bd9d..5f446b1 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,9 +1,12 @@ import type { NextPage } from "next"; import REPL from "../components/REPL"; +import styles from "../styles/Home.module.css"; const Home: NextPage = () => { return ( - +
+ +
); }; diff --git a/styles/Home.module.css b/styles/Home.module.css new file mode 100644 index 0000000..a41afc5 --- /dev/null +++ b/styles/Home.module.css @@ -0,0 +1,7 @@ +.container { + display: flex; + flex-direction: column; + height: 100vh; + margin: 0; + padding: 10px; +} \ No newline at end of file diff --git a/styles/REPL/REPLHistory.module.css b/styles/REPL/REPLHistory.module.css index 397458e..a47ac6d 100644 --- a/styles/REPL/REPLHistory.module.css +++ b/styles/REPL/REPLHistory.module.css @@ -1,10 +1,12 @@ .container { - height: 70vh; overflow: auto; display: flex; flex-direction: column-reverse; + flex-grow: 2; + font-size: 1.25rem; + font-family: "CascadiaCode", monospace; } .line { - border-bottom: 1px solid #000; + padding: 3px 0; } \ No newline at end of file diff --git a/styles/REPL/REPLInput.module.css b/styles/REPL/REPLInput.module.css index f2e024e..055dcc6 100644 --- a/styles/REPL/REPLInput.module.css +++ b/styles/REPL/REPLInput.module.css @@ -1,18 +1,36 @@ .wrapper > input, .wrapper > span { + padding: .125rem 0; font-size: 1.25rem; - font-family: "CascadiaCode"; - padding: .125rem .25rem; - width: calc(100% - 1rem); + font-family: "CascadiaCode", monospace; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + color: var(--repl-color); } .wrapper { position: relative; - border: 2px solid #000; + flex-grow: 2; + display: block; +} + +.wrapperwrapper { + display: flex; + width: 100%; + flex-direction: row; + flex-wrap: nowrap; +} + +.inputstart { + padding: .125rem 0; + font-size: 1.25rem; + font-family: "CascadiaCode", monospace; } .in, .in:focus { border: 0; outline-width: 0; + background: transparent; } .completionWrapper { @@ -34,5 +52,5 @@ } .completion { - color: #ccc + color: var(--repl-color-hint); } diff --git a/styles/globals.css b/styles/globals.css index 22d9b4d..808c6a8 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -5,4 +5,13 @@ * { box-sizing: border-box; + --repl-color: #188a18; + --repl-color-hint: #092909; +} + +body { + margin: 0; + padding: 0; + color: var(--repl-color); + background: #000; } \ No newline at end of file From f7bdff165338aab5a1024ccead4c710ac8ddd98e Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 01:15:43 +0100 Subject: [PATCH 06/15] Set focus on input --- components/REPL/REPLHistory.tsx | 12 ++++++++++-- components/REPL/REPLInput.tsx | 11 ++++++++--- components/REPL/index.tsx | 7 ++++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/components/REPL/REPLHistory.tsx b/components/REPL/REPLHistory.tsx index 894f1ec..fbe289e 100644 --- a/components/REPL/REPLHistory.tsx +++ b/components/REPL/REPLHistory.tsx @@ -1,8 +1,16 @@ import { NextPage } from "next"; +import { MutableRefObject } from "react"; import styles from "../../styles/REPL/REPLHistory.module.css"; -const REPLHistory: NextPage<{history: string[]}> = ({history}) => { - return
+interface REPLHistoryParams { + history: string[]; + inputRef: MutableRefObject; +} + +const REPLHistory: NextPage = ({history, inputRef}) => { + const focusInput = () => {if (inputRef.current) inputRef.current.focus();}; + + return
{ history.map((value, idx) =>
{value === "" ? "\u00A0" : value}
) }
; }; diff --git a/components/REPL/REPLInput.tsx b/components/REPL/REPLInput.tsx index b83b458..11b07c4 100644 --- a/components/REPL/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -1,9 +1,14 @@ import type { NextPage } from "next"; -import React from "react"; +import React, { MutableRefObject } from "react"; import { commandCompletion, executeCommand } from "../../lib/commands"; import styles from "../../styles/REPL/REPLInput.module.css"; -const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallback}) => { +interface REPLInputParams { + historyCallback: CallableFunction; + inputRef: MutableRefObject; +} + +const REPLInput: NextPage = ({historyCallback, inputRef}) => { const typed = React.createRef(); const completion = React.createRef(); const [currentCmd, setCurrentCmd] = React.useState([]); @@ -41,7 +46,7 @@ const REPLInput: NextPage<{historyCallback: CallableFunction}> = ({historyCallba return
- + } className={styles.in} type={"text"} onChange={replinOnChange} onKeyDown={tabComplete} spellCheck={"false"} autoFocus />
; diff --git a/components/REPL/index.tsx b/components/REPL/index.tsx index e1a5a5b..5dc955b 100644 --- a/components/REPL/index.tsx +++ b/components/REPL/index.tsx @@ -1,14 +1,15 @@ -import { useState } from "react"; +import { useRef, useState } from "react"; import REPLInput from "./REPLInput"; import REPLHistory from "./REPLHistory"; const REPL = () => { const [history, manipulateHistory] = useState([]); + const inputRef = useRef(); const onCommandExecuted = (result: string[]) => manipulateHistory(result.reverse().concat(history).slice(0, 1000)); return (<> - - + + ); }; From b3a6b836e4322ae37e036e59cab7c5514a3987f4 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 01:22:29 +0100 Subject: [PATCH 07/15] Bump nextjs --- package-lock.json | 274 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34a4c89..2cd3975 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "my_website", "dependencies": { - "next": "12.0.4", + "next": "^12.0.7", "react": "17.0.2", "react-dom": "17.0.2" }, @@ -842,9 +842,9 @@ "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" }, "node_modules/@next/env": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.4.tgz", - "integrity": "sha512-QtZ6X5c6Zqa7oWs5csEmZ7xy+gLdtRKKg02SOT5l0Ziea4P5IU8mSOCyNC4fZmXewcRVjpbY+yGqAAP7hJUfOA==" + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.7.tgz", + "integrity": "sha512-TNDqBV37wd95SiNdZsSUq8gnnrTwr+aN9wqy4Zxrxw4bC/jCHNsbK94DxjkG99VL30VCRXXDBTA1/Wa2jIpF9Q==" }, "node_modules/@next/eslint-plugin-next": { "version": "12.0.4", @@ -856,14 +856,14 @@ } }, "node_modules/@next/polyfill-module": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.4.tgz", - "integrity": "sha512-mk9yCDNpfXINTJKFTZNgwYs7eqRFpc5D/49O/fKB59blihyKl1GY1sZ0l7a2bn5l1X/WuaZzcIfqnrwkneqeaQ==" + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.7.tgz", + "integrity": "sha512-sA8LAMMlmcspIZw/jeQuJTyA3uGrqOhTBaQE+G9u6DPohqrBFRkaz7RzzJeqXkUXw600occsIBknSjyVd1R67A==" }, "node_modules/@next/react-dev-overlay": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.4.tgz", - "integrity": "sha512-9O0lXyzv5goFSmDwq9Hp8JE+DcObvd+bTXvmGSSvYR91AlIoVlH8/PwATx8Rf5YEuqggn/XKR1hn2kBYcbcGnA==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.7.tgz", + "integrity": "sha512-dSQLgpZ5uzyittFtIHlJCLAbc0LlMFbRBSYuGsIlrtGyjYN+WMcnz8lK48VLxNPFGuB/hEzkWV4TW5Zu75+Fzg==", "dependencies": { "@babel/code-frame": "7.12.11", "anser": "1.4.9", @@ -953,9 +953,9 @@ } }, "node_modules/@next/react-refresh-utils": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.4.tgz", - "integrity": "sha512-kNUDmpBaJ+8Lb8CtKNynRFF9oijCjUKKru6Ont+JKhti9//5dNFFIcuo607bJSH86un06OEK0TZUt5XWVlbkjw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.7.tgz", + "integrity": "sha512-Pglj1t+7RxH0txEqVcD8ZxrJgqLDmKvQDqxKq3ZPRWxMv7LTl7FVT2Pnb36QFeBwCvMVl67jxsADKsW0idz8sA==", "peerDependencies": { "react-refresh": "0.8.3", "webpack": "^4 || ^5" @@ -967,9 +967,9 @@ } }, "node_modules/@next/swc-android-arm64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.4.tgz", - "integrity": "sha512-6mXumia8ZPcy7bYu9kjItfWxrE6SFaJyqQDaFy9G9WrU9x3M1R1Yok8B2X1mboM8itD0tq+t3R/ebQEkkmevUw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.7.tgz", + "integrity": "sha512-yViT7EEc7JqxncRT+ZTeTsrAYXLlcefo0Y0eAfYmmalGD2605L4FWAVrJi4WnrSLji7l+veczw1WBmNeHICKKA==", "cpu": [ "arm64" ], @@ -982,9 +982,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.4.tgz", - "integrity": "sha512-7WMen1qhF5JmjKD9S5IEgEoaPJOXyIZj/Nsqa8ZSWxdF5oogp3uYYbKb/rvMYoKzpIbjyoLH/OCM5lm5IFM4iw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.7.tgz", + "integrity": "sha512-vhAyW2rDEUcQesRVaj0z1hSoz7QhDzzGd0V1/5/5i9YJOfOtyrPsVJ82tlf7BfXl6/Ep+eKNfWVIb5/Jv89EKg==", "cpu": [ "arm64" ], @@ -997,9 +997,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.4.tgz", - "integrity": "sha512-PVgefMWjxP6CU1HQs39+Bfpjcue6qErJfvJ/+n2zimjLzyeQAmD6LM9f1lDSttW2LjKjasoxR5qkRNLVlqzlaA==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.7.tgz", + "integrity": "sha512-km+6Rx6TvbraoQ1f0MXa69ol/x0RxzucFGa2OgZaYJERas0spy0iwW8hpASsGcf597D8VRW1x+R2C7ZdjVBSTw==", "cpu": [ "x64" ], @@ -1012,9 +1012,9 @@ } }, "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.4.tgz", - "integrity": "sha512-8xGQu3sJiIdriKiCux3jDJ9pwivELEg7z2zfW0CqmQMbKNB7qP9lc0pq6CxshtKyXRMczNWRMtQ3Cjwep+UvNg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.7.tgz", + "integrity": "sha512-d0zWr877YqZ2cf/DQy6obouaR39r0FPebcXj2nws9AC99m68CO2xVpWv9jT7mFvpY+T40HJisLH80jSZ2iQ9sA==", "cpu": [ "arm" ], @@ -1027,9 +1027,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.4.tgz", - "integrity": "sha512-HhEWcBkqGr3E7SYLtN9VnYUGamAWaLcXawHN33Em0WP7gzXrBqz0iIJNH7uEzHDS6980EqU/rrkLyhCHrYSZgQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.7.tgz", + "integrity": "sha512-fdobh5u6gG13Gd5LkHhJ+W8tF9hbaFolRW99FhzArMe5/nMKlLdBymOxvitE3K4gSFQxbXJA6TbU0Vv0e59Kww==", "cpu": [ "arm64" ], @@ -1042,9 +1042,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.4.tgz", - "integrity": "sha512-oZyQ9wjtE7OX9RlnovP7izNx2AR/RzTuYWU4Ttim8ssABsipQSxSlfRaeb+Qi6jTc6k+lrPhjRfaZ+fGv/m2Ag==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.7.tgz", + "integrity": "sha512-vx0c5Q3oIScFNT/4jI9rCe0yPzKuCqWOkiO/OOV0ixSI2gLhbrwDIcdkm79fKVn3i8JOJunxE4zDoFeR/g8xqQ==", "cpu": [ "arm64" ], @@ -1057,9 +1057,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.4.tgz", - "integrity": "sha512-aBuf78QzL93T59Lk9kEGfHcA+9SzYIH7dGon1nqVxtAd2iqicKYNVaVcb38VKeiIBXMSUHXTdu6Ee053ZCOmSw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.7.tgz", + "integrity": "sha512-9ITyp6s6uGVKNx3C/GP7GrYycbcwTADG7TdIXzXUxOOZORrdB1GNg3w/EL3Am4VMPPEpO6v1RfKo2IKZpVKfTA==", "cpu": [ "x64" ], @@ -1072,9 +1072,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.4.tgz", - "integrity": "sha512-yDgqUqL4H8M3Y0hv30ZyL9UvjnK4iXmD4I6iJz+XIHSRdA/VUiyKKoL7okf9hxr0mSxBtagbZ5A3qEoW/VliUQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.7.tgz", + "integrity": "sha512-C+k+cygbIZXYfc+Hx2fNPUBEg7jzio+mniP5ywZevuTXW14zodIfQ3ZMoMJR8EpOVvYpjWFk2uAjiwqgx8vo/g==", "cpu": [ "x64" ], @@ -1087,9 +1087,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.4.tgz", - "integrity": "sha512-evDUrEYsUo+PMHsedaymfZO98VwV9wNFzuWVCyKgqg6SD1ZRpzbpqYQY7aINIuqZVdIWZElBE6EM+oxaj7PuWQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.7.tgz", + "integrity": "sha512-7jTRjOKkDVnb5s7VoHT7eX+eyT/5BQJ/ljP2G56riAgKGqPL63/V7FXemLhhLT67D+OjoP8DRA2E2ne6IPHk4w==", "cpu": [ "arm64" ], @@ -1102,9 +1102,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.4.tgz", - "integrity": "sha512-Lbmz0xlo8vW4EDWyzCfy3nGfqt7skqwxaERwe+vDVTBZ56mvJ5dsdyjqK24sxu4FFkWR7SaU4eNlHwZR+A3kTg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.7.tgz", + "integrity": "sha512-2u5pGDsk7H6gGxob2ATIojzlwKzgYsrijo7RRpXOiPePVqwPWg6/pmhaJzLdpfjaBgRg1NFmwSp/7Ump9X8Ijg==", "cpu": [ "ia32" ], @@ -1117,9 +1117,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.4.tgz", - "integrity": "sha512-f+7WNIJOno5QEelrmob+3vN5EZJb3KCkOrnvUsQ0+LCCD0dIPIhCjeHAh3BGj9msGu8ijnXvD7JxVxE5V26cnQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.7.tgz", + "integrity": "sha512-frEWtbf+q8Oz4e2UqKJrNssk6DZ6/NLCQXn5/ORWE9dPAfe9XS6aK5FRZ6DuEPmmKd5gOoRkKJFFz5nYd+TeyQ==", "cpu": [ "x64" ], @@ -4070,17 +4070,17 @@ "dev": true }, "node_modules/next": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/next/-/next-12.0.4.tgz", - "integrity": "sha512-1pvjcSZBm5OLoGmDhp4JwKwIE798WbqUNLuyU7w6a2jUkdWaxOYtkE/ROXQTi2pXHj7+6rm68AvhxROLX2NHQg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/next/-/next-12.0.7.tgz", + "integrity": "sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA==", "dependencies": { "@babel/runtime": "7.15.4", "@hapi/accept": "5.0.2", "@napi-rs/triples": "1.0.3", - "@next/env": "12.0.4", - "@next/polyfill-module": "12.0.4", - "@next/react-dev-overlay": "12.0.4", - "@next/react-refresh-utils": "12.0.4", + "@next/env": "12.0.7", + "@next/polyfill-module": "12.0.7", + "@next/react-dev-overlay": "12.0.7", + "@next/react-refresh-utils": "12.0.7", "acorn": "8.5.0", "assert": "2.0.0", "browserify-zlib": "0.2.0", @@ -4122,7 +4122,7 @@ "use-subscription": "1.5.1", "util": "0.12.4", "vm-browserify": "1.1.2", - "watchpack": "2.1.1" + "watchpack": "2.3.0" }, "bin": { "next": "dist/bin/next" @@ -4131,23 +4131,23 @@ "node": ">=12.22.0" }, "optionalDependencies": { - "@next/swc-android-arm64": "12.0.4", - "@next/swc-darwin-arm64": "12.0.4", - "@next/swc-darwin-x64": "12.0.4", - "@next/swc-linux-arm-gnueabihf": "12.0.4", - "@next/swc-linux-arm64-gnu": "12.0.4", - "@next/swc-linux-arm64-musl": "12.0.4", - "@next/swc-linux-x64-gnu": "12.0.4", - "@next/swc-linux-x64-musl": "12.0.4", - "@next/swc-win32-arm64-msvc": "12.0.4", - "@next/swc-win32-ia32-msvc": "12.0.4", - "@next/swc-win32-x64-msvc": "12.0.4" + "@next/swc-android-arm64": "12.0.7", + "@next/swc-darwin-arm64": "12.0.7", + "@next/swc-darwin-x64": "12.0.7", + "@next/swc-linux-arm-gnueabihf": "12.0.7", + "@next/swc-linux-arm64-gnu": "12.0.7", + "@next/swc-linux-arm64-musl": "12.0.7", + "@next/swc-linux-x64-gnu": "12.0.7", + "@next/swc-linux-x64-musl": "12.0.7", + "@next/swc-win32-arm64-msvc": "12.0.7", + "@next/swc-win32-ia32-msvc": "12.0.7", + "@next/swc-win32-x64-msvc": "12.0.7" }, "peerDependencies": { "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0", + "react": "^17.0.2 || ^18.0.0-0", + "react-dom": "^17.0.2 || ^18.0.0-0", "sass": "^1.3.0" }, "peerDependenciesMeta": { @@ -5500,9 +5500,9 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/watchpack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", - "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", + "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -6266,9 +6266,9 @@ "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" }, "@next/env": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.4.tgz", - "integrity": "sha512-QtZ6X5c6Zqa7oWs5csEmZ7xy+gLdtRKKg02SOT5l0Ziea4P5IU8mSOCyNC4fZmXewcRVjpbY+yGqAAP7hJUfOA==" + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.7.tgz", + "integrity": "sha512-TNDqBV37wd95SiNdZsSUq8gnnrTwr+aN9wqy4Zxrxw4bC/jCHNsbK94DxjkG99VL30VCRXXDBTA1/Wa2jIpF9Q==" }, "@next/eslint-plugin-next": { "version": "12.0.4", @@ -6280,14 +6280,14 @@ } }, "@next/polyfill-module": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.4.tgz", - "integrity": "sha512-mk9yCDNpfXINTJKFTZNgwYs7eqRFpc5D/49O/fKB59blihyKl1GY1sZ0l7a2bn5l1X/WuaZzcIfqnrwkneqeaQ==" + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.7.tgz", + "integrity": "sha512-sA8LAMMlmcspIZw/jeQuJTyA3uGrqOhTBaQE+G9u6DPohqrBFRkaz7RzzJeqXkUXw600occsIBknSjyVd1R67A==" }, "@next/react-dev-overlay": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.4.tgz", - "integrity": "sha512-9O0lXyzv5goFSmDwq9Hp8JE+DcObvd+bTXvmGSSvYR91AlIoVlH8/PwATx8Rf5YEuqggn/XKR1hn2kBYcbcGnA==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.7.tgz", + "integrity": "sha512-dSQLgpZ5uzyittFtIHlJCLAbc0LlMFbRBSYuGsIlrtGyjYN+WMcnz8lK48VLxNPFGuB/hEzkWV4TW5Zu75+Fzg==", "requires": { "@babel/code-frame": "7.12.11", "anser": "1.4.9", @@ -6348,75 +6348,75 @@ } }, "@next/react-refresh-utils": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.4.tgz", - "integrity": "sha512-kNUDmpBaJ+8Lb8CtKNynRFF9oijCjUKKru6Ont+JKhti9//5dNFFIcuo607bJSH86un06OEK0TZUt5XWVlbkjw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.7.tgz", + "integrity": "sha512-Pglj1t+7RxH0txEqVcD8ZxrJgqLDmKvQDqxKq3ZPRWxMv7LTl7FVT2Pnb36QFeBwCvMVl67jxsADKsW0idz8sA==", "requires": {} }, "@next/swc-android-arm64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.4.tgz", - "integrity": "sha512-6mXumia8ZPcy7bYu9kjItfWxrE6SFaJyqQDaFy9G9WrU9x3M1R1Yok8B2X1mboM8itD0tq+t3R/ebQEkkmevUw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.7.tgz", + "integrity": "sha512-yViT7EEc7JqxncRT+ZTeTsrAYXLlcefo0Y0eAfYmmalGD2605L4FWAVrJi4WnrSLji7l+veczw1WBmNeHICKKA==", "optional": true }, "@next/swc-darwin-arm64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.4.tgz", - "integrity": "sha512-7WMen1qhF5JmjKD9S5IEgEoaPJOXyIZj/Nsqa8ZSWxdF5oogp3uYYbKb/rvMYoKzpIbjyoLH/OCM5lm5IFM4iw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.7.tgz", + "integrity": "sha512-vhAyW2rDEUcQesRVaj0z1hSoz7QhDzzGd0V1/5/5i9YJOfOtyrPsVJ82tlf7BfXl6/Ep+eKNfWVIb5/Jv89EKg==", "optional": true }, "@next/swc-darwin-x64": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.4.tgz", - "integrity": "sha512-PVgefMWjxP6CU1HQs39+Bfpjcue6qErJfvJ/+n2zimjLzyeQAmD6LM9f1lDSttW2LjKjasoxR5qkRNLVlqzlaA==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.7.tgz", + "integrity": "sha512-km+6Rx6TvbraoQ1f0MXa69ol/x0RxzucFGa2OgZaYJERas0spy0iwW8hpASsGcf597D8VRW1x+R2C7ZdjVBSTw==", "optional": true }, "@next/swc-linux-arm-gnueabihf": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.4.tgz", - "integrity": "sha512-8xGQu3sJiIdriKiCux3jDJ9pwivELEg7z2zfW0CqmQMbKNB7qP9lc0pq6CxshtKyXRMczNWRMtQ3Cjwep+UvNg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.7.tgz", + "integrity": "sha512-d0zWr877YqZ2cf/DQy6obouaR39r0FPebcXj2nws9AC99m68CO2xVpWv9jT7mFvpY+T40HJisLH80jSZ2iQ9sA==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.4.tgz", - "integrity": "sha512-HhEWcBkqGr3E7SYLtN9VnYUGamAWaLcXawHN33Em0WP7gzXrBqz0iIJNH7uEzHDS6980EqU/rrkLyhCHrYSZgQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.7.tgz", + "integrity": "sha512-fdobh5u6gG13Gd5LkHhJ+W8tF9hbaFolRW99FhzArMe5/nMKlLdBymOxvitE3K4gSFQxbXJA6TbU0Vv0e59Kww==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.4.tgz", - "integrity": "sha512-oZyQ9wjtE7OX9RlnovP7izNx2AR/RzTuYWU4Ttim8ssABsipQSxSlfRaeb+Qi6jTc6k+lrPhjRfaZ+fGv/m2Ag==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.7.tgz", + "integrity": "sha512-vx0c5Q3oIScFNT/4jI9rCe0yPzKuCqWOkiO/OOV0ixSI2gLhbrwDIcdkm79fKVn3i8JOJunxE4zDoFeR/g8xqQ==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.4.tgz", - "integrity": "sha512-aBuf78QzL93T59Lk9kEGfHcA+9SzYIH7dGon1nqVxtAd2iqicKYNVaVcb38VKeiIBXMSUHXTdu6Ee053ZCOmSw==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.7.tgz", + "integrity": "sha512-9ITyp6s6uGVKNx3C/GP7GrYycbcwTADG7TdIXzXUxOOZORrdB1GNg3w/EL3Am4VMPPEpO6v1RfKo2IKZpVKfTA==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.4.tgz", - "integrity": "sha512-yDgqUqL4H8M3Y0hv30ZyL9UvjnK4iXmD4I6iJz+XIHSRdA/VUiyKKoL7okf9hxr0mSxBtagbZ5A3qEoW/VliUQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.7.tgz", + "integrity": "sha512-C+k+cygbIZXYfc+Hx2fNPUBEg7jzio+mniP5ywZevuTXW14zodIfQ3ZMoMJR8EpOVvYpjWFk2uAjiwqgx8vo/g==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.4.tgz", - "integrity": "sha512-evDUrEYsUo+PMHsedaymfZO98VwV9wNFzuWVCyKgqg6SD1ZRpzbpqYQY7aINIuqZVdIWZElBE6EM+oxaj7PuWQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.7.tgz", + "integrity": "sha512-7jTRjOKkDVnb5s7VoHT7eX+eyT/5BQJ/ljP2G56riAgKGqPL63/V7FXemLhhLT67D+OjoP8DRA2E2ne6IPHk4w==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.4.tgz", - "integrity": "sha512-Lbmz0xlo8vW4EDWyzCfy3nGfqt7skqwxaERwe+vDVTBZ56mvJ5dsdyjqK24sxu4FFkWR7SaU4eNlHwZR+A3kTg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.7.tgz", + "integrity": "sha512-2u5pGDsk7H6gGxob2ATIojzlwKzgYsrijo7RRpXOiPePVqwPWg6/pmhaJzLdpfjaBgRg1NFmwSp/7Ump9X8Ijg==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.4.tgz", - "integrity": "sha512-f+7WNIJOno5QEelrmob+3vN5EZJb3KCkOrnvUsQ0+LCCD0dIPIhCjeHAh3BGj9msGu8ijnXvD7JxVxE5V26cnQ==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.7.tgz", + "integrity": "sha512-frEWtbf+q8Oz4e2UqKJrNssk6DZ6/NLCQXn5/ORWE9dPAfe9XS6aK5FRZ6DuEPmmKd5gOoRkKJFFz5nYd+TeyQ==", "optional": true }, "@nodelib/fs.scandir": { @@ -8639,28 +8639,28 @@ "dev": true }, "next": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/next/-/next-12.0.4.tgz", - "integrity": "sha512-1pvjcSZBm5OLoGmDhp4JwKwIE798WbqUNLuyU7w6a2jUkdWaxOYtkE/ROXQTi2pXHj7+6rm68AvhxROLX2NHQg==", + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/next/-/next-12.0.7.tgz", + "integrity": "sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA==", "requires": { "@babel/runtime": "7.15.4", "@hapi/accept": "5.0.2", "@napi-rs/triples": "1.0.3", - "@next/env": "12.0.4", - "@next/polyfill-module": "12.0.4", - "@next/react-dev-overlay": "12.0.4", - "@next/react-refresh-utils": "12.0.4", - "@next/swc-android-arm64": "12.0.4", - "@next/swc-darwin-arm64": "12.0.4", - "@next/swc-darwin-x64": "12.0.4", - "@next/swc-linux-arm-gnueabihf": "12.0.4", - "@next/swc-linux-arm64-gnu": "12.0.4", - "@next/swc-linux-arm64-musl": "12.0.4", - "@next/swc-linux-x64-gnu": "12.0.4", - "@next/swc-linux-x64-musl": "12.0.4", - "@next/swc-win32-arm64-msvc": "12.0.4", - "@next/swc-win32-ia32-msvc": "12.0.4", - "@next/swc-win32-x64-msvc": "12.0.4", + "@next/env": "12.0.7", + "@next/polyfill-module": "12.0.7", + "@next/react-dev-overlay": "12.0.7", + "@next/react-refresh-utils": "12.0.7", + "@next/swc-android-arm64": "12.0.7", + "@next/swc-darwin-arm64": "12.0.7", + "@next/swc-darwin-x64": "12.0.7", + "@next/swc-linux-arm-gnueabihf": "12.0.7", + "@next/swc-linux-arm64-gnu": "12.0.7", + "@next/swc-linux-arm64-musl": "12.0.7", + "@next/swc-linux-x64-gnu": "12.0.7", + "@next/swc-linux-x64-musl": "12.0.7", + "@next/swc-win32-arm64-msvc": "12.0.7", + "@next/swc-win32-ia32-msvc": "12.0.7", + "@next/swc-win32-x64-msvc": "12.0.7", "acorn": "8.5.0", "assert": "2.0.0", "browserify-zlib": "0.2.0", @@ -8702,7 +8702,7 @@ "use-subscription": "1.5.1", "util": "0.12.4", "vm-browserify": "1.1.2", - "watchpack": "2.1.1" + "watchpack": "2.3.0" } }, "node-fetch": { @@ -9716,9 +9716,9 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "watchpack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", - "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", + "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" diff --git a/package.json b/package.json index c720d53..5138180 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lint": "npx next lint" }, "dependencies": { - "next": "12.0.4", + "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2" }, From 47d9dabf9ab55d5715f7e8e6c8b99e2fb70c209e Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 12:01:59 +0100 Subject: [PATCH 08/15] Only lowercase input --- components/REPL/REPLInput.tsx | 3 ++- next-env.d.ts | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/REPL/REPLInput.tsx b/components/REPL/REPLInput.tsx index 11b07c4..91a1f69 100644 --- a/components/REPL/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -15,7 +15,8 @@ const REPLInput: NextPage = ({historyCallback, inputRef}) => { const [justTabbed, setJustTabbed] = React.useState(0); const replinOnChange = (e: React.FormEvent) => { - const currentInput = (e.target as HTMLInputElement).value; + const currentInput = (e.target as HTMLInputElement).value.toLowerCase(); + (e.target as HTMLInputElement).value = currentInput; const suggest = commandCompletion(currentInput); setCurrentCmd(suggest); if (suggest.length === 0) suggest.push(""); diff --git a/next-env.d.ts b/next-env.d.ts index 9bc3dd4..4f11a03 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,5 +1,4 @@ /// -/// /// // NOTE: This file should not be edited From a535c5b69a32319a0aa10273d6f71d396d8e85be Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Thu, 16 Dec 2021 14:56:25 +0100 Subject: [PATCH 09/15] Remove firefox focus ring --- styles/REPL/REPLInput.module.css | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/styles/REPL/REPLInput.module.css b/styles/REPL/REPLInput.module.css index 055dcc6..15e1008 100644 --- a/styles/REPL/REPLInput.module.css +++ b/styles/REPL/REPLInput.module.css @@ -27,10 +27,19 @@ font-family: "CascadiaCode", monospace; } -.in, .in:focus { +.in { border: 0; - outline-width: 0; background: transparent; + width: 100%; + appearance: none !important; + caret-color: var(--repl-color); + outline: none; +} + +.in::-moz-focus-outer, .in::-moz-focus-inner, .in:focus, .in:focus *, .in:-moz-focusring, .in:-moz-focusring * { + border: none !important; + outline: none !important; + box-shadow: none !important; } .completionWrapper { From c25a0e34e2f1753750d02bb1bc343a310483c85e Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 18:55:00 +0100 Subject: [PATCH 10/15] Fix stuff, help command --- components/REPL/REPLHistory.tsx | 2 +- components/REPL/REPLInput.tsx | 35 +++++++++++++------ .../{definitions.tsx => definitions.ts} | 35 +++++++++++++++++-- lib/commands/types.tsx | 4 +-- package-lock.json | 2 +- pages/index.tsx | 8 +++-- styles/REPL/REPLHistory.module.css | 4 +++ styles/REPL/REPLInput.module.css | 6 +++- 8 files changed, 77 insertions(+), 19 deletions(-) rename lib/commands/{definitions.tsx => definitions.ts} (67%) diff --git a/components/REPL/REPLHistory.tsx b/components/REPL/REPLHistory.tsx index fbe289e..1daeb8a 100644 --- a/components/REPL/REPLHistory.tsx +++ b/components/REPL/REPLHistory.tsx @@ -11,7 +11,7 @@ const REPLHistory: NextPage = ({history, inputRef}) => { const focusInput = () => {if (inputRef.current) inputRef.current.focus();}; return
- { history.map((value, idx) =>
{value === "" ? "\u00A0" : value}
) } + { history.map((value, idx) =>
{value === "" ? "\u00A0" : value}
) }
; }; diff --git a/components/REPL/REPLInput.tsx b/components/REPL/REPLInput.tsx index 91a1f69..7366081 100644 --- a/components/REPL/REPLInput.tsx +++ b/components/REPL/REPLInput.tsx @@ -15,19 +15,34 @@ const REPLInput: NextPage = ({historyCallback, inputRef}) => { const [justTabbed, setJustTabbed] = React.useState(0); const replinOnChange = (e: React.FormEvent) => { - const currentInput = (e.target as HTMLInputElement).value.toLowerCase(); - (e.target as HTMLInputElement).value = currentInput; - const suggest = commandCompletion(currentInput); - setCurrentCmd(suggest); - if (suggest.length === 0) suggest.push(""); - if (typed.current) typed.current.innerHTML = currentInput; - if (completion.current) completion.current.innerHTML = suggest[0].substring(currentInput.length); + const input = (e.target as HTMLInputElement); + const currentInput = input.value.toLowerCase(); + // Force lowercase + input.value = currentInput; + + if (currentInput.includes(" ")) { + // Command already typed + input.maxLength = 524288; // Default value + if (typed.current) typed.current.innerHTML = ""; + if (completion.current) completion.current.innerHTML = ""; + setCurrentCmd([]); + return; + } else { + input.maxLength = 20; + // Get completion hint + const suggest = commandCompletion(currentInput); + setCurrentCmd(suggest); + if (suggest.length === 0) suggest.push(""); + if (typed.current) typed.current.innerHTML = currentInput; + if (completion.current) completion.current.innerHTML = suggest[0].substring(currentInput.length); + } }; const tabComplete = (e: React.KeyboardEvent) => { + const input = (e.target as HTMLInputElement); if (e.key === "Tab" && currentCmd.length !== 0) { e.preventDefault(); - (e.target as HTMLInputElement).value = currentCmd[justTabbed % currentCmd.length]; + input.value = currentCmd[justTabbed % currentCmd.length]; if(typed.current) typed.current.innerHTML = currentCmd[justTabbed % currentCmd.length]; if(completion.current) completion.current.innerHTML = ""; setJustTabbed(justTabbed + 1); @@ -35,7 +50,7 @@ const REPLInput: NextPage = ({historyCallback, inputRef}) => { if (e.key === "Enter") { const result = executeCommand((e.target as HTMLInputElement).value); - (e.target as HTMLInputElement).value = ""; + input.value = ""; if(typed.current) typed.current.innerHTML = ""; if(completion.current) completion.current.innerHTML = ""; historyCallback(result); @@ -47,7 +62,7 @@ const REPLInput: NextPage = ({historyCallback, inputRef}) => { return
- } className={styles.in} type={"text"} onChange={replinOnChange} onKeyDown={tabComplete} spellCheck={"false"} autoFocus /> + } className={styles.in} type={"text"} onChange={replinOnChange} onKeyDown={tabComplete} spellCheck={"false"} autoFocus maxLength={20} />
; diff --git a/lib/commands/definitions.tsx b/lib/commands/definitions.ts similarity index 67% rename from lib/commands/definitions.tsx rename to lib/commands/definitions.ts index 9956680..8be13eb 100644 --- a/lib/commands/definitions.tsx +++ b/lib/commands/definitions.ts @@ -1,4 +1,4 @@ -import type { Command } from "./types"; +import type { Command, Flag } from "./types"; function illegalUse(raw: string, cmd: Command): string[] { return [ @@ -31,6 +31,10 @@ function checkSubcmd(subcmds: string[], cmd: Command): boolean { return true; } +function checkFlagInclude(flagsProvided: string[], flag: Flag): boolean { + return flagsProvided.includes(`-${flag.short}`) || flagsProvided.includes(`--${flag.long}`); +} + export function printSyntax(cmd: Command): string[] { let flagsOption = ""; let flagsDesc = []; @@ -82,4 +86,31 @@ const about: Command = { } }; -export const commandList = [about]; \ No newline at end of file +const help: Command = { + name: "help", + desc: "Shows helptext.", + flags: [{ long: "more", short: "m", desc: "Show more information." }], + execute: (flags, _args, _raw) => { + checkFlags(flags, help); + if (help.flags && checkFlagInclude(flags, help.flags[0])) { + return [ + "Hello user!", + "What you see here should resemble an CLI. If you ever used Linux this should be pretty easy for you.", + "Everyone else: Have no fear. It is pretty simple. You just type in commands and the output is shown here or it does something on the webite.", + "To find out, which commands are available, you can type just 'help'.", + "", + "Have fun!" + ]; + } else { + const available = ["Available commands:"]; + commandList.forEach(cmd => available.push(`\t${cmd.name}\t${cmd.desc}`)); + available.concat([ + "", + "Need more help? Type 'help -m'!" + ]); + return available; + } + } +}; + +export const commandList = [about, help]; \ No newline at end of file diff --git a/lib/commands/types.tsx b/lib/commands/types.tsx index c515cd7..8e7ac51 100644 --- a/lib/commands/types.tsx +++ b/lib/commands/types.tsx @@ -1,4 +1,4 @@ -interface Flag { +export interface Flag { short: string; long: string; desc: string; @@ -15,5 +15,5 @@ export interface Command { desc: string; flags?: Flag[]; subcommands?: SubCommand[]; - execute: (flags: string[], args: string[], raw: string) => string[]; + execute: (flags: string[], args: string[], raw: string, extra?: any) => string[]; } diff --git a/package-lock.json b/package-lock.json index 2cd3975..0c6ac64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "my_website", "dependencies": { - "next": "^12.0.7", + "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2" }, diff --git a/pages/index.tsx b/pages/index.tsx index 5f446b1..0f13d6d 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,13 +1,17 @@ import type { NextPage } from "next"; +import Head from "next/head"; import REPL from "../components/REPL"; import styles from "../styles/Home.module.css"; const Home: NextPage = () => { - return ( + return (<> + + c0ntroller.de +
- ); + ); }; export default Home; diff --git a/styles/REPL/REPLHistory.module.css b/styles/REPL/REPLHistory.module.css index a47ac6d..9471f24 100644 --- a/styles/REPL/REPLHistory.module.css +++ b/styles/REPL/REPLHistory.module.css @@ -9,4 +9,8 @@ .line { padding: 3px 0; + white-space: pre-wrap; + font-family: inherit; + display: block; + margin: 0; } \ No newline at end of file diff --git a/styles/REPL/REPLInput.module.css b/styles/REPL/REPLInput.module.css index 15e1008..ab09f38 100644 --- a/styles/REPL/REPLInput.module.css +++ b/styles/REPL/REPLInput.module.css @@ -53,13 +53,17 @@ .completionWrapper span { padding: 0; margin: 0; - display: inline-block; + display: flex; + flex-direction: column; } .typed { opacity: 0; + flex-shrink: 1; + overflow-x: hidden; } .completion { color: var(--repl-color-hint); + flex-grow: 1; } From a24692e3edd655cdcf5dd6ee1666e317320f042f Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 19:04:34 +0100 Subject: [PATCH 11/15] man command --- lib/commands/definitions.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/commands/definitions.ts b/lib/commands/definitions.ts index 8be13eb..d88c8a7 100644 --- a/lib/commands/definitions.ts +++ b/lib/commands/definitions.ts @@ -1,5 +1,9 @@ import type { Command, Flag } from "./types"; +function getCommandByName(name: string): Command|undefined { + return commandList.find(cmd => cmd.name === name); +} + function illegalUse(raw: string, cmd: Command): string[] { return [ "Syntax error!", @@ -54,10 +58,10 @@ export function printSyntax(cmd: Command): string[] { if (cmd.subcommands && cmd.subcommands.length > 0) { subcmdOption = " ["; subcmdDesc.push(""); - subcmdDesc.push("Subcommands:"); + subcmdDesc.push("Arguments:"); cmd.subcommands.forEach((subcmd => { subcmdOption += `${subcmd.name}|`; - subcmdDesc.push(`\t${subcmd.name}\t${subcmd.desc}`); + subcmdDesc.push(`\t${subcmd.name}\t\t${subcmd.desc}`); })); subcmdOption = subcmdOption.substring(0, subcmdOption.length-1) + "]"; } @@ -113,4 +117,19 @@ const help: Command = { } }; -export const commandList = [about, help]; \ No newline at end of file +const man: Command = { + name: "man", + desc: "Provides a manual for a command.", + subcommands: [{name: "command", desc: "Name of a command"}], + execute: (_flags, args, _raw) => { + if (args.length !== 1) { + return printSyntax(man); + } else { + const cmd = getCommandByName(args[0]); + if (!cmd) return [`Cannot find command '${args[0]}'.`]; + else return printSyntax(cmd); + } + } +}; + +export const commandList = [about, help, man]; \ No newline at end of file From 9ea06a16fe59429ec37d8ef3ca58517ddeec8c76 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 20:02:42 +0100 Subject: [PATCH 12/15] More commands --- .eslintrc.json | 3 +- lib/commands/definitions.ts | 78 +++++++++++++++++++++++++++++-------- lib/commands/index.ts | 2 - lib/commands/types.tsx | 4 +- lib/projects/index.ts | 19 +++++++++ lib/projects/types.ts | 7 ++++ 6 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 lib/projects/index.ts create mode 100644 lib/projects/types.ts diff --git a/.eslintrc.json b/.eslintrc.json index ef752f8..242520f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,6 +2,7 @@ "extends": "next/core-web-vitals", "rules": { "semi": ["warn", "always"], - "quotes": ["warn", "double"] + "quotes": ["warn", "double"], + "eqeqeq": "error" } } diff --git a/lib/commands/definitions.ts b/lib/commands/definitions.ts index d88c8a7..479689e 100644 --- a/lib/commands/definitions.ts +++ b/lib/commands/definitions.ts @@ -1,4 +1,6 @@ import type { Command, Flag } from "./types"; +import type { Project } from "../projects/types"; +import projectList from "../projects"; function getCommandByName(name: string): Command|undefined { return commandList.find(cmd => cmd.name === name); @@ -18,7 +20,7 @@ function checkFlags(flags: string[], cmd: Command): boolean { for (const flag of flags) { const isLong = flag.substring(0,2) === "--"; - const flagObj = cmd.flags.find(f => isLong ? f.long === flag.substring(2) : f.short === flag.substring(1)); + const flagObj = Object.values(cmd.flags).find(f => isLong ? f.long === flag.substring(2) : f.short === flag.substring(1)); if (!flagObj) return false; } return true; @@ -29,24 +31,25 @@ function checkSubcmd(subcmds: string[], cmd: Command): boolean { if (!cmd.subcommands) return false; for (const sc of subcmds) { - const flagObj = cmd.subcommands.find(s => s.name === sc); + const flagObj = Object.values(cmd.subcommands).find(s => s.name === sc); if (!flagObj) return false; } return true; } function checkFlagInclude(flagsProvided: string[], flag: Flag): boolean { + if (!flag) return false; return flagsProvided.includes(`-${flag.short}`) || flagsProvided.includes(`--${flag.long}`); } export function printSyntax(cmd: Command): string[] { let flagsOption = ""; let flagsDesc = []; - if (cmd.flags && cmd.flags.length > 0) { + if (cmd.flags && Object.keys(cmd.flags).length > 0) { flagsOption = " ["; flagsDesc.push(""); flagsDesc.push("Flags:"); - cmd.flags.forEach((flag => { + Object.values(cmd.flags).forEach((flag => { flagsOption += `-${flag.short} `; flagsDesc.push(`\t-${flag.short}\t--${flag.long}\t${flag.desc}`); })); @@ -55,13 +58,13 @@ export function printSyntax(cmd: Command): string[] { let subcmdOption = ""; let subcmdDesc = []; - if (cmd.subcommands && cmd.subcommands.length > 0) { + if (cmd.subcommands && Object.keys(cmd.subcommands).length > 0) { subcmdOption = " ["; subcmdDesc.push(""); subcmdDesc.push("Arguments:"); - cmd.subcommands.forEach((subcmd => { + Object.values(cmd.subcommands).forEach((subcmd => { subcmdOption += `${subcmd.name}|`; - subcmdDesc.push(`\t${subcmd.name}\t\t${subcmd.desc}`); + subcmdDesc.push(`\t${subcmd.name}\t${subcmd.desc}`); })); subcmdOption = subcmdOption.substring(0, subcmdOption.length-1) + "]"; } @@ -72,7 +75,7 @@ export function printSyntax(cmd: Command): string[] { const about: Command = { name: "about", desc: "Show information about this page.", - execute: (_flags, _args, _raw) => { + execute: () => { return [ "Hello there wanderer.", "So you want to know what this is about?", @@ -85,7 +88,7 @@ const about: Command = { "Even when you open a project page you don't need your mouse - just press Esc to close it.", "", "I hope you enjoy your stay here!", - "If you wanted more information about the page itself, type 'project this'." + "If you wanted more information about the page itself, type 'project this' or 'help -t'." ]; } }; @@ -93,10 +96,9 @@ const about: Command = { const help: Command = { name: "help", desc: "Shows helptext.", - flags: [{ long: "more", short: "m", desc: "Show more information." }], - execute: (flags, _args, _raw) => { - checkFlags(flags, help); - if (help.flags && checkFlagInclude(flags, help.flags[0])) { + flags: {more: { long: "this", short: "t", desc: "Show information about this site." }}, + execute: (flags) => { + if (help.flags && checkFlagInclude(flags, help.flags.more)) { return [ "Hello user!", "What you see here should resemble an CLI. If you ever used Linux this should be pretty easy for you.", @@ -120,8 +122,10 @@ const help: Command = { const man: Command = { name: "man", desc: "Provides a manual for a command.", - subcommands: [{name: "command", desc: "Name of a command"}], - execute: (_flags, args, _raw) => { + subcommands: { + command: {name: "command", desc: "Name of a command"} + }, + execute: (_flags, args) => { if (args.length !== 1) { return printSyntax(man); } else { @@ -132,4 +136,46 @@ const man: Command = { } }; -export const commandList = [about, help, man]; \ No newline at end of file +const project: Command = { + name: "project", + desc: "Show information about a project.", + flags: { + minimal: {short: "m", long: "minimal", desc: "Only show minimal information."}, + source: {short: "s", long: "source", desc: "Open git repository of project."}, + list: {short: "l", long: "list", desc: "Show list of projects."} + }, + subcommands: {name: {name: "name", desc: "Name of the project."}}, + execute: (flags, args) => { + if (project.flags && checkFlagInclude(flags, project.flags.list)) { + const result = ["Found the following projects:"]; + projectList.forEach(project => result.push(`\t${project.name}\t${project.short}`)); + return result; + } + + if (args.length !== 1) return printSyntax(project); + + if (args[0] === "this") args[0] = "homepage"; + + const pjt = projectList.find(p => p.name === args[0]); + if (!pjt) return [ + `Cannot find project ${args[0]}!`, + "You can see available projects using 'project -l'." + ]; + + if (project.flags && checkFlagInclude(flags, project.flags.source)) { + try { + window && window.open(pjt.repo, "_blank"); + return ["Opened repository in new tab."]; + } catch { + return ["Sorry, no repository for this project."]; + } + } + if (project.flags && checkFlagInclude(flags, project.flags.minimal)) return pjt.desc; + + // TODO + // Open project page here. + return []; + } +}; + +export const commandList = [about, help, man, project]; \ No newline at end of file diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 462e68e..a0c1be7 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -1,7 +1,5 @@ import { printSyntax, commandList } from "./definitions"; -//const commandList = ["about", "navigate", "external", "help", "ed", "nano"]; - export function commandCompletion(input: string): string[] { if (input === "") return []; const candidates = commandList.filter(cmd => cmd.name.substring(0, input.length) === input).map(cmd => cmd.name); diff --git a/lib/commands/types.tsx b/lib/commands/types.tsx index 8e7ac51..f072ab7 100644 --- a/lib/commands/types.tsx +++ b/lib/commands/types.tsx @@ -13,7 +13,7 @@ export interface Command { name: string; hidden?: boolean; desc: string; - flags?: Flag[]; - subcommands?: SubCommand[]; + flags?: Record; + subcommands?: Record; execute: (flags: string[], args: string[], raw: string, extra?: any) => string[]; } diff --git a/lib/projects/index.ts b/lib/projects/index.ts new file mode 100644 index 0000000..a9f6012 --- /dev/null +++ b/lib/projects/index.ts @@ -0,0 +1,19 @@ +import type { Project } from "./types"; + +const projectList: Project[] = [ + { + name: "homepage", + short: "This website.", + desc: [ + "This is my homepage.", + "What you see here should resemble an CLI. If you ever used Linux this should be pretty easy for you.", + "Everyone else: Have no fear. It is pretty simple. You just type in commands and the output is shown here or it does something on the webite.", + "To find out, which commands are available, you can type just 'help'.", + "", + "Have fun!" + ], + repo: "https://git.c0ntroller.de/c0ntroller/frontpage" + } +]; + +export default projectList; \ No newline at end of file diff --git a/lib/projects/types.ts b/lib/projects/types.ts new file mode 100644 index 0000000..feca901 --- /dev/null +++ b/lib/projects/types.ts @@ -0,0 +1,7 @@ +export interface Project { + name: string; + desc: string[]; + short: string; + more?: string; + repo?: string; +} \ No newline at end of file From 0e79703732a0b9ba96e340e8c5bd2fc0a8cb77a2 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 20:03:03 +0100 Subject: [PATCH 13/15] Add favicon --- pages/_app.tsx | 25 ++++++++++++++++++++++++- public/android-chrome-192x192.png | Bin 0 -> 9302 bytes public/android-chrome-512x512.png | Bin 0 -> 32890 bytes public/apple-touch-icon-114x114.png | Bin 0 -> 4436 bytes public/apple-touch-icon-120x120.png | Bin 0 -> 4579 bytes public/apple-touch-icon-144x144.png | Bin 0 -> 5632 bytes public/apple-touch-icon-152x152.png | Bin 0 -> 5860 bytes public/apple-touch-icon-180x180.png | Bin 0 -> 7087 bytes public/apple-touch-icon-57x57.png | Bin 0 -> 2349 bytes public/apple-touch-icon-60x60.png | Bin 0 -> 2441 bytes public/apple-touch-icon-72x72.png | Bin 0 -> 2862 bytes public/apple-touch-icon-76x76.png | Bin 0 -> 3036 bytes public/favicon-16x16.ico | Bin 0 -> 1150 bytes public/favicon-16x16.png | Bin 0 -> 1248 bytes public/favicon-32x32.ico | Bin 0 -> 4286 bytes public/favicon-32x32.png | Bin 0 -> 1944 bytes public/favicon-96x96.ico | Bin 0 -> 38078 bytes public/favicon-96x96.png | Bin 0 -> 3423 bytes public/favicon.ico | Bin 25931 -> 1150 bytes public/manifest.json | 19 +++++++++++++++++++ public/mstile-150x150.png | Bin 0 -> 5436 bytes public/mstile-310x310.png | Bin 0 -> 13245 bytes public/mstile-70x70.png | Bin 0 -> 2528 bytes public/vercel.svg | 4 ---- 24 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon-114x114.png create mode 100644 public/apple-touch-icon-120x120.png create mode 100644 public/apple-touch-icon-144x144.png create mode 100644 public/apple-touch-icon-152x152.png create mode 100644 public/apple-touch-icon-180x180.png create mode 100644 public/apple-touch-icon-57x57.png create mode 100644 public/apple-touch-icon-60x60.png create mode 100644 public/apple-touch-icon-72x72.png create mode 100644 public/apple-touch-icon-76x76.png create mode 100644 public/favicon-16x16.ico create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.ico create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon-96x96.ico create mode 100644 public/favicon-96x96.png create mode 100644 public/manifest.json create mode 100644 public/mstile-150x150.png create mode 100644 public/mstile-310x310.png create mode 100644 public/mstile-70x70.png delete mode 100644 public/vercel.svg diff --git a/pages/_app.tsx b/pages/_app.tsx index 490625b..93f80d0 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,31 @@ import type { AppProps } from "next/app"; +import Head from "next/head"; import "../styles/globals.css"; function MyApp({ Component, pageProps }: AppProps) { - return ; + return <> + + + + + + + + + + + + + + + + + + + + + ; + ; } export default MyApp; diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..71a8c5308bf61a76c04ab3929008d37673ce258d GIT binary patch literal 9302 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�xH6y2O&{tTyj$9V&c4(~+>0()1Y#K(Z#TQ#M~E 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 literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon-152x152.png b/public/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..7d75fec4b29828d55a71a2f614e7dd1372619f19 GIT binary patch literal 5860 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 H^trzPbBt3h literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon-72x72.png b/public/apple-touch-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..668b34b70f69064a6c01c2ad56e71c165f43e72a GIT binary patch literal 2862 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 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.ico b/public/favicon-16x16.ico new file mode 100644 index 0000000000000000000000000000000000000000..23bb1321411400979bf4e641578c83c5129193b7 GIT binary patch literal 1150 zcmeH_KTE?v6u{q^GzOB`UThMRQ0O8!_yu(7OY&95B zeJ{5E=)jUvYBvnSyEu;D<2V~On`^@?%Rb;WP1Bb=&#%j}T$ypW_B`*IJVV?>(T)-6 z!HuccJC)D+lO%c5TCY=YpLik)ml1km(K>Cge9?Owxd)z6HC_OZVxnGb8s0Tx?5& literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aafe1b2121086d798fdafdae42ce99d337e1f216 GIT binary patch literal 1248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47;7?}odYtHlYs&gYbV-z9Cna7 z8XxRBv1^5_i;Pi-y0@#V%+fB`4FR{f)>_So`NirhHAzI={ovLI4~{2YJ$N)SoITu8 z;15G#adA+|M4|uFMWT*W6x``A|1MYlo?&5J+Nzs|j4NiPsw4**PL37b9Vh5u&nDpL zlC(_DUw7F<%YE-2K7JiLBfWC|@8U07mXjInCRX&lY;)b?XtO!<<(%)G&1*C?k32u} zm@Rg~kBP50oz9=b&BtwHoUvr`=Od0u8!sFylHR;%p^(3DyGZEb8pX$(4pnw*`c_>u&q!aG$-S-pm+PgCd;;Ornz> zv;S|te|Of;m7eCB0<2c?Ilq%dUfg1pGQIuJZrj^qoDb^R)@_-#KZrfe-gEudEf)kY zZ0C)M*=|zFzvB*L+q{yK6J$>M2cLM}_}%!|G97~o?k{V0?lt{h_={o5%GFP$A3P9{ z&<^;v>-g^7x2u1D_u0H({>`7F8?P3=NdQKNLb6AYF9SoB8UsT^3j@P1pisjL28L1t z28LHad8-)=4B`cIb_Lo1C7uWPgt!7}>H-!P77h*$ZfB= z%d@euiHnO%OG}H2iV6w}LZlcO8G*`x%Eg6*Bt%4j3V=XNOiWTz5~vcW21v?ENrf;n zS~4&sva%L1G6F?hd3h%=F!VAo*z@z}hI?I`z9b*0)S)EEFPMQ%!QM)ofk8H)X2O&x zac+=qothmx3PrR2|Nrx7b8ATQ;Wl>0jsG7s1XRfi9{vCSlBxic_tL9Rp4>clwuf)O zzg{WOEXE{ncNd@U`2wGT9L@rd$YKTtZeb8+WSBKa0w~B{;_2(k{**^h*qrSE&r>I$ zP==?AV~E7%-X2aYOJtU$raXNj zDl&CSXow?I)+?z#zjJ!)@@7Tdvf8B}Xj{u%&hM|EU+%1&EWAN2*tnS6TRU4i+PXT+ zLI&uHTtn_GanIe0fObljxJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5rgg5d5!-7E- zq$mX_Wt9w8!C+)yWTUTlW#KLBy5y2 zc(k-Ac~-Ywr4}lsR)8+G1JYjz#!~SaGabQmP=TNVK?Q;e)KGzy%*~mmITVY<#uACd zgyT3blF6ia*3i)Ki1t2)UDq9C>}Gv^{S99Cq|<4$hIM97jqu{QVHnTj@p!(mu~BEU z*#ggN*6DOBTD0%a^p(acv=j7gn4P$a>n_%PYumQ=Jnz@KlH0a7YQs3KmFhNssS-Wmq*?i98b0`!#M7~Th z`6AjS#p_BzVGW)Dy8|JJS10Z zQ3vf1P9cO!VbS>%)YBoCUr?&0=PlKiwU4#hk%5B2x+iG+(7~E@QYMsOCpk;1=*oQ>pJjRTP1tc#w9;BFt}gLUUK1#a literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c411ecb8b564bb09b5c4dd9060d86f131f781d GIT binary patch literal 1944 zcmd^A`Bzg{5S|xESh5gE0)(I<0zz}Ct5e6dU-0hpy;ulDl4w8*+`)l#84|L_!n zwM*E{0HM&jGGBO7tT8^$-4ivA53<@txA42rFgVx|_v?kW$Z&&j9(4lJGcrPzYBOyy zeR*qkTK~?h(WzNap?qaR^$iYoc(2q>vV>C@&1hO_y2zVA93kR$koqJ?#os-GOqm5ZX5SvV-fU->bc-`l@buP3`YquZemdDfVrdduMzZYm{zh z<&8FhHtCHVH z=npk`E7zOv7B&vI8x3wC)YKQXgc>Axi%vAu_n7vaB1c7?`b1^&LqE2)OnJG$`f|w9 z&Ih@p^T(^^v9pOUj-5X1I+{KX6-SQVXAKTgE$50~o#|+5y1DkvXkcB-w4n*b^~dEy zF}jx`@ed6G$Z-JJxEWv^xi&ro$YcXNMse;Q0E@KJGfO-Ha2v#dVL}A>KO2ESAdyH^ zD%H%)j7FoeEG*Dz=;r#r%*4dR*w9c<@1t0KeSH>-Wo2cBWDN}sKc5oIfW(oLLZP7Tq?9d* zL_`AsfXYKQDK&%14AIkbMgxMrXMlJdPK5>rfW>4k$FM8_IY2BxIv#(5L^=W>#oF9)3J0`fO-Xb^ zyZP=Op6;_8IL@3;`O;12C&nAa`c7}OFEuAN23a_|2Nd198;7mezPGo%I~VGiuj-y? zw$f|SJ}eO$h^udLtcP^L23uQhnL^)ZOsjn!VKHSo|E5;^ZXH3=@lLDlTmW;B8n6)3yS714On5Y%r`vb_W7R9>#coP`!Duh(X{{8ee1%{MxxxhE*ExM zX2$5V7tde)`EtZ0!rYSnwb-;aIWj3CTM*y(oH4gp*wNbFHq*|*{!qn5Mn$D_S42b3 zkDAOUZpl%NvXP?WC6PBgPODzy(->QXZT73L)eJPQ@92(h8XX!q)lz?~`9N*;nJV+D z12yNc!!g6TdD|${JaUHI3vOKR>%Z8eA-Ekpd$4Zxu!c4>X{ z{A3?Hy;noDaE@L{#0n4X$M^Ngeo4Gq>bkbOUo~PeFRDKKa%fKFHZ=x={izA!Zu1%F z0GUc*gp!|{k|LEWfv=FpDy8u@Su$mkjh`q;9G*)-g9`RKP&^88CGQd7!gk>}a$Foa zZebh`uB$7Tyvx(w*o#+9U|sT8urBqfM5 zs#55(W!ud}22J1$mu1E&u=k literal 0 HcmV?d00001 diff --git a/public/favicon-96x96.ico b/public/favicon-96x96.ico new file mode 100644 index 0000000000000000000000000000000000000000..f8987156f632b43296c288fd8c7457722aa2c1da GIT binary patch literal 38078 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 W%51MM_C+3LhMyhMbDQ;>0{;cWPlBTW literal 0 HcmV?d00001 diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7ffc7b45b11bfb7befdace23d126ba2ef7d8c3 GIT binary patch literal 3423 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 QXGZ`l>>11xv&%{U25ox>U;qFB literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..23bb1321411400979bf4e641578c83c5129193b7 100644 GIT binary patch literal 1150 zcmeH_KTE?v6u{q^GzOB`UThMRQ0O8!_yu(7OY&95B zeJ{5E=)jUvYBvnSyEu;D<2V~On`^@?%Rb;WP1Bb=&#%j}T$ypW_B`*IJVV?>(T)-6 z!HuccJC)D+lO%c5TCY=YpLik)ml1km(K>Cge9?Owxd)z6HC_OZVxnGb8s0Tx?5& literal 25931 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 LrJugUA?W`A8`#=m diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..2577b08 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "c0ntroller.de", + "short_name": "c0ntroller.de", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#444444", + "background_color": "#444444", + "display": "standalone" +} diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..274cc6645371ad29dd17b1a78e6b0c89ed3f1667 GIT binary patch literal 5436 zcmb`LXHXN$x4=X1kkFAL2~mn5{n7#mBs3{fL_(F&yYwnW6e6J{D7{?~L8S(W2vQN_mW2@q>m^nI0Kj2l47aAv zdH;51M(PNo30VdJXySbh3~u?ly8{4HxcfM5;}17P`dn=gxb&Bza1kY2$(sm-$cuDD ziX_l(EFn;FeM7!0Pu;*~HHPVr zp<71UXCJb3^{y8>T~P>?{hO9AXNBoc%F?%@->*#6q=5{Yt^ud+yg%j`E~(C6=)BqL zXCWmr*0a?>xQRJ}iOde-QDY>sll1`r(1i(H&o+8)t272%>FqqAI~sSa_;owr zuZIEpgGCQT8r#MM|E`c?h6CYryTl}>mkhVXZaa{z5WYxj{yaM?8GBo#E#k%__|u!V z+$mTs#fQeIqs4%xS!b`vs_N=@OUE(iE5|yM+Rb56$7Z9OzibY_d_D^AJ{Ma$K0d2o zbH2rku=@XLHtYx_&f-}#kxXO;(tRLazss~^O=2bWEO$oSy;LBbFwLJaNet^#=ZtTl zn7x^0stsWG$KPO-qLZhqr>|$Mm+8NP78LkE+l+pjC9tAF5)9mpU~MGKN+Qf~r$%#`QA|G+)ya*_f|t7jbO0SCi%3&XHn${gVq9_}oOQjE7s-0YwF4sY#|jL~ zIA+jOz@*WnV2Pd|FUBk+XuDD(zoJ94zJv9M4K#n!SKq`+H!<#%6C1>>YL$`%;mqe5 z(P_!8fXfDcPdnKGKZ*HC$Ko&Q<%S~7)E=Urcd$uEXG@IFvQ$d%ir?ccOfS-==x{|d z>|7-c8*kTsdG20F)5RKpiK68AlC@Fv5dnC4*R8(VIjRFFea{jC(L(dqa82+p(r;}1 znR`s}3T8~;H3>dghFL=LHYbT+u@>Kw$xgs&>j6v#HJLe>A2b85 z{BWpcd_Yl|Ky}&|daLa)_7g4Mo6B?pT?+F-)@D9Py*0~(&oHSJzMk}ybLP2^a} zw4dgvcI{~wYqN>_Zh25FqVc;LM58l&7Bu-hycPYy;OvcXdWh(R+y-4XczTnD1cLtn zDVZ;(QarWZQMOlzlAvpm(Gr$^y45|F5G1)S13`bx3wdCKTi^19$~ZPWV#E22*ZH+` z;zLK~;u$EKs1R4K4mQwiEM{(r?t+uT1Kpa4I+3o$VA~S3>?r=m?>@VWu7G+Q9OcE9 zHQ)C42?KBbjv!$MzuXsI_HydX+FCO%93}3HC5Wsw4`wC`Y>8KR2lTQmr5tER6gMM{w@-D-*2raR z-($r31^F+6Soi)4&kD^cFcm3ws587Dndeo5@RFOJYip}83W;NT%w9USZ6K!HxHvpO z%oex1rvD)07hRC&p_~T)&~jqqOluk5Dr(O$c@&HrJBj>K0Ar@DkbRK11+=NJ@$y{}013lpCBP{a=;OKsAS9e_GwnwjE5p`uP z?P0S{i@GUPze5vj0OAtCRyg0Zd^Z*rwL17ETrHHYJ!qPM!d7lE;con$tbUT;u($6@ zo4~ot@eU<%KbsqM(cst@w~xo;Vd)iRP}}_GfVk8&ArqU;FT8byLO+ME5>z~8Mqf$X z=|{dCX(Bopyp~z!?LHq7SeQTUp{!9ESY9CUR3)NPpTj z*S^I^i+0dT7jZTm^qaoOxl=R6cRVVnY^lC|JZ14jAlEcQ^%BL##^X>kv&X?4tnmn0 z8ReP!hTxFh7t6BjmJhNjgDd4RVP*eO+8X1buOTHRF{KIDuAwzQDSae2A*F!s>|MWX)VIU3PI~YT6)IQizwUZ_?-rTI z`?CN?XN>9%4d;8F0!O3kB67YBru4=4PA)!P<#Krhd%64oHD6!a@&RH8yq2i7lK_2o zNj$c;VYx;U3!8!N2pe;5eCP{udcRCt16j{VF=jvw2edTa;OE^$g{EGiNkc7TcRS}$MLEfS1zt%3FsfC?}D+d<5@Lr|Fwg~V8t1F z*l-H%^eq|h`|%hLjxC0^U-Sv0l=sVo6=R;2P!Yxp8f4xPCn+kqTZWoSO3qu#frZ@4 zmHlm1KO&SL=Fet)$o^_P~@mHr%Pl1XhX`eSf#Y}bmQntPxW<>Z% zc6WdJGa|LNl*haAE~T$=utU{K1}B-5vj-c6TX|4VS31|U?bqqHh*kV1ij;{S6Eoa% zxVa14u{3r)7sf)@*RZz@w6M}mHo~XagTB`E(fUCz7R)lS*!Xlir_#6Rj!bSB%e70YOl}R;DA^2Yo-6^|^t;!$ZwCs>1L__R)rEzWOH)6 zdGV=L>U_a)u`3Z=HZh7oaMTZ8h5iqF!$>oKg+71VS%@bgY$ zMBb~SVJ{tRZS&^Y@Y1)(kc63)PXWvPq+`%hRK-dJm+$OviGP@!B(W;}rLxwFGXWR| z)bH+;0}(lyGTBchuH*T_U@n6_hs^J=^5P?>*UvK0{hea`68f^!KqXJkasJAs-56!9 zo3a0}*V$n*ev|*M6*TW%FVU}`P9S~xAr;ejGSC$1puBW!o&&u~&DrKQwFG&C*p*Zq z=X77mPD*D2*qSPH5AD#NU3#h0Q`qRf^{X$f z>k14NhAB#cX`Nwy;aQy<4cEu{Z`+=Qv)BT!tzJ5Ejzbupj+o%Cef?XTq0BIpHf_0} zeZLrl^W$Pq5k%6w=u^Xw;n4XlJAJO8(S-0R&b}20<$Aj!C6NV6R*VdWKHB+xeg@o428&tJEJ*u_{ zVaTamcuctk4qRJ+JTUd~9&-NZmIuKXd8d`B-D25?)@sH4B*hs9pVa*i8g!_c-52F7J z&}%l~(|EV|05oo4qJEiW&Z;!*W7wSkl+(nNC@DbkCz@yhcAI@Bh4KmraDmQTD>+PG znSoouzsEU0TJ7xWKSSxK+CMu~$hQ|(`8mkryx2d>)u)hYC}EjX*a}3jP5!kwzP5(YqN-N#Y*tzv z{#=ibe=z2c68GXroC30Jt;(fA*uO5bf_ZX7ze2Ia^vc!R7qfoDeXMjY_~qBguQyKo^`HbzLeuRD>&gYIh9zcFi4H^ z%y?F$Kok$##YVebji(>s5;Bjh2Rw+3RY{dKDPX3pDmI^}C{{uAelG%)@)cEWX%T>! z=}pQhJL-i6giw1<95;P*k|lb-{K8JhwovR7xoP+QpDASC7GXL8cm0wllbnoG)=jKV zMO5=3hg-(b6X;M{YO2|2^`Pu?6^)_o*wTHUs4H)e@MN-VmparFxm~CEcEZuo%0TuKp^PgS;g(GK zq?=_+ZgBW%ZpAz6M=;HSY9q&$(+JU-jBd~MCIYxUgpvvS)~tn!D)HrZf;oMP$eaV{ zdYc}MKAyPWk(MQ*(Nxb7aNA7-0>vF;jJN&Ab+*Ns_o$Dd{7;^f*(!*#H9>!{{AQlw z>iqzVO^Gzz6-tztR%C4rUy$SWV7?pI4x91l*dl^!x}d{WhMa5K2e)b|&FXaYBN`=V zi)cj#yx?EEjTf~HLO*@Dh%w8@=sbm{LmaQ?o8{&S=3qqFtI`SaBXu{Bj=BXZr~ z#~QLy4)wN;0n*Egl&x`;{78QgTDJDPqCsHb*W$g(*?@$A(9k{Q>A5cLjKIGw#u&d# zFl^s%DQ{}!LfW*WX1p?nG8Nk#v!>g+@L}o$o%<;HSce&JTSwuJgI*YJTyO-vGV2*IaP0p_=8{t8ap}0F_WYAm0tc~ceV8w2$ zDc9vCu`SMT9Oqoq)IZ=r#4x)A1T(!e%icy*h2N@IM3Kry>!s2w{(oBl+r{MsKR&M^ z`XCCmI3yH~un#u~4h-}R3I`a3db)*sdWc8)hWm&cnV8?YlgueVg|7Syc~DiF?*AbG zN(xGfa*9fFifXos8k(xAnhJkiQ&7}YP`KJS5&pjn0)st#y<+}vgF9P(gH!|Ie|Mmk zA2r>B@5O}rdi#U}ZbhI1eBH(2!GUhRL2q!1j#Lct-Q>)Ai%$lilZWY z1H$EegT%wEjr7gD^{5pv0N;Ppfo?$&UT*H;5uu);|G~}5upg-a=l=k~9-aY!e@z|l Snixt-5d3`@>uH{sH%gIaR0UGd10F`ta(uLTsWIo+V2uSb3fsd{YOMk zTbt`sqBiQq3|-};Y|B5?1{~?P*mOGTmX`3ai4L5ZDXpmn^Cg+5x3{s+JC^ILTjt#X z9&>5_L>~WrvLb8yuhTN*pWoXF!e7c{Slw>6zWG?4hFRkYtdz${qI6lQZEtyX+bY{3 zu<*kBBi6WEuS-JsS8F;0lWNVYYSvVL11XhUg>b&_@5Vy`o`QUuPj3tT z3+2}@f0~#exT~Xj*_EoUA(>+-B<&^sf#P=hD(!Xj;{5yHUvwXeGE+aYL0rIZZOl+} zJed8fhS}`_EQQlleM7bz)7q=+R@Z$Sxj9nLU};$|AIQ`&NB*Y3r}r&auhFaT>ybpc zKc(W*0l<@r#?}W!&p%`zzm)&tTv}qjBlhB~3E$j28+<|3uWjeux%47z741MspMwwn z%-Dd8EJ&D)EFy-C><@_)u|Y=WD@{hWMe2W)O-9D%k=OK6h15X<)6;oE=1OKt_S}Ip zTaiQocsw)nCL;r~{-=?Xz0bQtBGUTk8fer0qQA-dkOoWtOOuRDI$ZaO#y)N!{_+?*cncJcSWOWk81hlyPJFSfhkUO2mG2*+ zn1jfV6oSl&-EXpS%#?m)obcYB04=2LG%^|WG1#}xdcIs)&wah+_d%Zj(5$MrPOU$2 z;M&ypYj99dkfDF!vHI}eC}zzY{4xLg;Ku;#aqSkn3JAbbq-@itCf-Fl{%*|5WWc4$ zk`ng!W1u4iZA1ySXzMTaW92_qbU!EHfv4u&kelGIZfsv?e{cNNJUP}pnLF_3{$Sy% zH{r_5sss4Q42$;$SkPHg%STxIDu2cl&&cYJyw8s3?s#$lTYA5>FGVg%#b{EE=7A+u zRbUR2 zs0Lt?+kP)#0+YBWyYzKr1s_3Jod|pcKC(;(h%(x}59BY+%fE&3zDc#OvP8G^NdKUU zwyI}tHYDy$0vw4ZQ;P*yiHCJigix{K0|(6iJqO58CunDP>gWq5OS;I%u?W;0#SrXEUlUC3;?i%j!2pSHY?8FtzHE<}-wQnPQT9eY)!%}d zzGkM{%Yw%y1iivtKH9>;Z=@Ix=EXsp~ir(kw_*|3|N~8%OqM zRW@%Mo0x=!*U1lc(I6pTmHnGbVM{zqF5t5>{tB=eS_NI5{f*Uk%n?!v%aY})4^~5d zbd<{}EW%gRmr2*3G4yR=L_jm?of^V^EHP*sb zvQIKxq?S?UP5si5&Fle6lf1!idwp$mL{aB+ceB5Tg3d#HuSErYU=(jrDQPd@{`|^hM)}=Hf($=2SKJs8zs``o9Rw5(Vna1kl3|`lW`3Y5 zYOZX$rV@_Q+_^XIRlH-WnYYKWl$rgS$Wn1>J0}6-Eb5Ng<5{YXoQ@Y#ZcuLnJ0m+^w zLAMU^=56##qj5o>V{kKJ5dxZLLnA6;3=ww#vkP~-deCV-n?vxcZNp^Fv=l`6joJ;j za<_eajA2zdn3V((>E5jBs%SKY$982&=Ui2<7pEC0{-zN2sfV+^0FlJJS^Db(XjUhF z+={w|CV&-Gtz5Y2Y1JWKe-U9sdChb#YvN^`9E|Tie}_t-G0`J>Eu~}=RMUd22u>fc zrMJUxvNpDNRy6K4`0FRr0&?R4lXJ(BQvhY*`8Kr3R_On~#K93W71@NT|;k2OKX7=*3Tx2>6N`G4myG~N9+KJ(4&;4uy z2a5ulTM)eZH%aDQu&Rmm7zZ)cHDctkb|r$Vb>w%Al>qODZVT*Ed>Mmq~CaBxr9kEeet6qsun%ms`u?08CL zaC8*J$a(+=Lp|<^5f-S+l+FXw6O$5Q3cy0XK~iRyU5rU4hy1u z7ZoA`7hO<{IpV>-QC0(AT`GFKpBc-&wd`WDzd4aT`{#beJ9TbiswyQgJL%8MikP1k zpYH_dyhZK08jAzjljikgOwVKo`kKjHGW(>(M&JUIc+1%`Y2ZG;_=~@f>$ve19kt2+ z^HI0@zb-tn;tF994$DZytJO=vb0*X~)W)3vtokY}n5%?x3=ODEIqE^PO(I~y`|Iv> zwvZ2%cVO3ZvyK&u?z!1G89k{5Lx^V^wZ5Q#*9uUN!&+N4|EHb)nb#Yhr06h4y+M(ALYpBzl@`DtTCYU^v7IUMiO_c1K!)~Jm=ES6v z+*6m=&RM)|hG8c2B|l`^Xr=3kwx`YGgx=QIK;eP+&5SOmL3feKik-Fvw5m&DSa)bb zT!y}3viC|(x70s748{Y4s=VGV)#TO@fQ4h}DSu?9B#dj-0^7YChA zty2KjNfU4wKjvXt{?1}|_nzC*c6L%QGNn40*?zEc@2pIRb594amn94 z=i1SRdJ}qComgg*m)FnHYJMLII_9chP3*EG zJeNI`)3}%Bx7=w62`#KLU*`pV{>e+r^inA_KPZUC^{t_@Z94nl^`F&B+~JaQyM$*4 zv?xLRQ_E?3i?#zR>?{hlq1#szG+=eje9(@T*|^V{kgWjq&L$g#m=f+1$iqj!`)Sm1 z_jKPc0cCg?lYYA!duEXdW^AnW+WH%Ya2!UYd>2}wunW-V8#WnUtlatO$0C~_huS}p z)jzN5ww!U1$?|$okBJ6gO;P;mHdtr8VQpA>RSIrpfwASb_ZJbTqTE_+S;RHqQpoRc zmZ;yKz@3dV|EH>Y4=;3M{LI=foiBz`e`E+Yjls)w1jm?D@qXb^k4>BtKj(6@FVa85m8W;b8&!qHkAHP%Iq7dO{k*epSQvKdlK274K;(OKFkmou`>-kc1LZw+)$2KhNXFI zTuw{HM3^1PiDH5X_&-Eewy@P6n6SopWA3c3IJLRraaIXDCTsqm|~gC{nJlKv7u-$2?Z#5A1Xc8ZJGibf;I^wjSy zRa-D^4{Zby!ahH*#-z15;yJK&sk@_D>yT{^r7RcyBkuR$R&WwzUNspozl*hjdp67I zTMv-T(L}CvQSfd1Wp1o9y?S)uoqBkbES80Bk@8YY|IRF&uulQJc}ZL0>SENrP-;cs zI;f5)oTuE^R*?%8XZNJ_)3{KvpHS`n39zCR1F6%@CE{kPa22i1sLXZsSRuitiQ}+4 z+QZI{!uDU>?{><0o_}==X{BB8%Jv zeBnFrtC`!SEGVk?R+9r1IpZQNqa5Ejd(Fn$+#f-NYh&4V#=-)3IuBg1;aaQdJww50 zMA{!Pq+L~(Ia@3q|5km-@iT;H&DC$h3E4M*4Wb_7+GCF)*y)oW6oYm0Zu?e6z0uOr>_y_Z4jT)OFR1$&RK z&L`P*(**gkC)ozXa zDjP2v-yYp2iqcThXluMg{<|RM?vg{s`i!~h0)0N|3O4Onlw;qHP(Te_&!XLO%Tae$ z+)Xcjdo9JG6wvv3iYsWzBpb@VVkU8lqdO0vlo#ph37^J90EL1H?(!UJ!`??K{!Z_k z1a*b?lmiy*vOELq-xQA*EpCqN`)&F>@(EUL%0w~T*Q>gh2;FA#SYS%A07S2JHoSZB zqw1A=fkBifBe;%3me% zFeUWlY$;1NAs+M%&7e3AOkGN^(C0pI5Vk#HQ zrg%rBoZ0H)E9#0_>H-et9hZc8BxzY&RYIA(Ev~768;cs;cy2bvX2*6$F{Va#v8pR( z;m&<*_kM`q-lbY}<>yl=boW5F%&5pT=sUV9CLEQ!FLT2TY4;pKY$+v;DBL_3kjR@R)1k^qv@0EJ&56l}B3$aaD{O3~pK&Cl(af z5MWcXV3$LZuqVwZ19R@4M|U75V`V7kD=EmS<0^|%T;`k08wY8qvA4|;*ROWRnP9b> zex1>cOstc`$%j|f5ElEVySE(BurB`^O6^oLBm*P&qo4K;4pz#6SvdQ?J>WyrnW^GeOB-AMM%5)Eau1l>Ko&(GB@1)Z0* zJbn~sN~?6?Q|1B>%OvI5P~n}m&ZR7|1c^hMS_&S{tvvVKqQhAnHwG2X5;aluP5 zdgkbezbL;7E4Ll;oL}y0aLf8Qi#rW!uuiL4#52*Dti42@^rg2EPd-=H@c3fny2t-a zfMiPwGTk=ZtX6Cya%3d7K6TI#nCo;JMHC+tg1s8|yod!k%|4(fbX zy<=-3jGMDE{MI=DVKO)B`p1U)pd8zdRVhWIrz8|ml$+IP#OU&F$a0N%X!HDn7sT&@ zp4g9XDL?8fo$Xvj03HpaSYpt~{*=Ybr6dX)WIwK{M1rBbP9fRcPJ__Na@5>tJE{F+ z{+9;Wd*?#{qj1PW@`onsyr2I{-Z-Z5%zk5?lnD)C9-oNLeqEPyYV=TxHkXwM9SFMg z9QdjNxWsQAQX{CwH8A!&g4uOJlxv{j{mu)E%qu^|5son3v@UmRJNX?x*T* zN5r@1Jn}T59NHQtw|*{Uyi77}q43=a0{u9wi-JzcRbv!DSoa!b9K@Tz#%nS>bVpJk zRbuF0D3o(>LE-CEBiXBxe(4VSs#D0-zDPh<7KBwzEyB*Mx>GaDs79`2tZVCadz{mW z5e$G)mg%^-kLkQ*lc~OBQ4sOaksb|;w;Iac6M<4HgWF=PzF^8vZNEEv4>90yr5XcI zdxKOtLdEun(*JPRH*tXwdi=o)o9OTX=3J`B&-E-#MR z`Onw#la|-FD{NOq(A9^G13@ip-mmt%#Rq`X4cI{la+XX^+)wBTwHU)Na4VeRLZJSW zK=VC1dwcuO&eNsF18+8b9I28j#hn7wZHsUq1H^Rq)rSt%eiW-J!od0Ah$&H3na$2` z=$$fNS$gr_LRN?^(6e2kj$rpANj65p1UX9a^DV!mxkT3BpirfWm{a}iH*<-?QYZG( zih}`xEC^`W08HD#^qQCp)_05Cy{VKI>!g;*UUYpcDJ_&iPnuqO>ZBgcGt*Dv*ADA~ zW?pyQ>7*FCcuBwtS6Qb%7;vW@QmU^4&wgCZ>mmmI%x4@d2B*eS6OS#?UkJAuqHZ@= zbe!sap%yH&p0|Cst2&eKO>!7<%u$M5CsFyc6iZF5VH-Al&1hH7dKS_f97qT01^Aa`NY`2ZMZXi0W<6)-@Pun zRCREus!dT*x_tOs1Nm7C#Va8detYJwZzQftGoY^9Ym0=m{0(V#!SHSox-&c-mleTd^s(X zCORtD8<^O~>tQPa>dLqLXRAAD&a~%at;p+J9=##>3w9@{JH>x5}`>vF3rw{nK8A*CY~k$zdmb*269-c`M__D6ZsIqYM_ z5pMp0yiq9XLk5u;IJn_y*}utd{LnG-Cf&}ZC5?3X(4Mz3-a`*K7^V;k8Gg+)YDJ{)jJh|?h9RturqXW!rVgjN08D&-~rjh#>UqoJk^s*#^F1uOEs9;-H#K_zn5x|c8$pI z`EkC?mT_j5voDnuuv-gmc$HjU{A9q@%=f8r99={>Cu?`P^xeyxp-379uT2wi;Kg@^ zonzSxD*|?4iw#1HLmn)Mq&zJdI1Xv5#M~d6ILda^DBs(tO;|X(iEz<}uyK-FfaUMML!-L~I6FZ!c9iYr;_3IGe4n`q?2Z+2+ z@Bb`DZHf<}s{aFo68ye0K;Ks9RYa_dajRRW$*N;f8k0YLO!5Hs5T~ z@6oBt$z|x*j;`f(WeEk=H;aQkZ@MWiM_+&}Jkd!Ui9XSNZ1f^59NCbef2w&c$AIXW zsPxmUpUMMFK~@FFl(n^%nRegqY5@0~l+=v^|C}URPk1P#nA;b9R)i{UbH=zvq*1uc_N7+c)dn`>aVF7s6l+KRM_Y0 zU0I>?mmTs-1#R|p_!h6nm4yF8rbSQM7G0Tp`HZI^4!E0Jij$7jo8G0hb`Q$uAzf7RgH%+PM>E<{3+$by~$eWIsRbp`7H!o!j4* zdZ>XSH)z{TpEL0Mhq0ZH11Va>u5qWAoqp))sS}t&z%WcCxK-gtSY5o16{TM>w za3M?kWip**Vy1j6o44LR)aCU9YGh>V4Nl4Fsxa&R&tVjtJ->q3NiJfSu?NYNXSQyq#H-eeEV^O3#n`x!$Q`!DEIFpV!0;sVXqkA`Zc#wzg6t`d)tx*KR;F*D-+mc(Md z?Nel|5a_Mq8i?v{l`aru>0zUzr?oQRe2+2*t|&TMRiLgjZ$Ve*Nb}I^TUy=C`LtDU zRL$aet?U9woynP>-s0JvybfosAu=E>lV)2+e{j_iccp+w%G0j8*(ze0Aha4v3PbGvsCqnOq-bh)J`yl|TDL{XY73|p9!Hn?nHWzrxxHmWP z#@zdk|EzvHN%Du;^k`A`i=-V#tza&A(rhW6{z#`ENRHo-+{j_NG=pZg!F2|+L zyd1Zv8MYRTHZB`RH-gIKNP!>gfr+a-oT#tTo|h_wtkCC+`H6LO&_GRUTJC?D$vZ|jn zxoUe#B`J7^BjpV*Jx$Sw|L;xk%I{!l^m(uXPjK+(KQ|WQ7RgkhZqa#$QIu1t_6A? zvBL&l)_NxL_DH}&KG@Hf{31~bTQO*Xe)n7ixkyx0KN0PKiuGO7t)E>_{TwOM!p+Ui z{bTba#4KIqkV@xI=ny{j^Re_R1s}$kpPi1?b}er<9CyJUT5#6l&jpK>1+%uliu=7M z7X9w{8LiS>@}Y#fKoCS7uG|?XVT=}gWWL}@CpHvBAK+~NW^cKR)vmHq+f1V86;cQY z1pXQuOSkwGyexPyPKcRL`KD-f<5G4lJxrv_;CNP7vsE5<8+PGR`MaclkD8pL?mVjhM%Ui2jSqMT zFHVRPoe4@aOI!_v7Osq?@*zmRSCz%KF>qD@B%yAQ2{3qtOy$7|jk7w%v(fb(&*gUo zDU-D@G>3&op0f2ylJVlVJ}GC{*RsZ}rIn#2W2+%`zWw6{f{5+AxAqlKLop28y}_Rb z`yOzdw2JJWn#7x{^f`Wmu$f3AxmLW)svpZ3|(l z%`-$@Bxy_Cg<7cd=p_}V8Bol}pZ=nW?)c&GjQqRoA5t{tCH;dI+DIVptsk1yV$HWT z$=#Uq^UQ6z>PEVScs#Qn&-Jt8r%X8Ma-LMPrb+X{K16k$04Oe z`;6joe$oD-CmkCCQW}q+;uGS?bOThtCZW!U0HO|cMZEQ0w`Xyg4Dsa>wQR&_8aBBb zW^*abCK#sJhB6tw-CNR&&ZEjcj$bWD>TXmyWhz+>1}Vo+wB+~Pr^djuf29gQXBCU` ze?ApQqTDh$=xGwXtFq6In6d; z9ajqX?iKg)L3r-Hv&s6}U>|AEW@-x)uX&$lD;uQUyY)cXiQX9bPg!>7Zfy5GlbQiA z&&cJ+VW^`IYGl#anB>ifnNP_;+to%Vjqa!=95)Rb)dOoZr;#^gjw$R~`ab@n*bg)M z!TaQ%8+YwwX(k~E7~87-l8Pvg>(i*BR5NI0?Cj=;&Z+>x!fU7CGsjlJtFS`r>h)t4 z|5x*RGmay!@`$z^3DJlDdM0a2Tyiy66cvbr4L!GwZ(dokUxhJ~9Ki}gI&j#gGDOYr zR(F*{T+nn2GZ!6l#_22a%YDj6DZNoCEDna{r*~F5kWjaoN~{CAFDpT-6Z60j-bGx9 zI$fw_GrdKvr>FPPX{%N|*V?mRw#f`5?uMRa)A_JkOlWBT@k+uJk2;7USTa{ZDsg}q z0>yUPW%VcxQSm7oer!ePxbr==r*|;w2XaW+-6q~#U!G~m&J0O9Y4z36=L54~vD^M| zc&soTV0JQ)K1r#CqIPcbt}&yy}eUt=2glTcO{3Fli*e*@7BPG z740|hhw`Zj)Oz<*(<+hE$!ul`+dn$hlIhIz_-<_9?uN$~P^=y24ULwt&YGb(sUk_P zJJPQ0USf@Se+js(BLggV*)4cm5HZ`;MM(B%YKcFsvytGGzY0?)O&#rVpkIP*d>U0hk~ZK2Ps0KoBmNeQGmG6&hDc5n``@y=r_)11WcOHk`&tOt&8-l(7V6* zoXW;M^9{?WLP|!nA4PgQ^?jHqUR90mfIRbfs^dXhWL6BSBrURT44ANj4d+Tqav6qY zdH;BwLM`FL(rq#$s{dn15x>$AO@H=67w^YHCD|`aI@xw?$=k%%JqS(Y28;NVkY;5| zOY!`zx?>p#;M|t-wKEf*cYA1NZhpU&*f#3e;BS66cyG3F${LA*F=fBGDSZSPny+$;mO?Sdb0h)i*gmvb>RyHr~Q}wQp{L^Aq!}2ZG&4ac@}^8 zEk%|kygx&*k(B=6Y$X;#k4y0NZ8ocaA!p>G3Y$wda9{UaI)dVQpI`H?gM-7oyu|mN z);R05wdvXczvcm0hEnIFPta70mPa9u=qPjSinwzK?;E*~Vt>`UBwaQxEI+$t<&})P zjpydhP648JJ1y=MTbi5y@v5D^#M#&WrWG;FBb+vnQ=5D?#5VX=cQbqQzL%3puU^ey!Nv31>K z_mOQrqgl0%2~w+eVa18>P_cM4s1AkejZvgA6$G@}XVlD>A`~(==K}XA!#b6SZ1^{s^9voxwMtO=dXPt8qsVBX5jHL27^-0@sTVVCCT5&N4Qn=IP#uQN!(-)onA(Wux ze|CPjy1G!v?-OC9#@JubMtcrLc{h z=u#9N_{ftG|8c+P$=>Vi?I!k+_oa5_6U8L&{`F`z;kF7UzJHj4SIKjwd#u6VQFY@+ zL6{e!gFqzPr>?TkFv;_-s-Uq+Usp0ijylSx3+8-1QbdR5QHL>{N?;9P3z!Pzjtwpp zCKb+Jpkv*o?0{wy-b)#RqUDDVNb|gKl{9#ju<-L(@Ze(M!e-a!k&UYF){n-?t{e`Z zkGs5FCP1P9!mctmVx5u=s#(v9kE(t|7LqQgX7H-8RCHpk^XmBt#p>TYKZgC#kj1pQ z6^5r_exnlqu#T2rR5k4vXQfa(pAbJ0+epUHhSWs9E~+zzaGy&nNQB;>R@ZrVM+hhT zB@33M-u`i>igw5W$j!uwHPu|Zdk7S}E8+g`{H9qrBf)s~$AMD#(7HI#utF7m@Q;PK z;wPdS`)}2|!&YI8OU0oH`*?wGmlwO|bLgWK?TV4JZ36g0IYLJU=vDwQ&$A;L?kDcy;!<*n}qCYXo7Iuc?XBcc4}#UM0FTnp^QZ!PHJ6Zi_PN2&vJV;)XQru{Vp z5vb2NY(WuTgEyt(Ux+_Gl(tTI`@hBP|33x&-A(7$PLKaexn#;>NVgN%eYC+oTJEl{ zc5XgoT3&WgA3Iw_0;-Ai7$l9x`2R!zWdm Hkf{Fxyxu%E literal 0 HcmV?d00001 diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..7e36bcb145500f12e3b92987cfc0ac71ca30ee6c GIT binary patch literal 2528 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 literal 0 HcmV?d00001 diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index fbf0e25..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file From 765e8ccb85bbf9fc58c8944b993b537c9c1776a5 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 20:06:43 +0100 Subject: [PATCH 14/15] Add meta tags --- pages/_app.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pages/_app.tsx b/pages/_app.tsx index 93f80d0..fac2b55 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -5,6 +5,13 @@ import "../styles/globals.css"; function MyApp({ Component, pageProps }: AppProps) { return <> + + + + + + + From 554381705953ea9f6b6b80275e98364742331e72 Mon Sep 17 00:00:00 2001 From: Daniel Kluge Date: Fri, 17 Dec 2021 20:08:52 +0100 Subject: [PATCH 15/15] Add beta info --- lib/projects/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/projects/index.ts b/lib/projects/index.ts index a9f6012..1cf942d 100644 --- a/lib/projects/index.ts +++ b/lib/projects/index.ts @@ -10,6 +10,8 @@ const projectList: Project[] = [ "Everyone else: Have no fear. It is pretty simple. You just type in commands and the output is shown here or it does something on the webite.", "To find out, which commands are available, you can type just 'help'.", "", + "Currently everything is still in development. So if you come back in a few days/weeks/months/years something could have been changed!", + "", "Have fun!" ], repo: "https://git.c0ntroller.de/c0ntroller/frontpage"