From 07b02e107a01189d0a0d054c7bc2b4f4ce68d0e5 Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Sun, 1 Oct 2023 14:11:40 +0530 Subject: [PATCH 1/9] Changed the bg color, terminal font, and added a heading --- .history/src/App_20231001131835.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134627.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134629.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134636.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134637.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134651.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134658.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134702.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134713.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134725.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134727.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134729.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134738.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134744.tsx | 159 ++++++++++++++++++++++++ .history/src/App_20231001134835.tsx | 160 +++++++++++++++++++++++++ .history/src/App_20231001134839.tsx | 160 +++++++++++++++++++++++++ .history/src/App_20231001134846.tsx | 161 +++++++++++++++++++++++++ .history/src/App_20231001134847.tsx | 161 +++++++++++++++++++++++++ .history/src/App_20231001134853.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134855.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134857.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134906.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134908.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134909.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134929.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134932.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134934.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134943.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134947.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134949.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134952.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134954.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001134957.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135000.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135002.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135003.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135006.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135013.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135017.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135020.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135023.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135037.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135041.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135050.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135052.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135054.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135100.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135113.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135117.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135121.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135124.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135131.tsx | 166 ++++++++++++++++++++++++++ .history/src/App_20231001135132.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135137.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135143.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135144.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135151.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135153.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135203.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135207.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135210.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135223.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135250.tsx | 162 +++++++++++++++++++++++++ .history/src/App_20231001135313.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135318.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135319.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135321.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135326.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135330.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135332.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135354.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135409.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135410.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135414.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135422.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135436.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135442.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135451.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135500.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135505.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135512.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135521.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135533.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135549.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135603.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135605.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135608.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135619.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135627.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135632.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135638.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135640.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135648.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135651.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135653.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135657.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135704.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135709.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135714.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135717.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135720.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135724.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135732.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135736.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135800.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135801.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135803.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135809.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135829.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135835.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135858.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135901.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135902.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001135931.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140017.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140037.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140051.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140112.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140124.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140134.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140147.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140219.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140236.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140326.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140400.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140404.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140410.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140413.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140416.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140419.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140423.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140441.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140445.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140447.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140603.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140611.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140612.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140633.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140645.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140657.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140705.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140721.tsx | 163 +++++++++++++++++++++++++ .history/src/App_20231001140723.tsx | 164 +++++++++++++++++++++++++ .history/src/App_20231001140735.tsx | 164 +++++++++++++++++++++++++ .history/src/App_20231001140744.tsx | 164 +++++++++++++++++++++++++ .history/src/App_20231001140746.tsx | 164 +++++++++++++++++++++++++ .history/src/App_20231001140755.tsx | 164 +++++++++++++++++++++++++ .history/src/index_20231001131835.css | 25 ++++ .history/src/index_20231001134557.css | 25 ++++ .history/src/index_20231001134601.css | 25 ++++ .history/src/index_20231001134608.css | 25 ++++ .history/src/index_20231001134611.css | 25 ++++ .history/src/index_20231001135943.css | 25 ++++ .history/src/index_20231001135947.css | 25 ++++ .history/src/index_20231001140011.css | 25 ++++ .history/src/index_20231001140513.css | 25 ++++ .history/src/index_20231001140528.css | 25 ++++ .history/src/index_20231001140529.css | 25 ++++ .history/src/index_20231001140535.css | 25 ++++ .history/src/index_20231001140542.css | 25 ++++ package-lock.json | 2 +- package.json | 2 +- src/App.tsx | 11 +- src/index.css | 2 +- 164 files changed, 24195 insertions(+), 6 deletions(-) create mode 100644 .history/src/App_20231001131835.tsx create mode 100644 .history/src/App_20231001134627.tsx create mode 100644 .history/src/App_20231001134629.tsx create mode 100644 .history/src/App_20231001134636.tsx create mode 100644 .history/src/App_20231001134637.tsx create mode 100644 .history/src/App_20231001134651.tsx create mode 100644 .history/src/App_20231001134658.tsx create mode 100644 .history/src/App_20231001134702.tsx create mode 100644 .history/src/App_20231001134713.tsx create mode 100644 .history/src/App_20231001134725.tsx create mode 100644 .history/src/App_20231001134727.tsx create mode 100644 .history/src/App_20231001134729.tsx create mode 100644 .history/src/App_20231001134738.tsx create mode 100644 .history/src/App_20231001134744.tsx create mode 100644 .history/src/App_20231001134835.tsx create mode 100644 .history/src/App_20231001134839.tsx create mode 100644 .history/src/App_20231001134846.tsx create mode 100644 .history/src/App_20231001134847.tsx create mode 100644 .history/src/App_20231001134853.tsx create mode 100644 .history/src/App_20231001134855.tsx create mode 100644 .history/src/App_20231001134857.tsx create mode 100644 .history/src/App_20231001134906.tsx create mode 100644 .history/src/App_20231001134908.tsx create mode 100644 .history/src/App_20231001134909.tsx create mode 100644 .history/src/App_20231001134929.tsx create mode 100644 .history/src/App_20231001134932.tsx create mode 100644 .history/src/App_20231001134934.tsx create mode 100644 .history/src/App_20231001134943.tsx create mode 100644 .history/src/App_20231001134947.tsx create mode 100644 .history/src/App_20231001134949.tsx create mode 100644 .history/src/App_20231001134952.tsx create mode 100644 .history/src/App_20231001134954.tsx create mode 100644 .history/src/App_20231001134957.tsx create mode 100644 .history/src/App_20231001135000.tsx create mode 100644 .history/src/App_20231001135002.tsx create mode 100644 .history/src/App_20231001135003.tsx create mode 100644 .history/src/App_20231001135006.tsx create mode 100644 .history/src/App_20231001135013.tsx create mode 100644 .history/src/App_20231001135017.tsx create mode 100644 .history/src/App_20231001135020.tsx create mode 100644 .history/src/App_20231001135023.tsx create mode 100644 .history/src/App_20231001135037.tsx create mode 100644 .history/src/App_20231001135041.tsx create mode 100644 .history/src/App_20231001135050.tsx create mode 100644 .history/src/App_20231001135052.tsx create mode 100644 .history/src/App_20231001135054.tsx create mode 100644 .history/src/App_20231001135100.tsx create mode 100644 .history/src/App_20231001135113.tsx create mode 100644 .history/src/App_20231001135117.tsx create mode 100644 .history/src/App_20231001135121.tsx create mode 100644 .history/src/App_20231001135124.tsx create mode 100644 .history/src/App_20231001135131.tsx create mode 100644 .history/src/App_20231001135132.tsx create mode 100644 .history/src/App_20231001135137.tsx create mode 100644 .history/src/App_20231001135143.tsx create mode 100644 .history/src/App_20231001135144.tsx create mode 100644 .history/src/App_20231001135151.tsx create mode 100644 .history/src/App_20231001135153.tsx create mode 100644 .history/src/App_20231001135203.tsx create mode 100644 .history/src/App_20231001135207.tsx create mode 100644 .history/src/App_20231001135210.tsx create mode 100644 .history/src/App_20231001135223.tsx create mode 100644 .history/src/App_20231001135250.tsx create mode 100644 .history/src/App_20231001135313.tsx create mode 100644 .history/src/App_20231001135318.tsx create mode 100644 .history/src/App_20231001135319.tsx create mode 100644 .history/src/App_20231001135321.tsx create mode 100644 .history/src/App_20231001135326.tsx create mode 100644 .history/src/App_20231001135330.tsx create mode 100644 .history/src/App_20231001135332.tsx create mode 100644 .history/src/App_20231001135354.tsx create mode 100644 .history/src/App_20231001135409.tsx create mode 100644 .history/src/App_20231001135410.tsx create mode 100644 .history/src/App_20231001135414.tsx create mode 100644 .history/src/App_20231001135422.tsx create mode 100644 .history/src/App_20231001135436.tsx create mode 100644 .history/src/App_20231001135442.tsx create mode 100644 .history/src/App_20231001135451.tsx create mode 100644 .history/src/App_20231001135500.tsx create mode 100644 .history/src/App_20231001135505.tsx create mode 100644 .history/src/App_20231001135512.tsx create mode 100644 .history/src/App_20231001135521.tsx create mode 100644 .history/src/App_20231001135533.tsx create mode 100644 .history/src/App_20231001135549.tsx create mode 100644 .history/src/App_20231001135603.tsx create mode 100644 .history/src/App_20231001135605.tsx create mode 100644 .history/src/App_20231001135608.tsx create mode 100644 .history/src/App_20231001135619.tsx create mode 100644 .history/src/App_20231001135627.tsx create mode 100644 .history/src/App_20231001135632.tsx create mode 100644 .history/src/App_20231001135638.tsx create mode 100644 .history/src/App_20231001135640.tsx create mode 100644 .history/src/App_20231001135648.tsx create mode 100644 .history/src/App_20231001135651.tsx create mode 100644 .history/src/App_20231001135653.tsx create mode 100644 .history/src/App_20231001135657.tsx create mode 100644 .history/src/App_20231001135704.tsx create mode 100644 .history/src/App_20231001135709.tsx create mode 100644 .history/src/App_20231001135714.tsx create mode 100644 .history/src/App_20231001135717.tsx create mode 100644 .history/src/App_20231001135720.tsx create mode 100644 .history/src/App_20231001135724.tsx create mode 100644 .history/src/App_20231001135732.tsx create mode 100644 .history/src/App_20231001135736.tsx create mode 100644 .history/src/App_20231001135800.tsx create mode 100644 .history/src/App_20231001135801.tsx create mode 100644 .history/src/App_20231001135803.tsx create mode 100644 .history/src/App_20231001135809.tsx create mode 100644 .history/src/App_20231001135829.tsx create mode 100644 .history/src/App_20231001135835.tsx create mode 100644 .history/src/App_20231001135858.tsx create mode 100644 .history/src/App_20231001135901.tsx create mode 100644 .history/src/App_20231001135902.tsx create mode 100644 .history/src/App_20231001135931.tsx create mode 100644 .history/src/App_20231001140017.tsx create mode 100644 .history/src/App_20231001140037.tsx create mode 100644 .history/src/App_20231001140051.tsx create mode 100644 .history/src/App_20231001140112.tsx create mode 100644 .history/src/App_20231001140124.tsx create mode 100644 .history/src/App_20231001140134.tsx create mode 100644 .history/src/App_20231001140147.tsx create mode 100644 .history/src/App_20231001140219.tsx create mode 100644 .history/src/App_20231001140236.tsx create mode 100644 .history/src/App_20231001140326.tsx create mode 100644 .history/src/App_20231001140400.tsx create mode 100644 .history/src/App_20231001140404.tsx create mode 100644 .history/src/App_20231001140410.tsx create mode 100644 .history/src/App_20231001140413.tsx create mode 100644 .history/src/App_20231001140416.tsx create mode 100644 .history/src/App_20231001140419.tsx create mode 100644 .history/src/App_20231001140423.tsx create mode 100644 .history/src/App_20231001140441.tsx create mode 100644 .history/src/App_20231001140445.tsx create mode 100644 .history/src/App_20231001140447.tsx create mode 100644 .history/src/App_20231001140603.tsx create mode 100644 .history/src/App_20231001140611.tsx create mode 100644 .history/src/App_20231001140612.tsx create mode 100644 .history/src/App_20231001140633.tsx create mode 100644 .history/src/App_20231001140645.tsx create mode 100644 .history/src/App_20231001140657.tsx create mode 100644 .history/src/App_20231001140705.tsx create mode 100644 .history/src/App_20231001140721.tsx create mode 100644 .history/src/App_20231001140723.tsx create mode 100644 .history/src/App_20231001140735.tsx create mode 100644 .history/src/App_20231001140744.tsx create mode 100644 .history/src/App_20231001140746.tsx create mode 100644 .history/src/App_20231001140755.tsx create mode 100644 .history/src/index_20231001131835.css create mode 100644 .history/src/index_20231001134557.css create mode 100644 .history/src/index_20231001134601.css create mode 100644 .history/src/index_20231001134608.css create mode 100644 .history/src/index_20231001134611.css create mode 100644 .history/src/index_20231001135943.css create mode 100644 .history/src/index_20231001135947.css create mode 100644 .history/src/index_20231001140011.css create mode 100644 .history/src/index_20231001140513.css create mode 100644 .history/src/index_20231001140528.css create mode 100644 .history/src/index_20231001140529.css create mode 100644 .history/src/index_20231001140535.css create mode 100644 .history/src/index_20231001140542.css diff --git a/.history/src/App_20231001131835.tsx b/.history/src/App_20231001131835.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001131835.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134627.tsx b/.history/src/App_20231001134627.tsx new file mode 100644 index 0000000..efaa4b0 --- /dev/null +++ b/.history/src/App_20231001134627.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134629.tsx b/.history/src/App_20231001134629.tsx new file mode 100644 index 0000000..0a70d71 --- /dev/null +++ b/.history/src/App_20231001134629.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134636.tsx b/.history/src/App_20231001134636.tsx new file mode 100644 index 0000000..f5ff92d --- /dev/null +++ b/.history/src/App_20231001134636.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134637.tsx b/.history/src/App_20231001134637.tsx new file mode 100644 index 0000000..4eb5401 --- /dev/null +++ b/.history/src/App_20231001134637.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134651.tsx b/.history/src/App_20231001134651.tsx new file mode 100644 index 0000000..c8620b4 --- /dev/null +++ b/.history/src/App_20231001134651.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134658.tsx b/.history/src/App_20231001134658.tsx new file mode 100644 index 0000000..f6ef193 --- /dev/null +++ b/.history/src/App_20231001134658.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134702.tsx b/.history/src/App_20231001134702.tsx new file mode 100644 index 0000000..4eb5401 --- /dev/null +++ b/.history/src/App_20231001134702.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134713.tsx b/.history/src/App_20231001134713.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001134713.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134725.tsx b/.history/src/App_20231001134725.tsx new file mode 100644 index 0000000..8caf5e2 --- /dev/null +++ b/.history/src/App_20231001134725.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134727.tsx b/.history/src/App_20231001134727.tsx new file mode 100644 index 0000000..4935ed0 --- /dev/null +++ b/.history/src/App_20231001134727.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134729.tsx b/.history/src/App_20231001134729.tsx new file mode 100644 index 0000000..07288ff --- /dev/null +++ b/.history/src/App_20231001134729.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134738.tsx b/.history/src/App_20231001134738.tsx new file mode 100644 index 0000000..878a1fc --- /dev/null +++ b/.history/src/App_20231001134738.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134744.tsx b/.history/src/App_20231001134744.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001134744.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134835.tsx b/.history/src/App_20231001134835.tsx new file mode 100644 index 0000000..a50e6e9 --- /dev/null +++ b/.history/src/App_20231001134835.tsx @@ -0,0 +1,160 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( + +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134839.tsx b/.history/src/App_20231001134839.tsx new file mode 100644 index 0000000..063bab2 --- /dev/null +++ b/.history/src/App_20231001134839.tsx @@ -0,0 +1,160 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134846.tsx b/.history/src/App_20231001134846.tsx new file mode 100644 index 0000000..0e3e1a2 --- /dev/null +++ b/.history/src/App_20231001134846.tsx @@ -0,0 +1,161 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134847.tsx b/.history/src/App_20231001134847.tsx new file mode 100644 index 0000000..0444a73 --- /dev/null +++ b/.history/src/App_20231001134847.tsx @@ -0,0 +1,161 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134853.tsx b/.history/src/App_20231001134853.tsx new file mode 100644 index 0000000..4a76e56 --- /dev/null +++ b/.history/src/App_20231001134853.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

+ { + /* History */ + history.map((history) => ( +

+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134855.tsx b/.history/src/App_20231001134855.tsx new file mode 100644 index 0000000..4a76e56 --- /dev/null +++ b/.history/src/App_20231001134855.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

+ { + /* History */ + history.map((history) => ( +

+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134857.tsx b/.history/src/App_20231001134857.tsx new file mode 100644 index 0000000..b5380d4 --- /dev/null +++ b/.history/src/App_20231001134857.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134906.tsx b/.history/src/App_20231001134906.tsx new file mode 100644 index 0000000..b3246e3 --- /dev/null +++ b/.history/src/App_20231001134906.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134908.tsx b/.history/src/App_20231001134908.tsx new file mode 100644 index 0000000..e48ddd4 --- /dev/null +++ b/.history/src/App_20231001134908.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134909.tsx b/.history/src/App_20231001134909.tsx new file mode 100644 index 0000000..ca817f8 --- /dev/null +++ b/.history/src/App_20231001134909.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134929.tsx b/.history/src/App_20231001134929.tsx new file mode 100644 index 0000000..19122b3 --- /dev/null +++ b/.history/src/App_20231001134929.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134932.tsx b/.history/src/App_20231001134932.tsx new file mode 100644 index 0000000..56e5333 --- /dev/null +++ b/.history/src/App_20231001134932.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134934.tsx b/.history/src/App_20231001134934.tsx new file mode 100644 index 0000000..857521c --- /dev/null +++ b/.history/src/App_20231001134934.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134943.tsx b/.history/src/App_20231001134943.tsx new file mode 100644 index 0000000..9accda2 --- /dev/null +++ b/.history/src/App_20231001134943.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134947.tsx b/.history/src/App_20231001134947.tsx new file mode 100644 index 0000000..2308941 --- /dev/null +++ b/.history/src/App_20231001134947.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134949.tsx b/.history/src/App_20231001134949.tsx new file mode 100644 index 0000000..5af9875 --- /dev/null +++ b/.history/src/App_20231001134949.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134952.tsx b/.history/src/App_20231001134952.tsx new file mode 100644 index 0000000..1c853e6 --- /dev/null +++ b/.history/src/App_20231001134952.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134954.tsx b/.history/src/App_20231001134954.tsx new file mode 100644 index 0000000..ddcca97 --- /dev/null +++ b/.history/src/App_20231001134954.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134957.tsx b/.history/src/App_20231001134957.tsx new file mode 100644 index 0000000..e59fdd0 --- /dev/null +++ b/.history/src/App_20231001134957.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135000.tsx b/.history/src/App_20231001135000.tsx new file mode 100644 index 0000000..2d7781a --- /dev/null +++ b/.history/src/App_20231001135000.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135002.tsx b/.history/src/App_20231001135002.tsx new file mode 100644 index 0000000..2e31c7a --- /dev/null +++ b/.history/src/App_20231001135002.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135003.tsx b/.history/src/App_20231001135003.tsx new file mode 100644 index 0000000..9debdc1 --- /dev/null +++ b/.history/src/App_20231001135003.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135006.tsx b/.history/src/App_20231001135006.tsx new file mode 100644 index 0000000..d86b6a5 --- /dev/null +++ b/.history/src/App_20231001135006.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135013.tsx b/.history/src/App_20231001135013.tsx new file mode 100644 index 0000000..9debdc1 --- /dev/null +++ b/.history/src/App_20231001135013.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135017.tsx b/.history/src/App_20231001135017.tsx new file mode 100644 index 0000000..22fc7b5 --- /dev/null +++ b/.history/src/App_20231001135017.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135020.tsx b/.history/src/App_20231001135020.tsx new file mode 100644 index 0000000..6d8fbf3 --- /dev/null +++ b/.history/src/App_20231001135020.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135023.tsx b/.history/src/App_20231001135023.tsx new file mode 100644 index 0000000..7272fa2 --- /dev/null +++ b/.history/src/App_20231001135023.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135037.tsx b/.history/src/App_20231001135037.tsx new file mode 100644 index 0000000..fab6f90 --- /dev/null +++ b/.history/src/App_20231001135037.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135041.tsx b/.history/src/App_20231001135041.tsx new file mode 100644 index 0000000..ced7c33 --- /dev/null +++ b/.history/src/App_20231001135041.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135050.tsx b/.history/src/App_20231001135050.tsx new file mode 100644 index 0000000..981a57b --- /dev/null +++ b/.history/src/App_20231001135050.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135052.tsx b/.history/src/App_20231001135052.tsx new file mode 100644 index 0000000..e63cc8d --- /dev/null +++ b/.history/src/App_20231001135052.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135054.tsx b/.history/src/App_20231001135054.tsx new file mode 100644 index 0000000..3d51d9d --- /dev/null +++ b/.history/src/App_20231001135054.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135100.tsx b/.history/src/App_20231001135100.tsx new file mode 100644 index 0000000..2e98ede --- /dev/null +++ b/.history/src/App_20231001135100.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135113.tsx b/.history/src/App_20231001135113.tsx new file mode 100644 index 0000000..5e04509 --- /dev/null +++ b/.history/src/App_20231001135113.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135117.tsx b/.history/src/App_20231001135117.tsx new file mode 100644 index 0000000..2e98ede --- /dev/null +++ b/.history/src/App_20231001135117.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135121.tsx b/.history/src/App_20231001135121.tsx new file mode 100644 index 0000000..7b644ef --- /dev/null +++ b/.history/src/App_20231001135121.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135124.tsx b/.history/src/App_20231001135124.tsx new file mode 100644 index 0000000..d59f649 --- /dev/null +++ b/.history/src/App_20231001135124.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135131.tsx b/.history/src/App_20231001135131.tsx new file mode 100644 index 0000000..cb5c4a1 --- /dev/null +++ b/.history/src/App_20231001135131.tsx @@ -0,0 +1,166 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135132.tsx b/.history/src/App_20231001135132.tsx new file mode 100644 index 0000000..a00d851 --- /dev/null +++ b/.history/src/App_20231001135132.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135137.tsx b/.history/src/App_20231001135137.tsx new file mode 100644 index 0000000..a79ba58 --- /dev/null +++ b/.history/src/App_20231001135137.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135143.tsx b/.history/src/App_20231001135143.tsx new file mode 100644 index 0000000..d768e53 --- /dev/null +++ b/.history/src/App_20231001135143.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135144.tsx b/.history/src/App_20231001135144.tsx new file mode 100644 index 0000000..d4afa53 --- /dev/null +++ b/.history/src/App_20231001135144.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135151.tsx b/.history/src/App_20231001135151.tsx new file mode 100644 index 0000000..5bf0d63 --- /dev/null +++ b/.history/src/App_20231001135151.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135153.tsx b/.history/src/App_20231001135153.tsx new file mode 100644 index 0000000..b32b0fe --- /dev/null +++ b/.history/src/App_20231001135153.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135203.tsx b/.history/src/App_20231001135203.tsx new file mode 100644 index 0000000..56199cb --- /dev/null +++ b/.history/src/App_20231001135203.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135207.tsx b/.history/src/App_20231001135207.tsx new file mode 100644 index 0000000..2342ded --- /dev/null +++ b/.history/src/App_20231001135207.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135223.tsx b/.history/src/App_20231001135223.tsx new file mode 100644 index 0000000..506d82e --- /dev/null +++ b/.history/src/App_20231001135223.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135250.tsx b/.history/src/App_20231001135250.tsx new file mode 100644 index 0000000..c59d7cb --- /dev/null +++ b/.history/src/App_20231001135250.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135313.tsx b/.history/src/App_20231001135313.tsx new file mode 100644 index 0000000..cc7d5d7 --- /dev/null +++ b/.history/src/App_20231001135313.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135318.tsx b/.history/src/App_20231001135318.tsx new file mode 100644 index 0000000..c84d7bc --- /dev/null +++ b/.history/src/App_20231001135318.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instruc

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135319.tsx b/.history/src/App_20231001135319.tsx new file mode 100644 index 0000000..1e3745e --- /dev/null +++ b/.history/src/App_20231001135319.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135321.tsx b/.history/src/App_20231001135321.tsx new file mode 100644 index 0000000..c017d39 --- /dev/null +++ b/.history/src/App_20231001135321.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions ->

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135326.tsx b/.history/src/App_20231001135326.tsx new file mode 100644 index 0000000..c78457b --- /dev/null +++ b/.history/src/App_20231001135326.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions --> Y

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135330.tsx b/.history/src/App_20231001135330.tsx new file mode 100644 index 0000000..a90931f --- /dev/null +++ b/.history/src/App_20231001135330.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions -

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135332.tsx b/.history/src/App_20231001135332.tsx new file mode 100644 index 0000000..03f7d81 --- /dev/null +++ b/.history/src/App_20231001135332.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - You

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135354.tsx b/.history/src/App_20231001135354.tsx new file mode 100644 index 0000000..81a5bc2 --- /dev/null +++ b/.history/src/App_20231001135354.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135409.tsx b/.history/src/App_20231001135409.tsx new file mode 100644 index 0000000..aa3ab0d --- /dev/null +++ b/.history/src/App_20231001135409.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You need

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135410.tsx b/.history/src/App_20231001135410.tsx new file mode 100644 index 0000000..4ad0f07 --- /dev/null +++ b/.history/src/App_20231001135410.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You need to

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135414.tsx b/.history/src/App_20231001135414.tsx new file mode 100644 index 0000000..81a5bc2 --- /dev/null +++ b/.history/src/App_20231001135414.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135422.tsx b/.history/src/App_20231001135422.tsx new file mode 100644 index 0000000..4dc7397 --- /dev/null +++ b/.history/src/App_20231001135422.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135436.tsx b/.history/src/App_20231001135436.tsx new file mode 100644 index 0000000..d5fe94b --- /dev/null +++ b/.history/src/App_20231001135436.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135442.tsx b/.history/src/App_20231001135442.tsx new file mode 100644 index 0000000..7d94392 --- /dev/null +++ b/.history/src/App_20231001135442.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135451.tsx b/.history/src/App_20231001135451.tsx new file mode 100644 index 0000000..87ed32b --- /dev/null +++ b/.history/src/App_20231001135451.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135500.tsx b/.history/src/App_20231001135500.tsx new file mode 100644 index 0000000..75dc8d6 --- /dev/null +++ b/.history/src/App_20231001135500.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135505.tsx b/.history/src/App_20231001135505.tsx new file mode 100644 index 0000000..64af407 --- /dev/null +++ b/.history/src/App_20231001135505.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135512.tsx b/.history/src/App_20231001135512.tsx new file mode 100644 index 0000000..db8ecaf --- /dev/null +++ b/.history/src/App_20231001135512.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135521.tsx b/.history/src/App_20231001135521.tsx new file mode 100644 index 0000000..c8458b2 --- /dev/null +++ b/.history/src/App_20231001135521.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135533.tsx b/.history/src/App_20231001135533.tsx new file mode 100644 index 0000000..ee8f849 --- /dev/null +++ b/.history/src/App_20231001135533.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135549.tsx b/.history/src/App_20231001135549.tsx new file mode 100644 index 0000000..4fd190f --- /dev/null +++ b/.history/src/App_20231001135549.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135603.tsx b/.history/src/App_20231001135603.tsx new file mode 100644 index 0000000..639a723 --- /dev/null +++ b/.history/src/App_20231001135603.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135605.tsx b/.history/src/App_20231001135605.tsx new file mode 100644 index 0000000..3419a51 --- /dev/null +++ b/.history/src/App_20231001135605.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135608.tsx b/.history/src/App_20231001135608.tsx new file mode 100644 index 0000000..dcb054d --- /dev/null +++ b/.history/src/App_20231001135608.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135619.tsx b/.history/src/App_20231001135619.tsx new file mode 100644 index 0000000..f43a4e1 --- /dev/null +++ b/.history/src/App_20231001135619.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135627.tsx b/.history/src/App_20231001135627.tsx new file mode 100644 index 0000000..9d09848 --- /dev/null +++ b/.history/src/App_20231001135627.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135632.tsx b/.history/src/App_20231001135632.tsx new file mode 100644 index 0000000..ef5bc16 --- /dev/null +++ b/.history/src/App_20231001135632.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135638.tsx b/.history/src/App_20231001135638.tsx new file mode 100644 index 0000000..c5478d8 --- /dev/null +++ b/.history/src/App_20231001135638.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135640.tsx b/.history/src/App_20231001135640.tsx new file mode 100644 index 0000000..3294d2a --- /dev/null +++ b/.history/src/App_20231001135640.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135648.tsx b/.history/src/App_20231001135648.tsx new file mode 100644 index 0000000..9d09848 --- /dev/null +++ b/.history/src/App_20231001135648.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135651.tsx b/.history/src/App_20231001135651.tsx new file mode 100644 index 0000000..96813d6 --- /dev/null +++ b/.history/src/App_20231001135651.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135653.tsx b/.history/src/App_20231001135653.tsx new file mode 100644 index 0000000..f086d41 --- /dev/null +++ b/.history/src/App_20231001135653.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135657.tsx b/.history/src/App_20231001135657.tsx new file mode 100644 index 0000000..28f9555 --- /dev/null +++ b/.history/src/App_20231001135657.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135704.tsx b/.history/src/App_20231001135704.tsx new file mode 100644 index 0000000..bb91f83 --- /dev/null +++ b/.history/src/App_20231001135704.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135709.tsx b/.history/src/App_20231001135709.tsx new file mode 100644 index 0000000..e3cf7e8 --- /dev/null +++ b/.history/src/App_20231001135709.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135714.tsx b/.history/src/App_20231001135714.tsx new file mode 100644 index 0000000..21ca530 --- /dev/null +++ b/.history/src/App_20231001135714.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135717.tsx b/.history/src/App_20231001135717.tsx new file mode 100644 index 0000000..f086d41 --- /dev/null +++ b/.history/src/App_20231001135717.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135720.tsx b/.history/src/App_20231001135720.tsx new file mode 100644 index 0000000..6fec240 --- /dev/null +++ b/.history/src/App_20231001135720.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135724.tsx b/.history/src/App_20231001135724.tsx new file mode 100644 index 0000000..7995086 --- /dev/null +++ b/.history/src/App_20231001135724.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135732.tsx b/.history/src/App_20231001135732.tsx new file mode 100644 index 0000000..904190d --- /dev/null +++ b/.history/src/App_20231001135732.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135736.tsx b/.history/src/App_20231001135736.tsx new file mode 100644 index 0000000..dcb054d --- /dev/null +++ b/.history/src/App_20231001135736.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135800.tsx b/.history/src/App_20231001135800.tsx new file mode 100644 index 0000000..d216736 --- /dev/null +++ b/.history/src/App_20231001135800.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135801.tsx b/.history/src/App_20231001135801.tsx new file mode 100644 index 0000000..802abd0 --- /dev/null +++ b/.history/src/App_20231001135801.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135803.tsx b/.history/src/App_20231001135803.tsx new file mode 100644 index 0000000..2989c25 --- /dev/null +++ b/.history/src/App_20231001135803.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135809.tsx b/.history/src/App_20231001135809.tsx new file mode 100644 index 0000000..bb8b8c2 --- /dev/null +++ b/.history/src/App_20231001135809.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135829.tsx b/.history/src/App_20231001135829.tsx new file mode 100644 index 0000000..d6d3424 --- /dev/null +++ b/.history/src/App_20231001135829.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135835.tsx b/.history/src/App_20231001135835.tsx new file mode 100644 index 0000000..cadf933 --- /dev/null +++ b/.history/src/App_20231001135835.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135858.tsx b/.history/src/App_20231001135858.tsx new file mode 100644 index 0000000..55b6ba7 --- /dev/null +++ b/.history/src/App_20231001135858.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for an.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135901.tsx b/.history/src/App_20231001135901.tsx new file mode 100644 index 0000000..c08ad99 --- /dev/null +++ b/.history/src/App_20231001135901.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functional.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135902.tsx b/.history/src/App_20231001135902.tsx new file mode 100644 index 0000000..5c215f7 --- /dev/null +++ b/.history/src/App_20231001135902.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135931.tsx b/.history/src/App_20231001135931.tsx new file mode 100644 index 0000000..d2263dc --- /dev/null +++ b/.history/src/App_20231001135931.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140017.tsx b/.history/src/App_20231001140017.tsx new file mode 100644 index 0000000..565161a --- /dev/null +++ b/.history/src/App_20231001140017.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140037.tsx b/.history/src/App_20231001140037.tsx new file mode 100644 index 0000000..8051168 --- /dev/null +++ b/.history/src/App_20231001140037.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140051.tsx b/.history/src/App_20231001140051.tsx new file mode 100644 index 0000000..5f27501 --- /dev/null +++ b/.history/src/App_20231001140051.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140112.tsx b/.history/src/App_20231001140112.tsx new file mode 100644 index 0000000..562804b --- /dev/null +++ b/.history/src/App_20231001140112.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140124.tsx b/.history/src/App_20231001140124.tsx new file mode 100644 index 0000000..d8819f6 --- /dev/null +++ b/.history/src/App_20231001140124.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140134.tsx b/.history/src/App_20231001140134.tsx new file mode 100644 index 0000000..d389899 --- /dev/null +++ b/.history/src/App_20231001140134.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140147.tsx b/.history/src/App_20231001140147.tsx new file mode 100644 index 0000000..df1a087 --- /dev/null +++ b/.history/src/App_20231001140147.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140219.tsx b/.history/src/App_20231001140219.tsx new file mode 100644 index 0000000..92e6018 --- /dev/null +++ b/.history/src/App_20231001140219.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140236.tsx b/.history/src/App_20231001140236.tsx new file mode 100644 index 0000000..b806255 --- /dev/null +++ b/.history/src/App_20231001140236.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140326.tsx b/.history/src/App_20231001140326.tsx new file mode 100644 index 0000000..3799f19 --- /dev/null +++ b/.history/src/App_20231001140326.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140400.tsx b/.history/src/App_20231001140400.tsx new file mode 100644 index 0000000..ad24776 --- /dev/null +++ b/.history/src/App_20231001140400.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140404.tsx b/.history/src/App_20231001140404.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140404.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140410.tsx b/.history/src/App_20231001140410.tsx new file mode 100644 index 0000000..d624b7d --- /dev/null +++ b/.history/src/App_20231001140410.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140413.tsx b/.history/src/App_20231001140413.tsx new file mode 100644 index 0000000..41489fd --- /dev/null +++ b/.history/src/App_20231001140413.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140416.tsx b/.history/src/App_20231001140416.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140416.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140419.tsx b/.history/src/App_20231001140419.tsx new file mode 100644 index 0000000..fcee569 --- /dev/null +++ b/.history/src/App_20231001140419.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140423.tsx b/.history/src/App_20231001140423.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140423.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140441.tsx b/.history/src/App_20231001140441.tsx new file mode 100644 index 0000000..119e7d0 --- /dev/null +++ b/.history/src/App_20231001140441.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140445.tsx b/.history/src/App_20231001140445.tsx new file mode 100644 index 0000000..187b95e --- /dev/null +++ b/.history/src/App_20231001140445.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140447.tsx b/.history/src/App_20231001140447.tsx new file mode 100644 index 0000000..c3437eb --- /dev/null +++ b/.history/src/App_20231001140447.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140603.tsx b/.history/src/App_20231001140603.tsx new file mode 100644 index 0000000..f13d7c4 --- /dev/null +++ b/.history/src/App_20231001140603.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140611.tsx b/.history/src/App_20231001140611.tsx new file mode 100644 index 0000000..c3437eb --- /dev/null +++ b/.history/src/App_20231001140611.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140612.tsx b/.history/src/App_20231001140612.tsx new file mode 100644 index 0000000..13b2a39 --- /dev/null +++ b/.history/src/App_20231001140612.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140633.tsx b/.history/src/App_20231001140633.tsx new file mode 100644 index 0000000..639ecfd --- /dev/null +++ b/.history/src/App_20231001140633.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140645.tsx b/.history/src/App_20231001140645.tsx new file mode 100644 index 0000000..37cc961 --- /dev/null +++ b/.history/src/App_20231001140645.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140657.tsx b/.history/src/App_20231001140657.tsx new file mode 100644 index 0000000..13b2a39 --- /dev/null +++ b/.history/src/App_20231001140657.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140705.tsx b/.history/src/App_20231001140705.tsx new file mode 100644 index 0000000..4584c93 --- /dev/null +++ b/.history/src/App_20231001140705.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140721.tsx b/.history/src/App_20231001140721.tsx new file mode 100644 index 0000000..4584c93 --- /dev/null +++ b/.history/src/App_20231001140721.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140723.tsx b/.history/src/App_20231001140723.tsx new file mode 100644 index 0000000..7ffccb1 --- /dev/null +++ b/.history/src/App_20231001140723.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140735.tsx b/.history/src/App_20231001140735.tsx new file mode 100644 index 0000000..d5b2c2b --- /dev/null +++ b/.history/src/App_20231001140735.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear '.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140744.tsx b/.history/src/App_20231001140744.tsx new file mode 100644 index 0000000..6031975 --- /dev/null +++ b/.history/src/App_20231001140744.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the .

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140746.tsx b/.history/src/App_20231001140746.tsx new file mode 100644 index 0000000..21ff0fe --- /dev/null +++ b/.history/src/App_20231001140746.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140755.tsx b/.history/src/App_20231001140755.tsx new file mode 100644 index 0000000..5a71bef --- /dev/null +++ b/.history/src/App_20231001140755.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/index_20231001131835.css b/.history/src/index_20231001131835.css new file mode 100644 index 0000000..3dd1d24 --- /dev/null +++ b/.history/src/index_20231001131835.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #300a24; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134557.css b/.history/src/index_20231001134557.css new file mode 100644 index 0000000..d7ec15d --- /dev/null +++ b/.history/src/index_20231001134557.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #2b2529; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134601.css b/.history/src/index_20231001134601.css new file mode 100644 index 0000000..178c35c --- /dev/null +++ b/.history/src/index_20231001134601.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #2b2429; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134608.css b/.history/src/index_20231001134608.css new file mode 100644 index 0000000..dd46734 --- /dev/null +++ b/.history/src/index_20231001134608.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #332c31; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134611.css b/.history/src/index_20231001134611.css new file mode 100644 index 0000000..a67e39f --- /dev/null +++ b/.history/src/index_20231001134611.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242324; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001135943.css b/.history/src/index_20231001135943.css new file mode 100644 index 0000000..dd46734 --- /dev/null +++ b/.history/src/index_20231001135943.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #332c31; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001135947.css b/.history/src/index_20231001135947.css new file mode 100644 index 0000000..3dd1d24 --- /dev/null +++ b/.history/src/index_20231001135947.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #300a24; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140011.css b/.history/src/index_20231001140011.css new file mode 100644 index 0000000..06e2b8a --- /dev/null +++ b/.history/src/index_20231001140011.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140513.css b/.history/src/index_20231001140513.css new file mode 100644 index 0000000..b51f619 --- /dev/null +++ b/.history/src/index_20231001140513.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 200; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140528.css b/.history/src/index_20231001140528.css new file mode 100644 index 0000000..ac00e64 --- /dev/null +++ b/.history/src/index_20231001140528.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 00; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140529.css b/.history/src/index_20231001140529.css new file mode 100644 index 0000000..fdb112d --- /dev/null +++ b/.history/src/index_20231001140529.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 600; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140535.css b/.history/src/index_20231001140535.css new file mode 100644 index 0000000..c054cdb --- /dev/null +++ b/.history/src/index_20231001140535.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 800; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140542.css b/.history/src/index_20231001140542.css new file mode 100644 index 0000000..06e2b8a --- /dev/null +++ b/.history/src/index_20231001140542.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/package-lock.json b/package-lock.json index 68b9c1e..e8d0098 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "eslint-plugin-react-refresh": "^0.4.3", "postcss": "^8.4.30", "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", + "typescript": "^5.2.2", "vite": "^4.4.5" } }, diff --git a/package.json b/package.json index 86495f3..c935887 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "eslint-plugin-react-refresh": "^0.4.3", "postcss": "^8.4.30", "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", + "typescript": "^5.2.2", "vite": "^4.4.5" } } diff --git a/src/App.tsx b/src/App.tsx index 26c9776..5a71bef 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -112,7 +112,11 @@ function App() { }, []); return ( -
+
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
{ /* History */ history.map((history) => ( @@ -130,7 +134,7 @@ function App() {
+
); } const Prompt = () => { return ( - + {username}@{hostname} :{path} diff --git a/src/index.css b/src/index.css index 3dd1d24..06e2b8a 100644 --- a/src/index.css +++ b/src/index.css @@ -5,7 +5,7 @@ color-scheme: light dark; color: rgba(255, 255, 255, 0.87); - background-color: #300a24; + /* background-color: #300a24; */ font-synthesis: none; text-rendering: optimizeLegibility; From c3867464eec90a296748acf66939b95e03ffa10b Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Mon, 2 Oct 2023 12:15:24 +0530 Subject: [PATCH 2/9] Untrack .history folder --- .history/src/App_20231001131835.tsx | 159 ------------------------ .history/src/App_20231001134627.tsx | 159 ------------------------ .history/src/App_20231001134629.tsx | 159 ------------------------ .history/src/App_20231001134636.tsx | 159 ------------------------ .history/src/App_20231001134637.tsx | 159 ------------------------ .history/src/App_20231001134651.tsx | 159 ------------------------ .history/src/App_20231001134658.tsx | 159 ------------------------ .history/src/App_20231001134702.tsx | 159 ------------------------ .history/src/App_20231001134713.tsx | 159 ------------------------ .history/src/App_20231001134725.tsx | 159 ------------------------ .history/src/App_20231001134727.tsx | 159 ------------------------ .history/src/App_20231001134729.tsx | 159 ------------------------ .history/src/App_20231001134738.tsx | 159 ------------------------ .history/src/App_20231001134744.tsx | 159 ------------------------ .history/src/App_20231001134835.tsx | 160 ------------------------- .history/src/App_20231001134839.tsx | 160 ------------------------- .history/src/App_20231001134846.tsx | 161 ------------------------- .history/src/App_20231001134847.tsx | 161 ------------------------- .history/src/App_20231001134853.tsx | 162 ------------------------- .history/src/App_20231001134855.tsx | 162 ------------------------- .history/src/App_20231001134857.tsx | 162 ------------------------- .history/src/App_20231001134906.tsx | 162 ------------------------- .history/src/App_20231001134908.tsx | 162 ------------------------- .history/src/App_20231001134909.tsx | 162 ------------------------- .history/src/App_20231001134929.tsx | 162 ------------------------- .history/src/App_20231001134932.tsx | 162 ------------------------- .history/src/App_20231001134934.tsx | 162 ------------------------- .history/src/App_20231001134943.tsx | 162 ------------------------- .history/src/App_20231001134947.tsx | 162 ------------------------- .history/src/App_20231001134949.tsx | 162 ------------------------- .history/src/App_20231001134952.tsx | 162 ------------------------- .history/src/App_20231001134954.tsx | 162 ------------------------- .history/src/App_20231001134957.tsx | 162 ------------------------- .history/src/App_20231001135000.tsx | 162 ------------------------- .history/src/App_20231001135002.tsx | 162 ------------------------- .history/src/App_20231001135003.tsx | 162 ------------------------- .history/src/App_20231001135006.tsx | 162 ------------------------- .history/src/App_20231001135013.tsx | 162 ------------------------- .history/src/App_20231001135017.tsx | 162 ------------------------- .history/src/App_20231001135020.tsx | 162 ------------------------- .history/src/App_20231001135023.tsx | 162 ------------------------- .history/src/App_20231001135037.tsx | 162 ------------------------- .history/src/App_20231001135041.tsx | 162 ------------------------- .history/src/App_20231001135050.tsx | 162 ------------------------- .history/src/App_20231001135052.tsx | 162 ------------------------- .history/src/App_20231001135054.tsx | 162 ------------------------- .history/src/App_20231001135100.tsx | 162 ------------------------- .history/src/App_20231001135113.tsx | 162 ------------------------- .history/src/App_20231001135117.tsx | 162 ------------------------- .history/src/App_20231001135121.tsx | 162 ------------------------- .history/src/App_20231001135124.tsx | 162 ------------------------- .history/src/App_20231001135131.tsx | 166 -------------------------- .history/src/App_20231001135132.tsx | 162 ------------------------- .history/src/App_20231001135137.tsx | 162 ------------------------- .history/src/App_20231001135143.tsx | 162 ------------------------- .history/src/App_20231001135144.tsx | 162 ------------------------- .history/src/App_20231001135151.tsx | 162 ------------------------- .history/src/App_20231001135153.tsx | 162 ------------------------- .history/src/App_20231001135203.tsx | 162 ------------------------- .history/src/App_20231001135207.tsx | 162 ------------------------- .history/src/App_20231001135210.tsx | 162 ------------------------- .history/src/App_20231001135223.tsx | 162 ------------------------- .history/src/App_20231001135250.tsx | 162 ------------------------- .history/src/App_20231001135313.tsx | 163 ------------------------- .history/src/App_20231001135318.tsx | 163 ------------------------- .history/src/App_20231001135319.tsx | 163 ------------------------- .history/src/App_20231001135321.tsx | 163 ------------------------- .history/src/App_20231001135326.tsx | 163 ------------------------- .history/src/App_20231001135330.tsx | 163 ------------------------- .history/src/App_20231001135332.tsx | 163 ------------------------- .history/src/App_20231001135354.tsx | 163 ------------------------- .history/src/App_20231001135409.tsx | 163 ------------------------- .history/src/App_20231001135410.tsx | 163 ------------------------- .history/src/App_20231001135414.tsx | 163 ------------------------- .history/src/App_20231001135422.tsx | 163 ------------------------- .history/src/App_20231001135436.tsx | 163 ------------------------- .history/src/App_20231001135442.tsx | 163 ------------------------- .history/src/App_20231001135451.tsx | 163 ------------------------- .history/src/App_20231001135500.tsx | 163 ------------------------- .history/src/App_20231001135505.tsx | 163 ------------------------- .history/src/App_20231001135512.tsx | 163 ------------------------- .history/src/App_20231001135521.tsx | 163 ------------------------- .history/src/App_20231001135533.tsx | 163 ------------------------- .history/src/App_20231001135549.tsx | 163 ------------------------- .history/src/App_20231001135603.tsx | 163 ------------------------- .history/src/App_20231001135605.tsx | 163 ------------------------- .history/src/App_20231001135608.tsx | 163 ------------------------- .history/src/App_20231001135619.tsx | 163 ------------------------- .history/src/App_20231001135627.tsx | 163 ------------------------- .history/src/App_20231001135632.tsx | 163 ------------------------- .history/src/App_20231001135638.tsx | 163 ------------------------- .history/src/App_20231001135640.tsx | 163 ------------------------- .history/src/App_20231001135648.tsx | 163 ------------------------- .history/src/App_20231001135651.tsx | 163 ------------------------- .history/src/App_20231001135653.tsx | 163 ------------------------- .history/src/App_20231001135657.tsx | 163 ------------------------- .history/src/App_20231001135704.tsx | 163 ------------------------- .history/src/App_20231001135709.tsx | 163 ------------------------- .history/src/App_20231001135714.tsx | 163 ------------------------- .history/src/App_20231001135717.tsx | 163 ------------------------- .history/src/App_20231001135720.tsx | 163 ------------------------- .history/src/App_20231001135724.tsx | 163 ------------------------- .history/src/App_20231001135732.tsx | 163 ------------------------- .history/src/App_20231001135736.tsx | 163 ------------------------- .history/src/App_20231001135800.tsx | 163 ------------------------- .history/src/App_20231001135801.tsx | 163 ------------------------- .history/src/App_20231001135803.tsx | 163 ------------------------- .history/src/App_20231001135809.tsx | 163 ------------------------- .history/src/App_20231001135829.tsx | 163 ------------------------- .history/src/App_20231001135835.tsx | 163 ------------------------- .history/src/App_20231001135858.tsx | 163 ------------------------- .history/src/App_20231001135901.tsx | 163 ------------------------- .history/src/App_20231001135902.tsx | 163 ------------------------- .history/src/App_20231001135931.tsx | 163 ------------------------- .history/src/App_20231001140017.tsx | 163 ------------------------- .history/src/App_20231001140037.tsx | 163 ------------------------- .history/src/App_20231001140051.tsx | 163 ------------------------- .history/src/App_20231001140112.tsx | 163 ------------------------- .history/src/App_20231001140124.tsx | 163 ------------------------- .history/src/App_20231001140134.tsx | 163 ------------------------- .history/src/App_20231001140147.tsx | 163 ------------------------- .history/src/App_20231001140219.tsx | 163 ------------------------- .history/src/App_20231001140236.tsx | 163 ------------------------- .history/src/App_20231001140326.tsx | 163 ------------------------- .history/src/App_20231001140400.tsx | 163 ------------------------- .history/src/App_20231001140404.tsx | 163 ------------------------- .history/src/App_20231001140410.tsx | 163 ------------------------- .history/src/App_20231001140413.tsx | 163 ------------------------- .history/src/App_20231001140416.tsx | 163 ------------------------- .history/src/App_20231001140419.tsx | 163 ------------------------- .history/src/App_20231001140423.tsx | 163 ------------------------- .history/src/App_20231001140441.tsx | 163 ------------------------- .history/src/App_20231001140445.tsx | 163 ------------------------- .history/src/App_20231001140447.tsx | 163 ------------------------- .history/src/App_20231001140603.tsx | 163 ------------------------- .history/src/App_20231001140611.tsx | 163 ------------------------- .history/src/App_20231001140612.tsx | 163 ------------------------- .history/src/App_20231001140633.tsx | 163 ------------------------- .history/src/App_20231001140645.tsx | 163 ------------------------- .history/src/App_20231001140657.tsx | 163 ------------------------- .history/src/App_20231001140705.tsx | 163 ------------------------- .history/src/App_20231001140721.tsx | 163 ------------------------- .history/src/App_20231001140723.tsx | 164 ------------------------- .history/src/App_20231001140735.tsx | 164 ------------------------- .history/src/App_20231001140744.tsx | 164 ------------------------- .history/src/App_20231001140746.tsx | 164 ------------------------- .history/src/App_20231001140755.tsx | 164 ------------------------- .history/src/index_20231001131835.css | 25 ---- .history/src/index_20231001134557.css | 25 ---- .history/src/index_20231001134601.css | 25 ---- .history/src/index_20231001134608.css | 25 ---- .history/src/index_20231001134611.css | 25 ---- .history/src/index_20231001135943.css | 25 ---- .history/src/index_20231001135947.css | 25 ---- .history/src/index_20231001140011.css | 25 ---- .history/src/index_20231001140513.css | 25 ---- .history/src/index_20231001140528.css | 25 ---- .history/src/index_20231001140529.css | 25 ---- .history/src/index_20231001140535.css | 25 ---- .history/src/index_20231001140542.css | 25 ---- 160 files changed, 24184 deletions(-) delete mode 100644 .history/src/App_20231001131835.tsx delete mode 100644 .history/src/App_20231001134627.tsx delete mode 100644 .history/src/App_20231001134629.tsx delete mode 100644 .history/src/App_20231001134636.tsx delete mode 100644 .history/src/App_20231001134637.tsx delete mode 100644 .history/src/App_20231001134651.tsx delete mode 100644 .history/src/App_20231001134658.tsx delete mode 100644 .history/src/App_20231001134702.tsx delete mode 100644 .history/src/App_20231001134713.tsx delete mode 100644 .history/src/App_20231001134725.tsx delete mode 100644 .history/src/App_20231001134727.tsx delete mode 100644 .history/src/App_20231001134729.tsx delete mode 100644 .history/src/App_20231001134738.tsx delete mode 100644 .history/src/App_20231001134744.tsx delete mode 100644 .history/src/App_20231001134835.tsx delete mode 100644 .history/src/App_20231001134839.tsx delete mode 100644 .history/src/App_20231001134846.tsx delete mode 100644 .history/src/App_20231001134847.tsx delete mode 100644 .history/src/App_20231001134853.tsx delete mode 100644 .history/src/App_20231001134855.tsx delete mode 100644 .history/src/App_20231001134857.tsx delete mode 100644 .history/src/App_20231001134906.tsx delete mode 100644 .history/src/App_20231001134908.tsx delete mode 100644 .history/src/App_20231001134909.tsx delete mode 100644 .history/src/App_20231001134929.tsx delete mode 100644 .history/src/App_20231001134932.tsx delete mode 100644 .history/src/App_20231001134934.tsx delete mode 100644 .history/src/App_20231001134943.tsx delete mode 100644 .history/src/App_20231001134947.tsx delete mode 100644 .history/src/App_20231001134949.tsx delete mode 100644 .history/src/App_20231001134952.tsx delete mode 100644 .history/src/App_20231001134954.tsx delete mode 100644 .history/src/App_20231001134957.tsx delete mode 100644 .history/src/App_20231001135000.tsx delete mode 100644 .history/src/App_20231001135002.tsx delete mode 100644 .history/src/App_20231001135003.tsx delete mode 100644 .history/src/App_20231001135006.tsx delete mode 100644 .history/src/App_20231001135013.tsx delete mode 100644 .history/src/App_20231001135017.tsx delete mode 100644 .history/src/App_20231001135020.tsx delete mode 100644 .history/src/App_20231001135023.tsx delete mode 100644 .history/src/App_20231001135037.tsx delete mode 100644 .history/src/App_20231001135041.tsx delete mode 100644 .history/src/App_20231001135050.tsx delete mode 100644 .history/src/App_20231001135052.tsx delete mode 100644 .history/src/App_20231001135054.tsx delete mode 100644 .history/src/App_20231001135100.tsx delete mode 100644 .history/src/App_20231001135113.tsx delete mode 100644 .history/src/App_20231001135117.tsx delete mode 100644 .history/src/App_20231001135121.tsx delete mode 100644 .history/src/App_20231001135124.tsx delete mode 100644 .history/src/App_20231001135131.tsx delete mode 100644 .history/src/App_20231001135132.tsx delete mode 100644 .history/src/App_20231001135137.tsx delete mode 100644 .history/src/App_20231001135143.tsx delete mode 100644 .history/src/App_20231001135144.tsx delete mode 100644 .history/src/App_20231001135151.tsx delete mode 100644 .history/src/App_20231001135153.tsx delete mode 100644 .history/src/App_20231001135203.tsx delete mode 100644 .history/src/App_20231001135207.tsx delete mode 100644 .history/src/App_20231001135210.tsx delete mode 100644 .history/src/App_20231001135223.tsx delete mode 100644 .history/src/App_20231001135250.tsx delete mode 100644 .history/src/App_20231001135313.tsx delete mode 100644 .history/src/App_20231001135318.tsx delete mode 100644 .history/src/App_20231001135319.tsx delete mode 100644 .history/src/App_20231001135321.tsx delete mode 100644 .history/src/App_20231001135326.tsx delete mode 100644 .history/src/App_20231001135330.tsx delete mode 100644 .history/src/App_20231001135332.tsx delete mode 100644 .history/src/App_20231001135354.tsx delete mode 100644 .history/src/App_20231001135409.tsx delete mode 100644 .history/src/App_20231001135410.tsx delete mode 100644 .history/src/App_20231001135414.tsx delete mode 100644 .history/src/App_20231001135422.tsx delete mode 100644 .history/src/App_20231001135436.tsx delete mode 100644 .history/src/App_20231001135442.tsx delete mode 100644 .history/src/App_20231001135451.tsx delete mode 100644 .history/src/App_20231001135500.tsx delete mode 100644 .history/src/App_20231001135505.tsx delete mode 100644 .history/src/App_20231001135512.tsx delete mode 100644 .history/src/App_20231001135521.tsx delete mode 100644 .history/src/App_20231001135533.tsx delete mode 100644 .history/src/App_20231001135549.tsx delete mode 100644 .history/src/App_20231001135603.tsx delete mode 100644 .history/src/App_20231001135605.tsx delete mode 100644 .history/src/App_20231001135608.tsx delete mode 100644 .history/src/App_20231001135619.tsx delete mode 100644 .history/src/App_20231001135627.tsx delete mode 100644 .history/src/App_20231001135632.tsx delete mode 100644 .history/src/App_20231001135638.tsx delete mode 100644 .history/src/App_20231001135640.tsx delete mode 100644 .history/src/App_20231001135648.tsx delete mode 100644 .history/src/App_20231001135651.tsx delete mode 100644 .history/src/App_20231001135653.tsx delete mode 100644 .history/src/App_20231001135657.tsx delete mode 100644 .history/src/App_20231001135704.tsx delete mode 100644 .history/src/App_20231001135709.tsx delete mode 100644 .history/src/App_20231001135714.tsx delete mode 100644 .history/src/App_20231001135717.tsx delete mode 100644 .history/src/App_20231001135720.tsx delete mode 100644 .history/src/App_20231001135724.tsx delete mode 100644 .history/src/App_20231001135732.tsx delete mode 100644 .history/src/App_20231001135736.tsx delete mode 100644 .history/src/App_20231001135800.tsx delete mode 100644 .history/src/App_20231001135801.tsx delete mode 100644 .history/src/App_20231001135803.tsx delete mode 100644 .history/src/App_20231001135809.tsx delete mode 100644 .history/src/App_20231001135829.tsx delete mode 100644 .history/src/App_20231001135835.tsx delete mode 100644 .history/src/App_20231001135858.tsx delete mode 100644 .history/src/App_20231001135901.tsx delete mode 100644 .history/src/App_20231001135902.tsx delete mode 100644 .history/src/App_20231001135931.tsx delete mode 100644 .history/src/App_20231001140017.tsx delete mode 100644 .history/src/App_20231001140037.tsx delete mode 100644 .history/src/App_20231001140051.tsx delete mode 100644 .history/src/App_20231001140112.tsx delete mode 100644 .history/src/App_20231001140124.tsx delete mode 100644 .history/src/App_20231001140134.tsx delete mode 100644 .history/src/App_20231001140147.tsx delete mode 100644 .history/src/App_20231001140219.tsx delete mode 100644 .history/src/App_20231001140236.tsx delete mode 100644 .history/src/App_20231001140326.tsx delete mode 100644 .history/src/App_20231001140400.tsx delete mode 100644 .history/src/App_20231001140404.tsx delete mode 100644 .history/src/App_20231001140410.tsx delete mode 100644 .history/src/App_20231001140413.tsx delete mode 100644 .history/src/App_20231001140416.tsx delete mode 100644 .history/src/App_20231001140419.tsx delete mode 100644 .history/src/App_20231001140423.tsx delete mode 100644 .history/src/App_20231001140441.tsx delete mode 100644 .history/src/App_20231001140445.tsx delete mode 100644 .history/src/App_20231001140447.tsx delete mode 100644 .history/src/App_20231001140603.tsx delete mode 100644 .history/src/App_20231001140611.tsx delete mode 100644 .history/src/App_20231001140612.tsx delete mode 100644 .history/src/App_20231001140633.tsx delete mode 100644 .history/src/App_20231001140645.tsx delete mode 100644 .history/src/App_20231001140657.tsx delete mode 100644 .history/src/App_20231001140705.tsx delete mode 100644 .history/src/App_20231001140721.tsx delete mode 100644 .history/src/App_20231001140723.tsx delete mode 100644 .history/src/App_20231001140735.tsx delete mode 100644 .history/src/App_20231001140744.tsx delete mode 100644 .history/src/App_20231001140746.tsx delete mode 100644 .history/src/App_20231001140755.tsx delete mode 100644 .history/src/index_20231001131835.css delete mode 100644 .history/src/index_20231001134557.css delete mode 100644 .history/src/index_20231001134601.css delete mode 100644 .history/src/index_20231001134608.css delete mode 100644 .history/src/index_20231001134611.css delete mode 100644 .history/src/index_20231001135943.css delete mode 100644 .history/src/index_20231001135947.css delete mode 100644 .history/src/index_20231001140011.css delete mode 100644 .history/src/index_20231001140513.css delete mode 100644 .history/src/index_20231001140528.css delete mode 100644 .history/src/index_20231001140529.css delete mode 100644 .history/src/index_20231001140535.css delete mode 100644 .history/src/index_20231001140542.css diff --git a/.history/src/App_20231001131835.tsx b/.history/src/App_20231001131835.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001131835.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - - - - - -
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134627.tsx b/.history/src/App_20231001134627.tsx deleted file mode 100644 index efaa4b0..0000000 --- a/.history/src/App_20231001134627.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134629.tsx b/.history/src/App_20231001134629.tsx deleted file mode 100644 index 0a70d71..0000000 --- a/.history/src/App_20231001134629.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134636.tsx b/.history/src/App_20231001134636.tsx deleted file mode 100644 index f5ff92d..0000000 --- a/.history/src/App_20231001134636.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134637.tsx b/.history/src/App_20231001134637.tsx deleted file mode 100644 index 4eb5401..0000000 --- a/.history/src/App_20231001134637.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134651.tsx b/.history/src/App_20231001134651.tsx deleted file mode 100644 index c8620b4..0000000 --- a/.history/src/App_20231001134651.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134658.tsx b/.history/src/App_20231001134658.tsx deleted file mode 100644 index f6ef193..0000000 --- a/.history/src/App_20231001134658.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134702.tsx b/.history/src/App_20231001134702.tsx deleted file mode 100644 index 4eb5401..0000000 --- a/.history/src/App_20231001134702.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134713.tsx b/.history/src/App_20231001134713.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001134713.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134725.tsx b/.history/src/App_20231001134725.tsx deleted file mode 100644 index 8caf5e2..0000000 --- a/.history/src/App_20231001134725.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134727.tsx b/.history/src/App_20231001134727.tsx deleted file mode 100644 index 4935ed0..0000000 --- a/.history/src/App_20231001134727.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134729.tsx b/.history/src/App_20231001134729.tsx deleted file mode 100644 index 07288ff..0000000 --- a/.history/src/App_20231001134729.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134738.tsx b/.history/src/App_20231001134738.tsx deleted file mode 100644 index 878a1fc..0000000 --- a/.history/src/App_20231001134738.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134744.tsx b/.history/src/App_20231001134744.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001134744.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134835.tsx b/.history/src/App_20231001134835.tsx deleted file mode 100644 index a50e6e9..0000000 --- a/.history/src/App_20231001134835.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( - -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134839.tsx b/.history/src/App_20231001134839.tsx deleted file mode 100644 index 063bab2..0000000 --- a/.history/src/App_20231001134839.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134846.tsx b/.history/src/App_20231001134846.tsx deleted file mode 100644 index 0e3e1a2..0000000 --- a/.history/src/App_20231001134846.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134847.tsx b/.history/src/App_20231001134847.tsx deleted file mode 100644 index 0444a73..0000000 --- a/.history/src/App_20231001134847.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134853.tsx b/.history/src/App_20231001134853.tsx deleted file mode 100644 index 4a76e56..0000000 --- a/.history/src/App_20231001134853.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

- { - /* History */ - history.map((history) => ( -

- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134855.tsx b/.history/src/App_20231001134855.tsx deleted file mode 100644 index 4a76e56..0000000 --- a/.history/src/App_20231001134855.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

- { - /* History */ - history.map((history) => ( -

- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134857.tsx b/.history/src/App_20231001134857.tsx deleted file mode 100644 index b5380d4..0000000 --- a/.history/src/App_20231001134857.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134906.tsx b/.history/src/App_20231001134906.tsx deleted file mode 100644 index b3246e3..0000000 --- a/.history/src/App_20231001134906.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134908.tsx b/.history/src/App_20231001134908.tsx deleted file mode 100644 index e48ddd4..0000000 --- a/.history/src/App_20231001134908.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134909.tsx b/.history/src/App_20231001134909.tsx deleted file mode 100644 index ca817f8..0000000 --- a/.history/src/App_20231001134909.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134929.tsx b/.history/src/App_20231001134929.tsx deleted file mode 100644 index 19122b3..0000000 --- a/.history/src/App_20231001134929.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134932.tsx b/.history/src/App_20231001134932.tsx deleted file mode 100644 index 56e5333..0000000 --- a/.history/src/App_20231001134932.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134934.tsx b/.history/src/App_20231001134934.tsx deleted file mode 100644 index 857521c..0000000 --- a/.history/src/App_20231001134934.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134943.tsx b/.history/src/App_20231001134943.tsx deleted file mode 100644 index 9accda2..0000000 --- a/.history/src/App_20231001134943.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134947.tsx b/.history/src/App_20231001134947.tsx deleted file mode 100644 index 2308941..0000000 --- a/.history/src/App_20231001134947.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134949.tsx b/.history/src/App_20231001134949.tsx deleted file mode 100644 index 5af9875..0000000 --- a/.history/src/App_20231001134949.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134952.tsx b/.history/src/App_20231001134952.tsx deleted file mode 100644 index 1c853e6..0000000 --- a/.history/src/App_20231001134952.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134954.tsx b/.history/src/App_20231001134954.tsx deleted file mode 100644 index ddcca97..0000000 --- a/.history/src/App_20231001134954.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134957.tsx b/.history/src/App_20231001134957.tsx deleted file mode 100644 index e59fdd0..0000000 --- a/.history/src/App_20231001134957.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135000.tsx b/.history/src/App_20231001135000.tsx deleted file mode 100644 index 2d7781a..0000000 --- a/.history/src/App_20231001135000.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135002.tsx b/.history/src/App_20231001135002.tsx deleted file mode 100644 index 2e31c7a..0000000 --- a/.history/src/App_20231001135002.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135003.tsx b/.history/src/App_20231001135003.tsx deleted file mode 100644 index 9debdc1..0000000 --- a/.history/src/App_20231001135003.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135006.tsx b/.history/src/App_20231001135006.tsx deleted file mode 100644 index d86b6a5..0000000 --- a/.history/src/App_20231001135006.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135013.tsx b/.history/src/App_20231001135013.tsx deleted file mode 100644 index 9debdc1..0000000 --- a/.history/src/App_20231001135013.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135017.tsx b/.history/src/App_20231001135017.tsx deleted file mode 100644 index 22fc7b5..0000000 --- a/.history/src/App_20231001135017.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135020.tsx b/.history/src/App_20231001135020.tsx deleted file mode 100644 index 6d8fbf3..0000000 --- a/.history/src/App_20231001135020.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135023.tsx b/.history/src/App_20231001135023.tsx deleted file mode 100644 index 7272fa2..0000000 --- a/.history/src/App_20231001135023.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135037.tsx b/.history/src/App_20231001135037.tsx deleted file mode 100644 index fab6f90..0000000 --- a/.history/src/App_20231001135037.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135041.tsx b/.history/src/App_20231001135041.tsx deleted file mode 100644 index ced7c33..0000000 --- a/.history/src/App_20231001135041.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135050.tsx b/.history/src/App_20231001135050.tsx deleted file mode 100644 index 981a57b..0000000 --- a/.history/src/App_20231001135050.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135052.tsx b/.history/src/App_20231001135052.tsx deleted file mode 100644 index e63cc8d..0000000 --- a/.history/src/App_20231001135052.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135054.tsx b/.history/src/App_20231001135054.tsx deleted file mode 100644 index 3d51d9d..0000000 --- a/.history/src/App_20231001135054.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135100.tsx b/.history/src/App_20231001135100.tsx deleted file mode 100644 index 2e98ede..0000000 --- a/.history/src/App_20231001135100.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135113.tsx b/.history/src/App_20231001135113.tsx deleted file mode 100644 index 5e04509..0000000 --- a/.history/src/App_20231001135113.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135117.tsx b/.history/src/App_20231001135117.tsx deleted file mode 100644 index 2e98ede..0000000 --- a/.history/src/App_20231001135117.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135121.tsx b/.history/src/App_20231001135121.tsx deleted file mode 100644 index 7b644ef..0000000 --- a/.history/src/App_20231001135121.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135124.tsx b/.history/src/App_20231001135124.tsx deleted file mode 100644 index d59f649..0000000 --- a/.history/src/App_20231001135124.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135131.tsx b/.history/src/App_20231001135131.tsx deleted file mode 100644 index cb5c4a1..0000000 --- a/.history/src/App_20231001135131.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135132.tsx b/.history/src/App_20231001135132.tsx deleted file mode 100644 index a00d851..0000000 --- a/.history/src/App_20231001135132.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135137.tsx b/.history/src/App_20231001135137.tsx deleted file mode 100644 index a79ba58..0000000 --- a/.history/src/App_20231001135137.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135143.tsx b/.history/src/App_20231001135143.tsx deleted file mode 100644 index d768e53..0000000 --- a/.history/src/App_20231001135143.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135144.tsx b/.history/src/App_20231001135144.tsx deleted file mode 100644 index d4afa53..0000000 --- a/.history/src/App_20231001135144.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135151.tsx b/.history/src/App_20231001135151.tsx deleted file mode 100644 index 5bf0d63..0000000 --- a/.history/src/App_20231001135151.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135153.tsx b/.history/src/App_20231001135153.tsx deleted file mode 100644 index b32b0fe..0000000 --- a/.history/src/App_20231001135153.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135203.tsx b/.history/src/App_20231001135203.tsx deleted file mode 100644 index 56199cb..0000000 --- a/.history/src/App_20231001135203.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135207.tsx b/.history/src/App_20231001135207.tsx deleted file mode 100644 index 2342ded..0000000 --- a/.history/src/App_20231001135207.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135223.tsx b/.history/src/App_20231001135223.tsx deleted file mode 100644 index 506d82e..0000000 --- a/.history/src/App_20231001135223.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135250.tsx b/.history/src/App_20231001135250.tsx deleted file mode 100644 index c59d7cb..0000000 --- a/.history/src/App_20231001135250.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135313.tsx b/.history/src/App_20231001135313.tsx deleted file mode 100644 index cc7d5d7..0000000 --- a/.history/src/App_20231001135313.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135318.tsx b/.history/src/App_20231001135318.tsx deleted file mode 100644 index c84d7bc..0000000 --- a/.history/src/App_20231001135318.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instruc

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135319.tsx b/.history/src/App_20231001135319.tsx deleted file mode 100644 index 1e3745e..0000000 --- a/.history/src/App_20231001135319.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135321.tsx b/.history/src/App_20231001135321.tsx deleted file mode 100644 index c017d39..0000000 --- a/.history/src/App_20231001135321.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions ->

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135326.tsx b/.history/src/App_20231001135326.tsx deleted file mode 100644 index c78457b..0000000 --- a/.history/src/App_20231001135326.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions --> Y

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135330.tsx b/.history/src/App_20231001135330.tsx deleted file mode 100644 index a90931f..0000000 --- a/.history/src/App_20231001135330.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions -

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135332.tsx b/.history/src/App_20231001135332.tsx deleted file mode 100644 index 03f7d81..0000000 --- a/.history/src/App_20231001135332.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - You

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135354.tsx b/.history/src/App_20231001135354.tsx deleted file mode 100644 index 81a5bc2..0000000 --- a/.history/src/App_20231001135354.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135409.tsx b/.history/src/App_20231001135409.tsx deleted file mode 100644 index aa3ab0d..0000000 --- a/.history/src/App_20231001135409.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You need

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135410.tsx b/.history/src/App_20231001135410.tsx deleted file mode 100644 index 4ad0f07..0000000 --- a/.history/src/App_20231001135410.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You need to

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135414.tsx b/.history/src/App_20231001135414.tsx deleted file mode 100644 index 81a5bc2..0000000 --- a/.history/src/App_20231001135414.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135422.tsx b/.history/src/App_20231001135422.tsx deleted file mode 100644 index 4dc7397..0000000 --- a/.history/src/App_20231001135422.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135436.tsx b/.history/src/App_20231001135436.tsx deleted file mode 100644 index d5fe94b..0000000 --- a/.history/src/App_20231001135436.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135442.tsx b/.history/src/App_20231001135442.tsx deleted file mode 100644 index 7d94392..0000000 --- a/.history/src/App_20231001135442.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135451.tsx b/.history/src/App_20231001135451.tsx deleted file mode 100644 index 87ed32b..0000000 --- a/.history/src/App_20231001135451.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135500.tsx b/.history/src/App_20231001135500.tsx deleted file mode 100644 index 75dc8d6..0000000 --- a/.history/src/App_20231001135500.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135505.tsx b/.history/src/App_20231001135505.tsx deleted file mode 100644 index 64af407..0000000 --- a/.history/src/App_20231001135505.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135512.tsx b/.history/src/App_20231001135512.tsx deleted file mode 100644 index db8ecaf..0000000 --- a/.history/src/App_20231001135512.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135521.tsx b/.history/src/App_20231001135521.tsx deleted file mode 100644 index c8458b2..0000000 --- a/.history/src/App_20231001135521.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135533.tsx b/.history/src/App_20231001135533.tsx deleted file mode 100644 index ee8f849..0000000 --- a/.history/src/App_20231001135533.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135549.tsx b/.history/src/App_20231001135549.tsx deleted file mode 100644 index 4fd190f..0000000 --- a/.history/src/App_20231001135549.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135603.tsx b/.history/src/App_20231001135603.tsx deleted file mode 100644 index 639a723..0000000 --- a/.history/src/App_20231001135603.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135605.tsx b/.history/src/App_20231001135605.tsx deleted file mode 100644 index 3419a51..0000000 --- a/.history/src/App_20231001135605.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135608.tsx b/.history/src/App_20231001135608.tsx deleted file mode 100644 index dcb054d..0000000 --- a/.history/src/App_20231001135608.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135619.tsx b/.history/src/App_20231001135619.tsx deleted file mode 100644 index f43a4e1..0000000 --- a/.history/src/App_20231001135619.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135627.tsx b/.history/src/App_20231001135627.tsx deleted file mode 100644 index 9d09848..0000000 --- a/.history/src/App_20231001135627.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135632.tsx b/.history/src/App_20231001135632.tsx deleted file mode 100644 index ef5bc16..0000000 --- a/.history/src/App_20231001135632.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135638.tsx b/.history/src/App_20231001135638.tsx deleted file mode 100644 index c5478d8..0000000 --- a/.history/src/App_20231001135638.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135640.tsx b/.history/src/App_20231001135640.tsx deleted file mode 100644 index 3294d2a..0000000 --- a/.history/src/App_20231001135640.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135648.tsx b/.history/src/App_20231001135648.tsx deleted file mode 100644 index 9d09848..0000000 --- a/.history/src/App_20231001135648.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135651.tsx b/.history/src/App_20231001135651.tsx deleted file mode 100644 index 96813d6..0000000 --- a/.history/src/App_20231001135651.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135653.tsx b/.history/src/App_20231001135653.tsx deleted file mode 100644 index f086d41..0000000 --- a/.history/src/App_20231001135653.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135657.tsx b/.history/src/App_20231001135657.tsx deleted file mode 100644 index 28f9555..0000000 --- a/.history/src/App_20231001135657.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135704.tsx b/.history/src/App_20231001135704.tsx deleted file mode 100644 index bb91f83..0000000 --- a/.history/src/App_20231001135704.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135709.tsx b/.history/src/App_20231001135709.tsx deleted file mode 100644 index e3cf7e8..0000000 --- a/.history/src/App_20231001135709.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135714.tsx b/.history/src/App_20231001135714.tsx deleted file mode 100644 index 21ca530..0000000 --- a/.history/src/App_20231001135714.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135717.tsx b/.history/src/App_20231001135717.tsx deleted file mode 100644 index f086d41..0000000 --- a/.history/src/App_20231001135717.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135720.tsx b/.history/src/App_20231001135720.tsx deleted file mode 100644 index 6fec240..0000000 --- a/.history/src/App_20231001135720.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135724.tsx b/.history/src/App_20231001135724.tsx deleted file mode 100644 index 7995086..0000000 --- a/.history/src/App_20231001135724.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135732.tsx b/.history/src/App_20231001135732.tsx deleted file mode 100644 index 904190d..0000000 --- a/.history/src/App_20231001135732.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135736.tsx b/.history/src/App_20231001135736.tsx deleted file mode 100644 index dcb054d..0000000 --- a/.history/src/App_20231001135736.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135800.tsx b/.history/src/App_20231001135800.tsx deleted file mode 100644 index d216736..0000000 --- a/.history/src/App_20231001135800.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135801.tsx b/.history/src/App_20231001135801.tsx deleted file mode 100644 index 802abd0..0000000 --- a/.history/src/App_20231001135801.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135803.tsx b/.history/src/App_20231001135803.tsx deleted file mode 100644 index 2989c25..0000000 --- a/.history/src/App_20231001135803.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135809.tsx b/.history/src/App_20231001135809.tsx deleted file mode 100644 index bb8b8c2..0000000 --- a/.history/src/App_20231001135809.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135829.tsx b/.history/src/App_20231001135829.tsx deleted file mode 100644 index d6d3424..0000000 --- a/.history/src/App_20231001135829.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135835.tsx b/.history/src/App_20231001135835.tsx deleted file mode 100644 index cadf933..0000000 --- a/.history/src/App_20231001135835.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135858.tsx b/.history/src/App_20231001135858.tsx deleted file mode 100644 index 55b6ba7..0000000 --- a/.history/src/App_20231001135858.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for an.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135901.tsx b/.history/src/App_20231001135901.tsx deleted file mode 100644 index c08ad99..0000000 --- a/.history/src/App_20231001135901.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functional.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135902.tsx b/.history/src/App_20231001135902.tsx deleted file mode 100644 index 5c215f7..0000000 --- a/.history/src/App_20231001135902.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135931.tsx b/.history/src/App_20231001135931.tsx deleted file mode 100644 index d2263dc..0000000 --- a/.history/src/App_20231001135931.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140017.tsx b/.history/src/App_20231001140017.tsx deleted file mode 100644 index 565161a..0000000 --- a/.history/src/App_20231001140017.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140037.tsx b/.history/src/App_20231001140037.tsx deleted file mode 100644 index 8051168..0000000 --- a/.history/src/App_20231001140037.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140051.tsx b/.history/src/App_20231001140051.tsx deleted file mode 100644 index 5f27501..0000000 --- a/.history/src/App_20231001140051.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140112.tsx b/.history/src/App_20231001140112.tsx deleted file mode 100644 index 562804b..0000000 --- a/.history/src/App_20231001140112.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140124.tsx b/.history/src/App_20231001140124.tsx deleted file mode 100644 index d8819f6..0000000 --- a/.history/src/App_20231001140124.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140134.tsx b/.history/src/App_20231001140134.tsx deleted file mode 100644 index d389899..0000000 --- a/.history/src/App_20231001140134.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140147.tsx b/.history/src/App_20231001140147.tsx deleted file mode 100644 index df1a087..0000000 --- a/.history/src/App_20231001140147.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140219.tsx b/.history/src/App_20231001140219.tsx deleted file mode 100644 index 92e6018..0000000 --- a/.history/src/App_20231001140219.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140236.tsx b/.history/src/App_20231001140236.tsx deleted file mode 100644 index b806255..0000000 --- a/.history/src/App_20231001140236.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140326.tsx b/.history/src/App_20231001140326.tsx deleted file mode 100644 index 3799f19..0000000 --- a/.history/src/App_20231001140326.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140400.tsx b/.history/src/App_20231001140400.tsx deleted file mode 100644 index ad24776..0000000 --- a/.history/src/App_20231001140400.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140404.tsx b/.history/src/App_20231001140404.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140404.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140410.tsx b/.history/src/App_20231001140410.tsx deleted file mode 100644 index d624b7d..0000000 --- a/.history/src/App_20231001140410.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140413.tsx b/.history/src/App_20231001140413.tsx deleted file mode 100644 index 41489fd..0000000 --- a/.history/src/App_20231001140413.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140416.tsx b/.history/src/App_20231001140416.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140416.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140419.tsx b/.history/src/App_20231001140419.tsx deleted file mode 100644 index fcee569..0000000 --- a/.history/src/App_20231001140419.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140423.tsx b/.history/src/App_20231001140423.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140423.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140441.tsx b/.history/src/App_20231001140441.tsx deleted file mode 100644 index 119e7d0..0000000 --- a/.history/src/App_20231001140441.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140445.tsx b/.history/src/App_20231001140445.tsx deleted file mode 100644 index 187b95e..0000000 --- a/.history/src/App_20231001140445.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140447.tsx b/.history/src/App_20231001140447.tsx deleted file mode 100644 index c3437eb..0000000 --- a/.history/src/App_20231001140447.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140603.tsx b/.history/src/App_20231001140603.tsx deleted file mode 100644 index f13d7c4..0000000 --- a/.history/src/App_20231001140603.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140611.tsx b/.history/src/App_20231001140611.tsx deleted file mode 100644 index c3437eb..0000000 --- a/.history/src/App_20231001140611.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140612.tsx b/.history/src/App_20231001140612.tsx deleted file mode 100644 index 13b2a39..0000000 --- a/.history/src/App_20231001140612.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140633.tsx b/.history/src/App_20231001140633.tsx deleted file mode 100644 index 639ecfd..0000000 --- a/.history/src/App_20231001140633.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140645.tsx b/.history/src/App_20231001140645.tsx deleted file mode 100644 index 37cc961..0000000 --- a/.history/src/App_20231001140645.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140657.tsx b/.history/src/App_20231001140657.tsx deleted file mode 100644 index 13b2a39..0000000 --- a/.history/src/App_20231001140657.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140705.tsx b/.history/src/App_20231001140705.tsx deleted file mode 100644 index 4584c93..0000000 --- a/.history/src/App_20231001140705.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140721.tsx b/.history/src/App_20231001140721.tsx deleted file mode 100644 index 4584c93..0000000 --- a/.history/src/App_20231001140721.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140723.tsx b/.history/src/App_20231001140723.tsx deleted file mode 100644 index 7ffccb1..0000000 --- a/.history/src/App_20231001140723.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140735.tsx b/.history/src/App_20231001140735.tsx deleted file mode 100644 index d5b2c2b..0000000 --- a/.history/src/App_20231001140735.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear '.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140744.tsx b/.history/src/App_20231001140744.tsx deleted file mode 100644 index 6031975..0000000 --- a/.history/src/App_20231001140744.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the .

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140746.tsx b/.history/src/App_20231001140746.tsx deleted file mode 100644 index 21ff0fe..0000000 --- a/.history/src/App_20231001140746.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140755.tsx b/.history/src/App_20231001140755.tsx deleted file mode 100644 index 5a71bef..0000000 --- a/.history/src/App_20231001140755.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/index_20231001131835.css b/.history/src/index_20231001131835.css deleted file mode 100644 index 3dd1d24..0000000 --- a/.history/src/index_20231001131835.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #300a24; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134557.css b/.history/src/index_20231001134557.css deleted file mode 100644 index d7ec15d..0000000 --- a/.history/src/index_20231001134557.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #2b2529; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134601.css b/.history/src/index_20231001134601.css deleted file mode 100644 index 178c35c..0000000 --- a/.history/src/index_20231001134601.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #2b2429; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134608.css b/.history/src/index_20231001134608.css deleted file mode 100644 index dd46734..0000000 --- a/.history/src/index_20231001134608.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #332c31; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134611.css b/.history/src/index_20231001134611.css deleted file mode 100644 index a67e39f..0000000 --- a/.history/src/index_20231001134611.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242324; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001135943.css b/.history/src/index_20231001135943.css deleted file mode 100644 index dd46734..0000000 --- a/.history/src/index_20231001135943.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #332c31; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001135947.css b/.history/src/index_20231001135947.css deleted file mode 100644 index 3dd1d24..0000000 --- a/.history/src/index_20231001135947.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #300a24; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140011.css b/.history/src/index_20231001140011.css deleted file mode 100644 index 06e2b8a..0000000 --- a/.history/src/index_20231001140011.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140513.css b/.history/src/index_20231001140513.css deleted file mode 100644 index b51f619..0000000 --- a/.history/src/index_20231001140513.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 200; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140528.css b/.history/src/index_20231001140528.css deleted file mode 100644 index ac00e64..0000000 --- a/.history/src/index_20231001140528.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 00; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140529.css b/.history/src/index_20231001140529.css deleted file mode 100644 index fdb112d..0000000 --- a/.history/src/index_20231001140529.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 600; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140535.css b/.history/src/index_20231001140535.css deleted file mode 100644 index c054cdb..0000000 --- a/.history/src/index_20231001140535.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 800; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140542.css b/.history/src/index_20231001140542.css deleted file mode 100644 index 06e2b8a..0000000 --- a/.history/src/index_20231001140542.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; From 92a807531ab5aa417548addcf18a1491296115ec Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Mon, 2 Oct 2023 18:48:21 +0530 Subject: [PATCH 3/9] Removed Hover Effect and updated package.json and package-lock.json --- .gitignore | 1 + .history/package-lock_20231001134438.json | 3497 +++++++++++++++++++++ .history/package-lock_20231002184359.json | 3497 +++++++++++++++++++++ .history/package-lock_20231002184402.json | 3497 +++++++++++++++++++++ .history/package-lock_20231002184404.json | 3497 +++++++++++++++++++++ .history/package-lock_20231002184406.json | 3497 +++++++++++++++++++++ .history/package-lock_20231002184408.json | 3497 +++++++++++++++++++++ .history/package_20231001134133.json | 32 + .history/package_20231002184336.json | 32 + .history/package_20231002184338.json | 32 + .history/src/App_20231001131835.tsx | 159 + .history/src/App_20231001134627.tsx | 159 + .history/src/App_20231001134629.tsx | 159 + .history/src/App_20231001134636.tsx | 159 + .history/src/App_20231001134637.tsx | 159 + .history/src/App_20231001134651.tsx | 159 + .history/src/App_20231001134658.tsx | 159 + .history/src/App_20231001134702.tsx | 159 + .history/src/App_20231001134713.tsx | 159 + .history/src/App_20231001134725.tsx | 159 + .history/src/App_20231001134727.tsx | 159 + .history/src/App_20231001134729.tsx | 159 + .history/src/App_20231001134738.tsx | 159 + .history/src/App_20231001134744.tsx | 159 + .history/src/App_20231001134835.tsx | 160 + .history/src/App_20231001134839.tsx | 160 + .history/src/App_20231001134846.tsx | 161 + .history/src/App_20231001134847.tsx | 161 + .history/src/App_20231001134853.tsx | 162 + .history/src/App_20231001134855.tsx | 162 + .history/src/App_20231001134857.tsx | 162 + .history/src/App_20231001134906.tsx | 162 + .history/src/App_20231001134908.tsx | 162 + .history/src/App_20231001134909.tsx | 162 + .history/src/App_20231001134929.tsx | 162 + .history/src/App_20231001134932.tsx | 162 + .history/src/App_20231001134934.tsx | 162 + .history/src/App_20231001134943.tsx | 162 + .history/src/App_20231001134947.tsx | 162 + .history/src/App_20231001134949.tsx | 162 + .history/src/App_20231001134952.tsx | 162 + .history/src/App_20231001134954.tsx | 162 + .history/src/App_20231001134957.tsx | 162 + .history/src/App_20231001135000.tsx | 162 + .history/src/App_20231001135002.tsx | 162 + .history/src/App_20231001135003.tsx | 162 + .history/src/App_20231001135006.tsx | 162 + .history/src/App_20231001135013.tsx | 162 + .history/src/App_20231001135017.tsx | 162 + .history/src/App_20231001135020.tsx | 162 + .history/src/App_20231001135023.tsx | 162 + .history/src/App_20231001135037.tsx | 162 + .history/src/App_20231001135041.tsx | 162 + .history/src/App_20231001135050.tsx | 162 + .history/src/App_20231001135052.tsx | 162 + .history/src/App_20231001135054.tsx | 162 + .history/src/App_20231001135100.tsx | 162 + .history/src/App_20231001135113.tsx | 162 + .history/src/App_20231001135117.tsx | 162 + .history/src/App_20231001135121.tsx | 162 + .history/src/App_20231001135124.tsx | 162 + .history/src/App_20231001135131.tsx | 166 + .history/src/App_20231001135132.tsx | 162 + .history/src/App_20231001135137.tsx | 162 + .history/src/App_20231001135143.tsx | 162 + .history/src/App_20231001135144.tsx | 162 + .history/src/App_20231001135151.tsx | 162 + .history/src/App_20231001135153.tsx | 162 + .history/src/App_20231001135203.tsx | 162 + .history/src/App_20231001135207.tsx | 162 + .history/src/App_20231001135210.tsx | 162 + .history/src/App_20231001135223.tsx | 162 + .history/src/App_20231001135250.tsx | 162 + .history/src/App_20231001135313.tsx | 163 + .history/src/App_20231001135318.tsx | 163 + .history/src/App_20231001135319.tsx | 163 + .history/src/App_20231001135321.tsx | 163 + .history/src/App_20231001135326.tsx | 163 + .history/src/App_20231001135330.tsx | 163 + .history/src/App_20231001135332.tsx | 163 + .history/src/App_20231001135354.tsx | 163 + .history/src/App_20231001135409.tsx | 163 + .history/src/App_20231001135410.tsx | 163 + .history/src/App_20231001135414.tsx | 163 + .history/src/App_20231001135422.tsx | 163 + .history/src/App_20231001135436.tsx | 163 + .history/src/App_20231001135442.tsx | 163 + .history/src/App_20231001135451.tsx | 163 + .history/src/App_20231001135500.tsx | 163 + .history/src/App_20231001135505.tsx | 163 + .history/src/App_20231001135512.tsx | 163 + .history/src/App_20231001135521.tsx | 163 + .history/src/App_20231001135533.tsx | 163 + .history/src/App_20231001135549.tsx | 163 + .history/src/App_20231001135603.tsx | 163 + .history/src/App_20231001135605.tsx | 163 + .history/src/App_20231001135608.tsx | 163 + .history/src/App_20231001135619.tsx | 163 + .history/src/App_20231001135627.tsx | 163 + .history/src/App_20231001135632.tsx | 163 + .history/src/App_20231001135638.tsx | 163 + .history/src/App_20231001135640.tsx | 163 + .history/src/App_20231001135648.tsx | 163 + .history/src/App_20231001135651.tsx | 163 + .history/src/App_20231001135653.tsx | 163 + .history/src/App_20231001135657.tsx | 163 + .history/src/App_20231001135704.tsx | 163 + .history/src/App_20231001135709.tsx | 163 + .history/src/App_20231001135714.tsx | 163 + .history/src/App_20231001135717.tsx | 163 + .history/src/App_20231001135720.tsx | 163 + .history/src/App_20231001135724.tsx | 163 + .history/src/App_20231001135732.tsx | 163 + .history/src/App_20231001135736.tsx | 163 + .history/src/App_20231001135800.tsx | 163 + .history/src/App_20231001135801.tsx | 163 + .history/src/App_20231001135803.tsx | 163 + .history/src/App_20231001135809.tsx | 163 + .history/src/App_20231001135829.tsx | 163 + .history/src/App_20231001135835.tsx | 163 + .history/src/App_20231001135858.tsx | 163 + .history/src/App_20231001135901.tsx | 163 + .history/src/App_20231001135902.tsx | 163 + .history/src/App_20231001135931.tsx | 163 + .history/src/App_20231001140017.tsx | 163 + .history/src/App_20231001140037.tsx | 163 + .history/src/App_20231001140051.tsx | 163 + .history/src/App_20231001140112.tsx | 163 + .history/src/App_20231001140124.tsx | 163 + .history/src/App_20231001140134.tsx | 163 + .history/src/App_20231001140147.tsx | 163 + .history/src/App_20231001140219.tsx | 163 + .history/src/App_20231001140236.tsx | 163 + .history/src/App_20231001140326.tsx | 163 + .history/src/App_20231001140400.tsx | 163 + .history/src/App_20231001140404.tsx | 163 + .history/src/App_20231001140410.tsx | 163 + .history/src/App_20231001140413.tsx | 163 + .history/src/App_20231001140416.tsx | 163 + .history/src/App_20231001140419.tsx | 163 + .history/src/App_20231001140423.tsx | 163 + .history/src/App_20231001140441.tsx | 163 + .history/src/App_20231001140445.tsx | 163 + .history/src/App_20231001140447.tsx | 163 + .history/src/App_20231001140603.tsx | 163 + .history/src/App_20231001140611.tsx | 163 + .history/src/App_20231001140612.tsx | 163 + .history/src/App_20231001140633.tsx | 163 + .history/src/App_20231001140645.tsx | 163 + .history/src/App_20231001140657.tsx | 163 + .history/src/App_20231001140705.tsx | 163 + .history/src/App_20231001140721.tsx | 163 + .history/src/App_20231001140723.tsx | 164 + .history/src/App_20231001140735.tsx | 164 + .history/src/App_20231001140744.tsx | 164 + .history/src/App_20231001140746.tsx | 164 + .history/src/App_20231001140755.tsx | 164 + .history/src/App_20231002184302.tsx | 164 + .history/src/App_20231002184303.tsx | 164 + .history/src/index_20231001131835.css | 25 + .history/src/index_20231001134557.css | 25 + .history/src/index_20231001134601.css | 25 + .history/src/index_20231001134608.css | 25 + .history/src/index_20231001134611.css | 25 + .history/src/index_20231001135943.css | 25 + .history/src/index_20231001135947.css | 25 + .history/src/index_20231001140011.css | 25 + .history/src/index_20231001140513.css | 25 + .history/src/index_20231001140528.css | 25 + .history/src/index_20231001140529.css | 25 + .history/src/index_20231001140535.css | 25 + .history/src/index_20231001140542.css | 25 + package-lock.json | 2 +- package.json | 2 +- src/App.tsx | 2 +- 175 files changed, 45594 insertions(+), 3 deletions(-) create mode 100644 .history/package-lock_20231001134438.json create mode 100644 .history/package-lock_20231002184359.json create mode 100644 .history/package-lock_20231002184402.json create mode 100644 .history/package-lock_20231002184404.json create mode 100644 .history/package-lock_20231002184406.json create mode 100644 .history/package-lock_20231002184408.json create mode 100644 .history/package_20231001134133.json create mode 100644 .history/package_20231002184336.json create mode 100644 .history/package_20231002184338.json create mode 100644 .history/src/App_20231001131835.tsx create mode 100644 .history/src/App_20231001134627.tsx create mode 100644 .history/src/App_20231001134629.tsx create mode 100644 .history/src/App_20231001134636.tsx create mode 100644 .history/src/App_20231001134637.tsx create mode 100644 .history/src/App_20231001134651.tsx create mode 100644 .history/src/App_20231001134658.tsx create mode 100644 .history/src/App_20231001134702.tsx create mode 100644 .history/src/App_20231001134713.tsx create mode 100644 .history/src/App_20231001134725.tsx create mode 100644 .history/src/App_20231001134727.tsx create mode 100644 .history/src/App_20231001134729.tsx create mode 100644 .history/src/App_20231001134738.tsx create mode 100644 .history/src/App_20231001134744.tsx create mode 100644 .history/src/App_20231001134835.tsx create mode 100644 .history/src/App_20231001134839.tsx create mode 100644 .history/src/App_20231001134846.tsx create mode 100644 .history/src/App_20231001134847.tsx create mode 100644 .history/src/App_20231001134853.tsx create mode 100644 .history/src/App_20231001134855.tsx create mode 100644 .history/src/App_20231001134857.tsx create mode 100644 .history/src/App_20231001134906.tsx create mode 100644 .history/src/App_20231001134908.tsx create mode 100644 .history/src/App_20231001134909.tsx create mode 100644 .history/src/App_20231001134929.tsx create mode 100644 .history/src/App_20231001134932.tsx create mode 100644 .history/src/App_20231001134934.tsx create mode 100644 .history/src/App_20231001134943.tsx create mode 100644 .history/src/App_20231001134947.tsx create mode 100644 .history/src/App_20231001134949.tsx create mode 100644 .history/src/App_20231001134952.tsx create mode 100644 .history/src/App_20231001134954.tsx create mode 100644 .history/src/App_20231001134957.tsx create mode 100644 .history/src/App_20231001135000.tsx create mode 100644 .history/src/App_20231001135002.tsx create mode 100644 .history/src/App_20231001135003.tsx create mode 100644 .history/src/App_20231001135006.tsx create mode 100644 .history/src/App_20231001135013.tsx create mode 100644 .history/src/App_20231001135017.tsx create mode 100644 .history/src/App_20231001135020.tsx create mode 100644 .history/src/App_20231001135023.tsx create mode 100644 .history/src/App_20231001135037.tsx create mode 100644 .history/src/App_20231001135041.tsx create mode 100644 .history/src/App_20231001135050.tsx create mode 100644 .history/src/App_20231001135052.tsx create mode 100644 .history/src/App_20231001135054.tsx create mode 100644 .history/src/App_20231001135100.tsx create mode 100644 .history/src/App_20231001135113.tsx create mode 100644 .history/src/App_20231001135117.tsx create mode 100644 .history/src/App_20231001135121.tsx create mode 100644 .history/src/App_20231001135124.tsx create mode 100644 .history/src/App_20231001135131.tsx create mode 100644 .history/src/App_20231001135132.tsx create mode 100644 .history/src/App_20231001135137.tsx create mode 100644 .history/src/App_20231001135143.tsx create mode 100644 .history/src/App_20231001135144.tsx create mode 100644 .history/src/App_20231001135151.tsx create mode 100644 .history/src/App_20231001135153.tsx create mode 100644 .history/src/App_20231001135203.tsx create mode 100644 .history/src/App_20231001135207.tsx create mode 100644 .history/src/App_20231001135210.tsx create mode 100644 .history/src/App_20231001135223.tsx create mode 100644 .history/src/App_20231001135250.tsx create mode 100644 .history/src/App_20231001135313.tsx create mode 100644 .history/src/App_20231001135318.tsx create mode 100644 .history/src/App_20231001135319.tsx create mode 100644 .history/src/App_20231001135321.tsx create mode 100644 .history/src/App_20231001135326.tsx create mode 100644 .history/src/App_20231001135330.tsx create mode 100644 .history/src/App_20231001135332.tsx create mode 100644 .history/src/App_20231001135354.tsx create mode 100644 .history/src/App_20231001135409.tsx create mode 100644 .history/src/App_20231001135410.tsx create mode 100644 .history/src/App_20231001135414.tsx create mode 100644 .history/src/App_20231001135422.tsx create mode 100644 .history/src/App_20231001135436.tsx create mode 100644 .history/src/App_20231001135442.tsx create mode 100644 .history/src/App_20231001135451.tsx create mode 100644 .history/src/App_20231001135500.tsx create mode 100644 .history/src/App_20231001135505.tsx create mode 100644 .history/src/App_20231001135512.tsx create mode 100644 .history/src/App_20231001135521.tsx create mode 100644 .history/src/App_20231001135533.tsx create mode 100644 .history/src/App_20231001135549.tsx create mode 100644 .history/src/App_20231001135603.tsx create mode 100644 .history/src/App_20231001135605.tsx create mode 100644 .history/src/App_20231001135608.tsx create mode 100644 .history/src/App_20231001135619.tsx create mode 100644 .history/src/App_20231001135627.tsx create mode 100644 .history/src/App_20231001135632.tsx create mode 100644 .history/src/App_20231001135638.tsx create mode 100644 .history/src/App_20231001135640.tsx create mode 100644 .history/src/App_20231001135648.tsx create mode 100644 .history/src/App_20231001135651.tsx create mode 100644 .history/src/App_20231001135653.tsx create mode 100644 .history/src/App_20231001135657.tsx create mode 100644 .history/src/App_20231001135704.tsx create mode 100644 .history/src/App_20231001135709.tsx create mode 100644 .history/src/App_20231001135714.tsx create mode 100644 .history/src/App_20231001135717.tsx create mode 100644 .history/src/App_20231001135720.tsx create mode 100644 .history/src/App_20231001135724.tsx create mode 100644 .history/src/App_20231001135732.tsx create mode 100644 .history/src/App_20231001135736.tsx create mode 100644 .history/src/App_20231001135800.tsx create mode 100644 .history/src/App_20231001135801.tsx create mode 100644 .history/src/App_20231001135803.tsx create mode 100644 .history/src/App_20231001135809.tsx create mode 100644 .history/src/App_20231001135829.tsx create mode 100644 .history/src/App_20231001135835.tsx create mode 100644 .history/src/App_20231001135858.tsx create mode 100644 .history/src/App_20231001135901.tsx create mode 100644 .history/src/App_20231001135902.tsx create mode 100644 .history/src/App_20231001135931.tsx create mode 100644 .history/src/App_20231001140017.tsx create mode 100644 .history/src/App_20231001140037.tsx create mode 100644 .history/src/App_20231001140051.tsx create mode 100644 .history/src/App_20231001140112.tsx create mode 100644 .history/src/App_20231001140124.tsx create mode 100644 .history/src/App_20231001140134.tsx create mode 100644 .history/src/App_20231001140147.tsx create mode 100644 .history/src/App_20231001140219.tsx create mode 100644 .history/src/App_20231001140236.tsx create mode 100644 .history/src/App_20231001140326.tsx create mode 100644 .history/src/App_20231001140400.tsx create mode 100644 .history/src/App_20231001140404.tsx create mode 100644 .history/src/App_20231001140410.tsx create mode 100644 .history/src/App_20231001140413.tsx create mode 100644 .history/src/App_20231001140416.tsx create mode 100644 .history/src/App_20231001140419.tsx create mode 100644 .history/src/App_20231001140423.tsx create mode 100644 .history/src/App_20231001140441.tsx create mode 100644 .history/src/App_20231001140445.tsx create mode 100644 .history/src/App_20231001140447.tsx create mode 100644 .history/src/App_20231001140603.tsx create mode 100644 .history/src/App_20231001140611.tsx create mode 100644 .history/src/App_20231001140612.tsx create mode 100644 .history/src/App_20231001140633.tsx create mode 100644 .history/src/App_20231001140645.tsx create mode 100644 .history/src/App_20231001140657.tsx create mode 100644 .history/src/App_20231001140705.tsx create mode 100644 .history/src/App_20231001140721.tsx create mode 100644 .history/src/App_20231001140723.tsx create mode 100644 .history/src/App_20231001140735.tsx create mode 100644 .history/src/App_20231001140744.tsx create mode 100644 .history/src/App_20231001140746.tsx create mode 100644 .history/src/App_20231001140755.tsx create mode 100644 .history/src/App_20231002184302.tsx create mode 100644 .history/src/App_20231002184303.tsx create mode 100644 .history/src/index_20231001131835.css create mode 100644 .history/src/index_20231001134557.css create mode 100644 .history/src/index_20231001134601.css create mode 100644 .history/src/index_20231001134608.css create mode 100644 .history/src/index_20231001134611.css create mode 100644 .history/src/index_20231001135943.css create mode 100644 .history/src/index_20231001135947.css create mode 100644 .history/src/index_20231001140011.css create mode 100644 .history/src/index_20231001140513.css create mode 100644 .history/src/index_20231001140528.css create mode 100644 .history/src/index_20231001140529.css create mode 100644 .history/src/index_20231001140535.css create mode 100644 .history/src/index_20231001140542.css diff --git a/.gitignore b/.gitignore index a547bf3..9a14c5e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +/. history diff --git a/.history/package-lock_20231001134438.json b/.history/package-lock_20231001134438.json new file mode 100644 index 0000000..e8d0098 --- /dev/null +++ b/.history/package-lock_20231001134438.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.2.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package-lock_20231002184359.json b/.history/package-lock_20231002184359.json new file mode 100644 index 0000000..3d5d392 --- /dev/null +++ b/.history/package-lock_20231002184359.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + Replace the line with "typescript": "^5.0.2",, + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package-lock_20231002184402.json b/.history/package-lock_20231002184402.json new file mode 100644 index 0000000..e8d0098 --- /dev/null +++ b/.history/package-lock_20231002184402.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.2.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package-lock_20231002184404.json b/.history/package-lock_20231002184404.json new file mode 100644 index 0000000..05eee64 --- /dev/null +++ b/.history/package-lock_20231002184404.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + Replace the line with "typescript": "^5.0.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package-lock_20231002184406.json b/.history/package-lock_20231002184406.json new file mode 100644 index 0000000..68b9c1e --- /dev/null +++ b/.history/package-lock_20231002184406.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package-lock_20231002184408.json b/.history/package-lock_20231002184408.json new file mode 100644 index 0000000..68b9c1e --- /dev/null +++ b/.history/package-lock_20231002184408.json @@ -0,0 +1,3497 @@ +{ + "name": "terminal-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "terminal-portfolio", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/.history/package_20231001134133.json b/.history/package_20231001134133.json new file mode 100644 index 0000000..c935887 --- /dev/null +++ b/.history/package_20231001134133.json @@ -0,0 +1,32 @@ +{ + "name": "terminal-portfolio", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.2.2", + "vite": "^4.4.5" + } +} diff --git a/.history/package_20231002184336.json b/.history/package_20231002184336.json new file mode 100644 index 0000000..72f1053 --- /dev/null +++ b/.history/package_20231002184336.json @@ -0,0 +1,32 @@ +{ + "name": "terminal-portfolio", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.0.2" + "vite": "^4.4.5" + } +} diff --git a/.history/package_20231002184338.json b/.history/package_20231002184338.json new file mode 100644 index 0000000..86495f3 --- /dev/null +++ b/.history/package_20231002184338.json @@ -0,0 +1,32 @@ +{ + "name": "terminal-portfolio", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@vercel/analytics": "^1.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "autoprefixer": "^10.4.16", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "postcss": "^8.4.30", + "tailwindcss": "^3.3.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/.history/src/App_20231001131835.tsx b/.history/src/App_20231001131835.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001131835.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134627.tsx b/.history/src/App_20231001134627.tsx new file mode 100644 index 0000000..efaa4b0 --- /dev/null +++ b/.history/src/App_20231001134627.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134629.tsx b/.history/src/App_20231001134629.tsx new file mode 100644 index 0000000..0a70d71 --- /dev/null +++ b/.history/src/App_20231001134629.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134636.tsx b/.history/src/App_20231001134636.tsx new file mode 100644 index 0000000..f5ff92d --- /dev/null +++ b/.history/src/App_20231001134636.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134637.tsx b/.history/src/App_20231001134637.tsx new file mode 100644 index 0000000..4eb5401 --- /dev/null +++ b/.history/src/App_20231001134637.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134651.tsx b/.history/src/App_20231001134651.tsx new file mode 100644 index 0000000..c8620b4 --- /dev/null +++ b/.history/src/App_20231001134651.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134658.tsx b/.history/src/App_20231001134658.tsx new file mode 100644 index 0000000..f6ef193 --- /dev/null +++ b/.history/src/App_20231001134658.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134702.tsx b/.history/src/App_20231001134702.tsx new file mode 100644 index 0000000..4eb5401 --- /dev/null +++ b/.history/src/App_20231001134702.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134713.tsx b/.history/src/App_20231001134713.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001134713.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134725.tsx b/.history/src/App_20231001134725.tsx new file mode 100644 index 0000000..8caf5e2 --- /dev/null +++ b/.history/src/App_20231001134725.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134727.tsx b/.history/src/App_20231001134727.tsx new file mode 100644 index 0000000..4935ed0 --- /dev/null +++ b/.history/src/App_20231001134727.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134729.tsx b/.history/src/App_20231001134729.tsx new file mode 100644 index 0000000..07288ff --- /dev/null +++ b/.history/src/App_20231001134729.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134738.tsx b/.history/src/App_20231001134738.tsx new file mode 100644 index 0000000..878a1fc --- /dev/null +++ b/.history/src/App_20231001134738.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134744.tsx b/.history/src/App_20231001134744.tsx new file mode 100644 index 0000000..26c9776 --- /dev/null +++ b/.history/src/App_20231001134744.tsx @@ -0,0 +1,159 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134835.tsx b/.history/src/App_20231001134835.tsx new file mode 100644 index 0000000..a50e6e9 --- /dev/null +++ b/.history/src/App_20231001134835.tsx @@ -0,0 +1,160 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( + +
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134839.tsx b/.history/src/App_20231001134839.tsx new file mode 100644 index 0000000..063bab2 --- /dev/null +++ b/.history/src/App_20231001134839.tsx @@ -0,0 +1,160 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134846.tsx b/.history/src/App_20231001134846.tsx new file mode 100644 index 0000000..0e3e1a2 --- /dev/null +++ b/.history/src/App_20231001134846.tsx @@ -0,0 +1,161 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+ { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134847.tsx b/.history/src/App_20231001134847.tsx new file mode 100644 index 0000000..0444a73 --- /dev/null +++ b/.history/src/App_20231001134847.tsx @@ -0,0 +1,161 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134853.tsx b/.history/src/App_20231001134853.tsx new file mode 100644 index 0000000..4a76e56 --- /dev/null +++ b/.history/src/App_20231001134853.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

+ { + /* History */ + history.map((history) => ( +

+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134855.tsx b/.history/src/App_20231001134855.tsx new file mode 100644 index 0000000..4a76e56 --- /dev/null +++ b/.history/src/App_20231001134855.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

+ { + /* History */ + history.map((history) => ( +

+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134857.tsx b/.history/src/App_20231001134857.tsx new file mode 100644 index 0000000..b5380d4 --- /dev/null +++ b/.history/src/App_20231001134857.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134906.tsx b/.history/src/App_20231001134906.tsx new file mode 100644 index 0000000..b3246e3 --- /dev/null +++ b/.history/src/App_20231001134906.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134908.tsx b/.history/src/App_20231001134908.tsx new file mode 100644 index 0000000..e48ddd4 --- /dev/null +++ b/.history/src/App_20231001134908.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134909.tsx b/.history/src/App_20231001134909.tsx new file mode 100644 index 0000000..ca817f8 --- /dev/null +++ b/.history/src/App_20231001134909.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134929.tsx b/.history/src/App_20231001134929.tsx new file mode 100644 index 0000000..19122b3 --- /dev/null +++ b/.history/src/App_20231001134929.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134932.tsx b/.history/src/App_20231001134932.tsx new file mode 100644 index 0000000..56e5333 --- /dev/null +++ b/.history/src/App_20231001134932.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134934.tsx b/.history/src/App_20231001134934.tsx new file mode 100644 index 0000000..857521c --- /dev/null +++ b/.history/src/App_20231001134934.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134943.tsx b/.history/src/App_20231001134943.tsx new file mode 100644 index 0000000..9accda2 --- /dev/null +++ b/.history/src/App_20231001134943.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134947.tsx b/.history/src/App_20231001134947.tsx new file mode 100644 index 0000000..2308941 --- /dev/null +++ b/.history/src/App_20231001134947.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134949.tsx b/.history/src/App_20231001134949.tsx new file mode 100644 index 0000000..5af9875 --- /dev/null +++ b/.history/src/App_20231001134949.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134952.tsx b/.history/src/App_20231001134952.tsx new file mode 100644 index 0000000..1c853e6 --- /dev/null +++ b/.history/src/App_20231001134952.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134954.tsx b/.history/src/App_20231001134954.tsx new file mode 100644 index 0000000..ddcca97 --- /dev/null +++ b/.history/src/App_20231001134954.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001134957.tsx b/.history/src/App_20231001134957.tsx new file mode 100644 index 0000000..e59fdd0 --- /dev/null +++ b/.history/src/App_20231001134957.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135000.tsx b/.history/src/App_20231001135000.tsx new file mode 100644 index 0000000..2d7781a --- /dev/null +++ b/.history/src/App_20231001135000.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135002.tsx b/.history/src/App_20231001135002.tsx new file mode 100644 index 0000000..2e31c7a --- /dev/null +++ b/.history/src/App_20231001135002.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135003.tsx b/.history/src/App_20231001135003.tsx new file mode 100644 index 0000000..9debdc1 --- /dev/null +++ b/.history/src/App_20231001135003.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135006.tsx b/.history/src/App_20231001135006.tsx new file mode 100644 index 0000000..d86b6a5 --- /dev/null +++ b/.history/src/App_20231001135006.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135013.tsx b/.history/src/App_20231001135013.tsx new file mode 100644 index 0000000..9debdc1 --- /dev/null +++ b/.history/src/App_20231001135013.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135017.tsx b/.history/src/App_20231001135017.tsx new file mode 100644 index 0000000..22fc7b5 --- /dev/null +++ b/.history/src/App_20231001135017.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135020.tsx b/.history/src/App_20231001135020.tsx new file mode 100644 index 0000000..6d8fbf3 --- /dev/null +++ b/.history/src/App_20231001135020.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135023.tsx b/.history/src/App_20231001135023.tsx new file mode 100644 index 0000000..7272fa2 --- /dev/null +++ b/.history/src/App_20231001135023.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135037.tsx b/.history/src/App_20231001135037.tsx new file mode 100644 index 0000000..fab6f90 --- /dev/null +++ b/.history/src/App_20231001135037.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135041.tsx b/.history/src/App_20231001135041.tsx new file mode 100644 index 0000000..ced7c33 --- /dev/null +++ b/.history/src/App_20231001135041.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135050.tsx b/.history/src/App_20231001135050.tsx new file mode 100644 index 0000000..981a57b --- /dev/null +++ b/.history/src/App_20231001135050.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135052.tsx b/.history/src/App_20231001135052.tsx new file mode 100644 index 0000000..e63cc8d --- /dev/null +++ b/.history/src/App_20231001135052.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135054.tsx b/.history/src/App_20231001135054.tsx new file mode 100644 index 0000000..3d51d9d --- /dev/null +++ b/.history/src/App_20231001135054.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135100.tsx b/.history/src/App_20231001135100.tsx new file mode 100644 index 0000000..2e98ede --- /dev/null +++ b/.history/src/App_20231001135100.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135113.tsx b/.history/src/App_20231001135113.tsx new file mode 100644 index 0000000..5e04509 --- /dev/null +++ b/.history/src/App_20231001135113.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135117.tsx b/.history/src/App_20231001135117.tsx new file mode 100644 index 0000000..2e98ede --- /dev/null +++ b/.history/src/App_20231001135117.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135121.tsx b/.history/src/App_20231001135121.tsx new file mode 100644 index 0000000..7b644ef --- /dev/null +++ b/.history/src/App_20231001135121.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135124.tsx b/.history/src/App_20231001135124.tsx new file mode 100644 index 0000000..d59f649 --- /dev/null +++ b/.history/src/App_20231001135124.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135131.tsx b/.history/src/App_20231001135131.tsx new file mode 100644 index 0000000..cb5c4a1 --- /dev/null +++ b/.history/src/App_20231001135131.tsx @@ -0,0 +1,166 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135132.tsx b/.history/src/App_20231001135132.tsx new file mode 100644 index 0000000..a00d851 --- /dev/null +++ b/.history/src/App_20231001135132.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135137.tsx b/.history/src/App_20231001135137.tsx new file mode 100644 index 0000000..a79ba58 --- /dev/null +++ b/.history/src/App_20231001135137.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135143.tsx b/.history/src/App_20231001135143.tsx new file mode 100644 index 0000000..d768e53 --- /dev/null +++ b/.history/src/App_20231001135143.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135144.tsx b/.history/src/App_20231001135144.tsx new file mode 100644 index 0000000..d4afa53 --- /dev/null +++ b/.history/src/App_20231001135144.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135151.tsx b/.history/src/App_20231001135151.tsx new file mode 100644 index 0000000..5bf0d63 --- /dev/null +++ b/.history/src/App_20231001135151.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135153.tsx b/.history/src/App_20231001135153.tsx new file mode 100644 index 0000000..b32b0fe --- /dev/null +++ b/.history/src/App_20231001135153.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135203.tsx b/.history/src/App_20231001135203.tsx new file mode 100644 index 0000000..56199cb --- /dev/null +++ b/.history/src/App_20231001135203.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135207.tsx b/.history/src/App_20231001135207.tsx new file mode 100644 index 0000000..2342ded --- /dev/null +++ b/.history/src/App_20231001135207.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135223.tsx b/.history/src/App_20231001135223.tsx new file mode 100644 index 0000000..506d82e --- /dev/null +++ b/.history/src/App_20231001135223.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135250.tsx b/.history/src/App_20231001135250.tsx new file mode 100644 index 0000000..c59d7cb --- /dev/null +++ b/.history/src/App_20231001135250.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135313.tsx b/.history/src/App_20231001135313.tsx new file mode 100644 index 0000000..cc7d5d7 --- /dev/null +++ b/.history/src/App_20231001135313.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Welcome to my portfolio!

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135318.tsx b/.history/src/App_20231001135318.tsx new file mode 100644 index 0000000..c84d7bc --- /dev/null +++ b/.history/src/App_20231001135318.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instruc

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135319.tsx b/.history/src/App_20231001135319.tsx new file mode 100644 index 0000000..1e3745e --- /dev/null +++ b/.history/src/App_20231001135319.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135321.tsx b/.history/src/App_20231001135321.tsx new file mode 100644 index 0000000..c017d39 --- /dev/null +++ b/.history/src/App_20231001135321.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions ->

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135326.tsx b/.history/src/App_20231001135326.tsx new file mode 100644 index 0000000..c78457b --- /dev/null +++ b/.history/src/App_20231001135326.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions --> Y

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135330.tsx b/.history/src/App_20231001135330.tsx new file mode 100644 index 0000000..a90931f --- /dev/null +++ b/.history/src/App_20231001135330.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions -

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135332.tsx b/.history/src/App_20231001135332.tsx new file mode 100644 index 0000000..03f7d81 --- /dev/null +++ b/.history/src/App_20231001135332.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - You

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135354.tsx b/.history/src/App_20231001135354.tsx new file mode 100644 index 0000000..81a5bc2 --- /dev/null +++ b/.history/src/App_20231001135354.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135409.tsx b/.history/src/App_20231001135409.tsx new file mode 100644 index 0000000..aa3ab0d --- /dev/null +++ b/.history/src/App_20231001135409.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You need

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135410.tsx b/.history/src/App_20231001135410.tsx new file mode 100644 index 0000000..4ad0f07 --- /dev/null +++ b/.history/src/App_20231001135410.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You need to

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135414.tsx b/.history/src/App_20231001135414.tsx new file mode 100644 index 0000000..81a5bc2 --- /dev/null +++ b/.history/src/App_20231001135414.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135422.tsx b/.history/src/App_20231001135422.tsx new file mode 100644 index 0000000..4dc7397 --- /dev/null +++ b/.history/src/App_20231001135422.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135436.tsx b/.history/src/App_20231001135436.tsx new file mode 100644 index 0000000..d5fe94b --- /dev/null +++ b/.history/src/App_20231001135436.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135442.tsx b/.history/src/App_20231001135442.tsx new file mode 100644 index 0000000..7d94392 --- /dev/null +++ b/.history/src/App_20231001135442.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135451.tsx b/.history/src/App_20231001135451.tsx new file mode 100644 index 0000000..87ed32b --- /dev/null +++ b/.history/src/App_20231001135451.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135500.tsx b/.history/src/App_20231001135500.tsx new file mode 100644 index 0000000..75dc8d6 --- /dev/null +++ b/.history/src/App_20231001135500.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135505.tsx b/.history/src/App_20231001135505.tsx new file mode 100644 index 0000000..64af407 --- /dev/null +++ b/.history/src/App_20231001135505.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135512.tsx b/.history/src/App_20231001135512.tsx new file mode 100644 index 0000000..db8ecaf --- /dev/null +++ b/.history/src/App_20231001135512.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135521.tsx b/.history/src/App_20231001135521.tsx new file mode 100644 index 0000000..c8458b2 --- /dev/null +++ b/.history/src/App_20231001135521.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135533.tsx b/.history/src/App_20231001135533.tsx new file mode 100644 index 0000000..ee8f849 --- /dev/null +++ b/.history/src/App_20231001135533.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135549.tsx b/.history/src/App_20231001135549.tsx new file mode 100644 index 0000000..4fd190f --- /dev/null +++ b/.history/src/App_20231001135549.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135603.tsx b/.history/src/App_20231001135603.tsx new file mode 100644 index 0000000..639a723 --- /dev/null +++ b/.history/src/App_20231001135603.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135605.tsx b/.history/src/App_20231001135605.tsx new file mode 100644 index 0000000..3419a51 --- /dev/null +++ b/.history/src/App_20231001135605.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135608.tsx b/.history/src/App_20231001135608.tsx new file mode 100644 index 0000000..dcb054d --- /dev/null +++ b/.history/src/App_20231001135608.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135619.tsx b/.history/src/App_20231001135619.tsx new file mode 100644 index 0000000..f43a4e1 --- /dev/null +++ b/.history/src/App_20231001135619.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135627.tsx b/.history/src/App_20231001135627.tsx new file mode 100644 index 0000000..9d09848 --- /dev/null +++ b/.history/src/App_20231001135627.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135632.tsx b/.history/src/App_20231001135632.tsx new file mode 100644 index 0000000..ef5bc16 --- /dev/null +++ b/.history/src/App_20231001135632.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135638.tsx b/.history/src/App_20231001135638.tsx new file mode 100644 index 0000000..c5478d8 --- /dev/null +++ b/.history/src/App_20231001135638.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135640.tsx b/.history/src/App_20231001135640.tsx new file mode 100644 index 0000000..3294d2a --- /dev/null +++ b/.history/src/App_20231001135640.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135648.tsx b/.history/src/App_20231001135648.tsx new file mode 100644 index 0000000..9d09848 --- /dev/null +++ b/.history/src/App_20231001135648.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135651.tsx b/.history/src/App_20231001135651.tsx new file mode 100644 index 0000000..96813d6 --- /dev/null +++ b/.history/src/App_20231001135651.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135653.tsx b/.history/src/App_20231001135653.tsx new file mode 100644 index 0000000..f086d41 --- /dev/null +++ b/.history/src/App_20231001135653.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135657.tsx b/.history/src/App_20231001135657.tsx new file mode 100644 index 0000000..28f9555 --- /dev/null +++ b/.history/src/App_20231001135657.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135704.tsx b/.history/src/App_20231001135704.tsx new file mode 100644 index 0000000..bb91f83 --- /dev/null +++ b/.history/src/App_20231001135704.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135709.tsx b/.history/src/App_20231001135709.tsx new file mode 100644 index 0000000..e3cf7e8 --- /dev/null +++ b/.history/src/App_20231001135709.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135714.tsx b/.history/src/App_20231001135714.tsx new file mode 100644 index 0000000..21ca530 --- /dev/null +++ b/.history/src/App_20231001135714.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135717.tsx b/.history/src/App_20231001135717.tsx new file mode 100644 index 0000000..f086d41 --- /dev/null +++ b/.history/src/App_20231001135717.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135720.tsx b/.history/src/App_20231001135720.tsx new file mode 100644 index 0000000..6fec240 --- /dev/null +++ b/.history/src/App_20231001135720.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135724.tsx b/.history/src/App_20231001135724.tsx new file mode 100644 index 0000000..7995086 --- /dev/null +++ b/.history/src/App_20231001135724.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135732.tsx b/.history/src/App_20231001135732.tsx new file mode 100644 index 0000000..904190d --- /dev/null +++ b/.history/src/App_20231001135732.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135736.tsx b/.history/src/App_20231001135736.tsx new file mode 100644 index 0000000..dcb054d --- /dev/null +++ b/.history/src/App_20231001135736.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135800.tsx b/.history/src/App_20231001135800.tsx new file mode 100644 index 0000000..d216736 --- /dev/null +++ b/.history/src/App_20231001135800.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135801.tsx b/.history/src/App_20231001135801.tsx new file mode 100644 index 0000000..802abd0 --- /dev/null +++ b/.history/src/App_20231001135801.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135803.tsx b/.history/src/App_20231001135803.tsx new file mode 100644 index 0000000..2989c25 --- /dev/null +++ b/.history/src/App_20231001135803.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135809.tsx b/.history/src/App_20231001135809.tsx new file mode 100644 index 0000000..bb8b8c2 --- /dev/null +++ b/.history/src/App_20231001135809.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135829.tsx b/.history/src/App_20231001135829.tsx new file mode 100644 index 0000000..d6d3424 --- /dev/null +++ b/.history/src/App_20231001135829.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135835.tsx b/.history/src/App_20231001135835.tsx new file mode 100644 index 0000000..cadf933 --- /dev/null +++ b/.history/src/App_20231001135835.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You can use it like your local terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135858.tsx b/.history/src/App_20231001135858.tsx new file mode 100644 index 0000000..55b6ba7 --- /dev/null +++ b/.history/src/App_20231001135858.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for an.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135901.tsx b/.history/src/App_20231001135901.tsx new file mode 100644 index 0000000..c08ad99 --- /dev/null +++ b/.history/src/App_20231001135901.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functional.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135902.tsx b/.history/src/App_20231001135902.tsx new file mode 100644 index 0000000..5c215f7 --- /dev/null +++ b/.history/src/App_20231001135902.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001135931.tsx b/.history/src/App_20231001135931.tsx new file mode 100644 index 0000000..d2263dc --- /dev/null +++ b/.history/src/App_20231001135931.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140017.tsx b/.history/src/App_20231001140017.tsx new file mode 100644 index 0000000..565161a --- /dev/null +++ b/.history/src/App_20231001140017.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140037.tsx b/.history/src/App_20231001140037.tsx new file mode 100644 index 0000000..8051168 --- /dev/null +++ b/.history/src/App_20231001140037.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140051.tsx b/.history/src/App_20231001140051.tsx new file mode 100644 index 0000000..5f27501 --- /dev/null +++ b/.history/src/App_20231001140051.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140112.tsx b/.history/src/App_20231001140112.tsx new file mode 100644 index 0000000..562804b --- /dev/null +++ b/.history/src/App_20231001140112.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140124.tsx b/.history/src/App_20231001140124.tsx new file mode 100644 index 0000000..d8819f6 --- /dev/null +++ b/.history/src/App_20231001140124.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140134.tsx b/.history/src/App_20231001140134.tsx new file mode 100644 index 0000000..d389899 --- /dev/null +++ b/.history/src/App_20231001140134.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140147.tsx b/.history/src/App_20231001140147.tsx new file mode 100644 index 0000000..df1a087 --- /dev/null +++ b/.history/src/App_20231001140147.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140219.tsx b/.history/src/App_20231001140219.tsx new file mode 100644 index 0000000..92e6018 --- /dev/null +++ b/.history/src/App_20231001140219.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140236.tsx b/.history/src/App_20231001140236.tsx new file mode 100644 index 0000000..b806255 --- /dev/null +++ b/.history/src/App_20231001140236.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140326.tsx b/.history/src/App_20231001140326.tsx new file mode 100644 index 0000000..3799f19 --- /dev/null +++ b/.history/src/App_20231001140326.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140400.tsx b/.history/src/App_20231001140400.tsx new file mode 100644 index 0000000..ad24776 --- /dev/null +++ b/.history/src/App_20231001140400.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140404.tsx b/.history/src/App_20231001140404.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140404.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140410.tsx b/.history/src/App_20231001140410.tsx new file mode 100644 index 0000000..d624b7d --- /dev/null +++ b/.history/src/App_20231001140410.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140413.tsx b/.history/src/App_20231001140413.tsx new file mode 100644 index 0000000..41489fd --- /dev/null +++ b/.history/src/App_20231001140413.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140416.tsx b/.history/src/App_20231001140416.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140416.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140419.tsx b/.history/src/App_20231001140419.tsx new file mode 100644 index 0000000..fcee569 --- /dev/null +++ b/.history/src/App_20231001140419.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140423.tsx b/.history/src/App_20231001140423.tsx new file mode 100644 index 0000000..c1e6d31 --- /dev/null +++ b/.history/src/App_20231001140423.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140441.tsx b/.history/src/App_20231001140441.tsx new file mode 100644 index 0000000..119e7d0 --- /dev/null +++ b/.history/src/App_20231001140441.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140445.tsx b/.history/src/App_20231001140445.tsx new file mode 100644 index 0000000..187b95e --- /dev/null +++ b/.history/src/App_20231001140445.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140447.tsx b/.history/src/App_20231001140447.tsx new file mode 100644 index 0000000..c3437eb --- /dev/null +++ b/.history/src/App_20231001140447.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140603.tsx b/.history/src/App_20231001140603.tsx new file mode 100644 index 0000000..f13d7c4 --- /dev/null +++ b/.history/src/App_20231001140603.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140611.tsx b/.history/src/App_20231001140611.tsx new file mode 100644 index 0000000..c3437eb --- /dev/null +++ b/.history/src/App_20231001140611.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140612.tsx b/.history/src/App_20231001140612.tsx new file mode 100644 index 0000000..13b2a39 --- /dev/null +++ b/.history/src/App_20231001140612.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140633.tsx b/.history/src/App_20231001140633.tsx new file mode 100644 index 0000000..639ecfd --- /dev/null +++ b/.history/src/App_20231001140633.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140645.tsx b/.history/src/App_20231001140645.tsx new file mode 100644 index 0000000..37cc961 --- /dev/null +++ b/.history/src/App_20231001140645.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140657.tsx b/.history/src/App_20231001140657.tsx new file mode 100644 index 0000000..13b2a39 --- /dev/null +++ b/.history/src/App_20231001140657.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140705.tsx b/.history/src/App_20231001140705.tsx new file mode 100644 index 0000000..4584c93 --- /dev/null +++ b/.history/src/App_20231001140705.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140721.tsx b/.history/src/App_20231001140721.tsx new file mode 100644 index 0000000..4584c93 --- /dev/null +++ b/.history/src/App_20231001140721.tsx @@ -0,0 +1,163 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140723.tsx b/.history/src/App_20231001140723.tsx new file mode 100644 index 0000000..7ffccb1 --- /dev/null +++ b/.history/src/App_20231001140723.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140735.tsx b/.history/src/App_20231001140735.tsx new file mode 100644 index 0000000..d5b2c2b --- /dev/null +++ b/.history/src/App_20231001140735.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear '.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140744.tsx b/.history/src/App_20231001140744.tsx new file mode 100644 index 0000000..6031975 --- /dev/null +++ b/.history/src/App_20231001140744.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the .

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140746.tsx b/.history/src/App_20231001140746.tsx new file mode 100644 index 0000000..21ff0fe --- /dev/null +++ b/.history/src/App_20231001140746.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231001140755.tsx b/.history/src/App_20231001140755.tsx new file mode 100644 index 0000000..5a71bef --- /dev/null +++ b/.history/src/App_20231001140755.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231002184302.tsx b/.history/src/App_20231002184302.tsx new file mode 100644 index 0000000..0140b6c --- /dev/null +++ b/.history/src/App_20231002184302.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/App_20231002184303.tsx b/.history/src/App_20231002184303.tsx new file mode 100644 index 0000000..0140b6c --- /dev/null +++ b/.history/src/App_20231002184303.tsx @@ -0,0 +1,164 @@ +import { useEffect, useRef, useState } from "react"; + +import info from "../data.json"; +import { username, hostname, path, symbol } from "../constants"; + +const options = info.options.map((option) => option.label); + +function App() { + const [history, setHistory] = useState([ + { + command: "help", + output: + "Here are the available commands:
" + options.join("
"), + }, + ]); + + const [userInput, setUserInput] = useState(""); + + const executeCommand = (command: string) => { + command = command.trim().toLowerCase(); + + if (options.includes(command)) { + let output = info.options.find( + (option) => option.label === command + )!.value; + + // check if 'data' exists within the options + if (info.options.find((option) => option.label === command)?.data) { + console.log("data exists"); + // append to output + const data = info.options.find( + (option) => option.label === command + )!.data; + + output += data?.map((item) => { + return `

+ ${item.label}
+ ${item.value}`; + }); + } + + setHistory((history) => [ + ...history, + { + command, + output, + }, + ]); + } else { + if (command === "help") { + setHistory((history) => [ + ...history, + { + command: command, + output: + "Here are the available commands:
" + + info.options + .map((option) => option.label + " - " + option.about) + .join("
") + + "
" + + info.additional_commands + .map((option) => option.label + " - " + option.about) + .join("
"), + }, + ]); + } else if (command === "clear") { + setHistory([]); + } else if (command === "") { + setHistory((history) => [ + ...history, + { + command: command, + output: "", + }, + ]); + } else { + setHistory((history) => [ + ...history, + { + command: command, + output: "command not found", + }, + ]); + } + } + }; + + const inputRef = useRef(null); + const focusInput = () => { + if (inputRef.current) { + inputRef.current.focus(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setUserInput(e.target.value); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(userInput); + setUserInput(""); + }; + + useEffect(() => { + document.addEventListener("click", focusInput); + + // Cleanup the event listener when the component unmounts + return () => { + document.removeEventListener("click", focusInput); + }; + }, []); + + return ( +
+

Welcome to my portfolio!

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

+

Hint - Use 'clear' command to clear the terminal.

+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
+ + +
+ +
+
+
+
+
+ ); +} + +const Prompt = () => { + return ( + + + {username}@{hostname} + + :{path} + {symbol} + + ); +}; + +export default App; diff --git a/.history/src/index_20231001131835.css b/.history/src/index_20231001131835.css new file mode 100644 index 0000000..3dd1d24 --- /dev/null +++ b/.history/src/index_20231001131835.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #300a24; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134557.css b/.history/src/index_20231001134557.css new file mode 100644 index 0000000..d7ec15d --- /dev/null +++ b/.history/src/index_20231001134557.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #2b2529; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134601.css b/.history/src/index_20231001134601.css new file mode 100644 index 0000000..178c35c --- /dev/null +++ b/.history/src/index_20231001134601.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #2b2429; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134608.css b/.history/src/index_20231001134608.css new file mode 100644 index 0000000..dd46734 --- /dev/null +++ b/.history/src/index_20231001134608.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #332c31; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001134611.css b/.history/src/index_20231001134611.css new file mode 100644 index 0000000..a67e39f --- /dev/null +++ b/.history/src/index_20231001134611.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242324; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001135943.css b/.history/src/index_20231001135943.css new file mode 100644 index 0000000..dd46734 --- /dev/null +++ b/.history/src/index_20231001135943.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #332c31; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001135947.css b/.history/src/index_20231001135947.css new file mode 100644 index 0000000..3dd1d24 --- /dev/null +++ b/.history/src/index_20231001135947.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #300a24; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140011.css b/.history/src/index_20231001140011.css new file mode 100644 index 0000000..06e2b8a --- /dev/null +++ b/.history/src/index_20231001140011.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140513.css b/.history/src/index_20231001140513.css new file mode 100644 index 0000000..b51f619 --- /dev/null +++ b/.history/src/index_20231001140513.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 200; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140528.css b/.history/src/index_20231001140528.css new file mode 100644 index 0000000..ac00e64 --- /dev/null +++ b/.history/src/index_20231001140528.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 00; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140529.css b/.history/src/index_20231001140529.css new file mode 100644 index 0000000..fdb112d --- /dev/null +++ b/.history/src/index_20231001140529.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 600; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140535.css b/.history/src/index_20231001140535.css new file mode 100644 index 0000000..c054cdb --- /dev/null +++ b/.history/src/index_20231001140535.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 800; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/.history/src/index_20231001140542.css b/.history/src/index_20231001140542.css new file mode 100644 index 0000000..06e2b8a --- /dev/null +++ b/.history/src/index_20231001140542.css @@ -0,0 +1,25 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + /* background-color: #300a24; */ + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + padding: 0; + display: flex; +} + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/package-lock.json b/package-lock.json index e8d0098..68b9c1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "eslint-plugin-react-refresh": "^0.4.3", "postcss": "^8.4.30", "tailwindcss": "^3.3.3", - "typescript": "^5.2.2", + "typescript": "^5.0.2", "vite": "^4.4.5" } }, diff --git a/package.json b/package.json index c935887..86495f3 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "eslint-plugin-react-refresh": "^0.4.3", "postcss": "^8.4.30", "tailwindcss": "^3.3.3", - "typescript": "^5.2.2", + "typescript": "^5.0.2", "vite": "^4.4.5" } } diff --git a/src/App.tsx b/src/App.tsx index 5a71bef..0140b6c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -113,7 +113,7 @@ function App() { return (
-

Welcome to my portfolio!

+

Welcome to my portfolio!

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

Hint - Use 'clear' command to clear the terminal.

From 5072dd06443c33879937887406fa94ffd197a4d1 Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Mon, 2 Oct 2023 19:20:31 +0530 Subject: [PATCH 4/9] Add .history to .gitignore --- .gitignore | 3 +- .history/package-lock_20231001134438.json | 3497 --------------------- .history/package-lock_20231002184359.json | 3497 --------------------- .history/package-lock_20231002184402.json | 3497 --------------------- .history/package-lock_20231002184404.json | 3497 --------------------- .history/package-lock_20231002184406.json | 3497 --------------------- .history/package-lock_20231002184408.json | 3497 --------------------- .history/package_20231001134133.json | 32 - .history/package_20231002184336.json | 32 - .history/package_20231002184338.json | 32 - .history/src/App_20231001131835.tsx | 159 - .history/src/App_20231001134627.tsx | 159 - .history/src/App_20231001134629.tsx | 159 - .history/src/App_20231001134636.tsx | 159 - .history/src/App_20231001134637.tsx | 159 - .history/src/App_20231001134651.tsx | 159 - .history/src/App_20231001134658.tsx | 159 - .history/src/App_20231001134702.tsx | 159 - .history/src/App_20231001134713.tsx | 159 - .history/src/App_20231001134725.tsx | 159 - .history/src/App_20231001134727.tsx | 159 - .history/src/App_20231001134729.tsx | 159 - .history/src/App_20231001134738.tsx | 159 - .history/src/App_20231001134744.tsx | 159 - .history/src/App_20231001134835.tsx | 160 - .history/src/App_20231001134839.tsx | 160 - .history/src/App_20231001134846.tsx | 161 - .history/src/App_20231001134847.tsx | 161 - .history/src/App_20231001134853.tsx | 162 - .history/src/App_20231001134855.tsx | 162 - .history/src/App_20231001134857.tsx | 162 - .history/src/App_20231001134906.tsx | 162 - .history/src/App_20231001134908.tsx | 162 - .history/src/App_20231001134909.tsx | 162 - .history/src/App_20231001134929.tsx | 162 - .history/src/App_20231001134932.tsx | 162 - .history/src/App_20231001134934.tsx | 162 - .history/src/App_20231001134943.tsx | 162 - .history/src/App_20231001134947.tsx | 162 - .history/src/App_20231001134949.tsx | 162 - .history/src/App_20231001134952.tsx | 162 - .history/src/App_20231001134954.tsx | 162 - .history/src/App_20231001134957.tsx | 162 - .history/src/App_20231001135000.tsx | 162 - .history/src/App_20231001135002.tsx | 162 - .history/src/App_20231001135003.tsx | 162 - .history/src/App_20231001135006.tsx | 162 - .history/src/App_20231001135013.tsx | 162 - .history/src/App_20231001135017.tsx | 162 - .history/src/App_20231001135020.tsx | 162 - .history/src/App_20231001135023.tsx | 162 - .history/src/App_20231001135037.tsx | 162 - .history/src/App_20231001135041.tsx | 162 - .history/src/App_20231001135050.tsx | 162 - .history/src/App_20231001135052.tsx | 162 - .history/src/App_20231001135054.tsx | 162 - .history/src/App_20231001135100.tsx | 162 - .history/src/App_20231001135113.tsx | 162 - .history/src/App_20231001135117.tsx | 162 - .history/src/App_20231001135121.tsx | 162 - .history/src/App_20231001135124.tsx | 162 - .history/src/App_20231001135131.tsx | 166 - .history/src/App_20231001135132.tsx | 162 - .history/src/App_20231001135137.tsx | 162 - .history/src/App_20231001135143.tsx | 162 - .history/src/App_20231001135144.tsx | 162 - .history/src/App_20231001135151.tsx | 162 - .history/src/App_20231001135153.tsx | 162 - .history/src/App_20231001135203.tsx | 162 - .history/src/App_20231001135207.tsx | 162 - .history/src/App_20231001135210.tsx | 162 - .history/src/App_20231001135223.tsx | 162 - .history/src/App_20231001135250.tsx | 162 - .history/src/App_20231001135313.tsx | 163 - .history/src/App_20231001135318.tsx | 163 - .history/src/App_20231001135319.tsx | 163 - .history/src/App_20231001135321.tsx | 163 - .history/src/App_20231001135326.tsx | 163 - .history/src/App_20231001135330.tsx | 163 - .history/src/App_20231001135332.tsx | 163 - .history/src/App_20231001135354.tsx | 163 - .history/src/App_20231001135409.tsx | 163 - .history/src/App_20231001135410.tsx | 163 - .history/src/App_20231001135414.tsx | 163 - .history/src/App_20231001135422.tsx | 163 - .history/src/App_20231001135436.tsx | 163 - .history/src/App_20231001135442.tsx | 163 - .history/src/App_20231001135451.tsx | 163 - .history/src/App_20231001135500.tsx | 163 - .history/src/App_20231001135505.tsx | 163 - .history/src/App_20231001135512.tsx | 163 - .history/src/App_20231001135521.tsx | 163 - .history/src/App_20231001135533.tsx | 163 - .history/src/App_20231001135549.tsx | 163 - .history/src/App_20231001135603.tsx | 163 - .history/src/App_20231001135605.tsx | 163 - .history/src/App_20231001135608.tsx | 163 - .history/src/App_20231001135619.tsx | 163 - .history/src/App_20231001135627.tsx | 163 - .history/src/App_20231001135632.tsx | 163 - .history/src/App_20231001135638.tsx | 163 - .history/src/App_20231001135640.tsx | 163 - .history/src/App_20231001135648.tsx | 163 - .history/src/App_20231001135651.tsx | 163 - .history/src/App_20231001135653.tsx | 163 - .history/src/App_20231001135657.tsx | 163 - .history/src/App_20231001135704.tsx | 163 - .history/src/App_20231001135709.tsx | 163 - .history/src/App_20231001135714.tsx | 163 - .history/src/App_20231001135717.tsx | 163 - .history/src/App_20231001135720.tsx | 163 - .history/src/App_20231001135724.tsx | 163 - .history/src/App_20231001135732.tsx | 163 - .history/src/App_20231001135736.tsx | 163 - .history/src/App_20231001135800.tsx | 163 - .history/src/App_20231001135801.tsx | 163 - .history/src/App_20231001135803.tsx | 163 - .history/src/App_20231001135809.tsx | 163 - .history/src/App_20231001135829.tsx | 163 - .history/src/App_20231001135835.tsx | 163 - .history/src/App_20231001135858.tsx | 163 - .history/src/App_20231001135901.tsx | 163 - .history/src/App_20231001135902.tsx | 163 - .history/src/App_20231001135931.tsx | 163 - .history/src/App_20231001140017.tsx | 163 - .history/src/App_20231001140037.tsx | 163 - .history/src/App_20231001140051.tsx | 163 - .history/src/App_20231001140112.tsx | 163 - .history/src/App_20231001140124.tsx | 163 - .history/src/App_20231001140134.tsx | 163 - .history/src/App_20231001140147.tsx | 163 - .history/src/App_20231001140219.tsx | 163 - .history/src/App_20231001140236.tsx | 163 - .history/src/App_20231001140326.tsx | 163 - .history/src/App_20231001140400.tsx | 163 - .history/src/App_20231001140404.tsx | 163 - .history/src/App_20231001140410.tsx | 163 - .history/src/App_20231001140413.tsx | 163 - .history/src/App_20231001140416.tsx | 163 - .history/src/App_20231001140419.tsx | 163 - .history/src/App_20231001140423.tsx | 163 - .history/src/App_20231001140441.tsx | 163 - .history/src/App_20231001140445.tsx | 163 - .history/src/App_20231001140447.tsx | 163 - .history/src/App_20231001140603.tsx | 163 - .history/src/App_20231001140611.tsx | 163 - .history/src/App_20231001140612.tsx | 163 - .history/src/App_20231001140633.tsx | 163 - .history/src/App_20231001140645.tsx | 163 - .history/src/App_20231001140657.tsx | 163 - .history/src/App_20231001140705.tsx | 163 - .history/src/App_20231001140721.tsx | 163 - .history/src/App_20231001140723.tsx | 164 - .history/src/App_20231001140735.tsx | 164 - .history/src/App_20231001140744.tsx | 164 - .history/src/App_20231001140746.tsx | 164 - .history/src/App_20231001140755.tsx | 164 - .history/src/App_20231002184302.tsx | 164 - .history/src/App_20231002184303.tsx | 164 - .history/src/index_20231001131835.css | 25 - .history/src/index_20231001134557.css | 25 - .history/src/index_20231001134601.css | 25 - .history/src/index_20231001134608.css | 25 - .history/src/index_20231001134611.css | 25 - .history/src/index_20231001135943.css | 25 - .history/src/index_20231001135947.css | 25 - .history/src/index_20231001140011.css | 25 - .history/src/index_20231001140513.css | 25 - .history/src/index_20231001140528.css | 25 - .history/src/index_20231001140529.css | 25 - .history/src/index_20231001140535.css | 25 - .history/src/index_20231001140542.css | 25 - 172 files changed, 2 insertions(+), 45591 deletions(-) delete mode 100644 .history/package-lock_20231001134438.json delete mode 100644 .history/package-lock_20231002184359.json delete mode 100644 .history/package-lock_20231002184402.json delete mode 100644 .history/package-lock_20231002184404.json delete mode 100644 .history/package-lock_20231002184406.json delete mode 100644 .history/package-lock_20231002184408.json delete mode 100644 .history/package_20231001134133.json delete mode 100644 .history/package_20231002184336.json delete mode 100644 .history/package_20231002184338.json delete mode 100644 .history/src/App_20231001131835.tsx delete mode 100644 .history/src/App_20231001134627.tsx delete mode 100644 .history/src/App_20231001134629.tsx delete mode 100644 .history/src/App_20231001134636.tsx delete mode 100644 .history/src/App_20231001134637.tsx delete mode 100644 .history/src/App_20231001134651.tsx delete mode 100644 .history/src/App_20231001134658.tsx delete mode 100644 .history/src/App_20231001134702.tsx delete mode 100644 .history/src/App_20231001134713.tsx delete mode 100644 .history/src/App_20231001134725.tsx delete mode 100644 .history/src/App_20231001134727.tsx delete mode 100644 .history/src/App_20231001134729.tsx delete mode 100644 .history/src/App_20231001134738.tsx delete mode 100644 .history/src/App_20231001134744.tsx delete mode 100644 .history/src/App_20231001134835.tsx delete mode 100644 .history/src/App_20231001134839.tsx delete mode 100644 .history/src/App_20231001134846.tsx delete mode 100644 .history/src/App_20231001134847.tsx delete mode 100644 .history/src/App_20231001134853.tsx delete mode 100644 .history/src/App_20231001134855.tsx delete mode 100644 .history/src/App_20231001134857.tsx delete mode 100644 .history/src/App_20231001134906.tsx delete mode 100644 .history/src/App_20231001134908.tsx delete mode 100644 .history/src/App_20231001134909.tsx delete mode 100644 .history/src/App_20231001134929.tsx delete mode 100644 .history/src/App_20231001134932.tsx delete mode 100644 .history/src/App_20231001134934.tsx delete mode 100644 .history/src/App_20231001134943.tsx delete mode 100644 .history/src/App_20231001134947.tsx delete mode 100644 .history/src/App_20231001134949.tsx delete mode 100644 .history/src/App_20231001134952.tsx delete mode 100644 .history/src/App_20231001134954.tsx delete mode 100644 .history/src/App_20231001134957.tsx delete mode 100644 .history/src/App_20231001135000.tsx delete mode 100644 .history/src/App_20231001135002.tsx delete mode 100644 .history/src/App_20231001135003.tsx delete mode 100644 .history/src/App_20231001135006.tsx delete mode 100644 .history/src/App_20231001135013.tsx delete mode 100644 .history/src/App_20231001135017.tsx delete mode 100644 .history/src/App_20231001135020.tsx delete mode 100644 .history/src/App_20231001135023.tsx delete mode 100644 .history/src/App_20231001135037.tsx delete mode 100644 .history/src/App_20231001135041.tsx delete mode 100644 .history/src/App_20231001135050.tsx delete mode 100644 .history/src/App_20231001135052.tsx delete mode 100644 .history/src/App_20231001135054.tsx delete mode 100644 .history/src/App_20231001135100.tsx delete mode 100644 .history/src/App_20231001135113.tsx delete mode 100644 .history/src/App_20231001135117.tsx delete mode 100644 .history/src/App_20231001135121.tsx delete mode 100644 .history/src/App_20231001135124.tsx delete mode 100644 .history/src/App_20231001135131.tsx delete mode 100644 .history/src/App_20231001135132.tsx delete mode 100644 .history/src/App_20231001135137.tsx delete mode 100644 .history/src/App_20231001135143.tsx delete mode 100644 .history/src/App_20231001135144.tsx delete mode 100644 .history/src/App_20231001135151.tsx delete mode 100644 .history/src/App_20231001135153.tsx delete mode 100644 .history/src/App_20231001135203.tsx delete mode 100644 .history/src/App_20231001135207.tsx delete mode 100644 .history/src/App_20231001135210.tsx delete mode 100644 .history/src/App_20231001135223.tsx delete mode 100644 .history/src/App_20231001135250.tsx delete mode 100644 .history/src/App_20231001135313.tsx delete mode 100644 .history/src/App_20231001135318.tsx delete mode 100644 .history/src/App_20231001135319.tsx delete mode 100644 .history/src/App_20231001135321.tsx delete mode 100644 .history/src/App_20231001135326.tsx delete mode 100644 .history/src/App_20231001135330.tsx delete mode 100644 .history/src/App_20231001135332.tsx delete mode 100644 .history/src/App_20231001135354.tsx delete mode 100644 .history/src/App_20231001135409.tsx delete mode 100644 .history/src/App_20231001135410.tsx delete mode 100644 .history/src/App_20231001135414.tsx delete mode 100644 .history/src/App_20231001135422.tsx delete mode 100644 .history/src/App_20231001135436.tsx delete mode 100644 .history/src/App_20231001135442.tsx delete mode 100644 .history/src/App_20231001135451.tsx delete mode 100644 .history/src/App_20231001135500.tsx delete mode 100644 .history/src/App_20231001135505.tsx delete mode 100644 .history/src/App_20231001135512.tsx delete mode 100644 .history/src/App_20231001135521.tsx delete mode 100644 .history/src/App_20231001135533.tsx delete mode 100644 .history/src/App_20231001135549.tsx delete mode 100644 .history/src/App_20231001135603.tsx delete mode 100644 .history/src/App_20231001135605.tsx delete mode 100644 .history/src/App_20231001135608.tsx delete mode 100644 .history/src/App_20231001135619.tsx delete mode 100644 .history/src/App_20231001135627.tsx delete mode 100644 .history/src/App_20231001135632.tsx delete mode 100644 .history/src/App_20231001135638.tsx delete mode 100644 .history/src/App_20231001135640.tsx delete mode 100644 .history/src/App_20231001135648.tsx delete mode 100644 .history/src/App_20231001135651.tsx delete mode 100644 .history/src/App_20231001135653.tsx delete mode 100644 .history/src/App_20231001135657.tsx delete mode 100644 .history/src/App_20231001135704.tsx delete mode 100644 .history/src/App_20231001135709.tsx delete mode 100644 .history/src/App_20231001135714.tsx delete mode 100644 .history/src/App_20231001135717.tsx delete mode 100644 .history/src/App_20231001135720.tsx delete mode 100644 .history/src/App_20231001135724.tsx delete mode 100644 .history/src/App_20231001135732.tsx delete mode 100644 .history/src/App_20231001135736.tsx delete mode 100644 .history/src/App_20231001135800.tsx delete mode 100644 .history/src/App_20231001135801.tsx delete mode 100644 .history/src/App_20231001135803.tsx delete mode 100644 .history/src/App_20231001135809.tsx delete mode 100644 .history/src/App_20231001135829.tsx delete mode 100644 .history/src/App_20231001135835.tsx delete mode 100644 .history/src/App_20231001135858.tsx delete mode 100644 .history/src/App_20231001135901.tsx delete mode 100644 .history/src/App_20231001135902.tsx delete mode 100644 .history/src/App_20231001135931.tsx delete mode 100644 .history/src/App_20231001140017.tsx delete mode 100644 .history/src/App_20231001140037.tsx delete mode 100644 .history/src/App_20231001140051.tsx delete mode 100644 .history/src/App_20231001140112.tsx delete mode 100644 .history/src/App_20231001140124.tsx delete mode 100644 .history/src/App_20231001140134.tsx delete mode 100644 .history/src/App_20231001140147.tsx delete mode 100644 .history/src/App_20231001140219.tsx delete mode 100644 .history/src/App_20231001140236.tsx delete mode 100644 .history/src/App_20231001140326.tsx delete mode 100644 .history/src/App_20231001140400.tsx delete mode 100644 .history/src/App_20231001140404.tsx delete mode 100644 .history/src/App_20231001140410.tsx delete mode 100644 .history/src/App_20231001140413.tsx delete mode 100644 .history/src/App_20231001140416.tsx delete mode 100644 .history/src/App_20231001140419.tsx delete mode 100644 .history/src/App_20231001140423.tsx delete mode 100644 .history/src/App_20231001140441.tsx delete mode 100644 .history/src/App_20231001140445.tsx delete mode 100644 .history/src/App_20231001140447.tsx delete mode 100644 .history/src/App_20231001140603.tsx delete mode 100644 .history/src/App_20231001140611.tsx delete mode 100644 .history/src/App_20231001140612.tsx delete mode 100644 .history/src/App_20231001140633.tsx delete mode 100644 .history/src/App_20231001140645.tsx delete mode 100644 .history/src/App_20231001140657.tsx delete mode 100644 .history/src/App_20231001140705.tsx delete mode 100644 .history/src/App_20231001140721.tsx delete mode 100644 .history/src/App_20231001140723.tsx delete mode 100644 .history/src/App_20231001140735.tsx delete mode 100644 .history/src/App_20231001140744.tsx delete mode 100644 .history/src/App_20231001140746.tsx delete mode 100644 .history/src/App_20231001140755.tsx delete mode 100644 .history/src/App_20231002184302.tsx delete mode 100644 .history/src/App_20231002184303.tsx delete mode 100644 .history/src/index_20231001131835.css delete mode 100644 .history/src/index_20231001134557.css delete mode 100644 .history/src/index_20231001134601.css delete mode 100644 .history/src/index_20231001134608.css delete mode 100644 .history/src/index_20231001134611.css delete mode 100644 .history/src/index_20231001135943.css delete mode 100644 .history/src/index_20231001135947.css delete mode 100644 .history/src/index_20231001140011.css delete mode 100644 .history/src/index_20231001140513.css delete mode 100644 .history/src/index_20231001140528.css delete mode 100644 .history/src/index_20231001140529.css delete mode 100644 .history/src/index_20231001140535.css delete mode 100644 .history/src/index_20231001140542.css diff --git a/.gitignore b/.gitignore index 9a14c5e..7e511a5 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? -/. history +.history/ + diff --git a/.history/package-lock_20231001134438.json b/.history/package-lock_20231001134438.json deleted file mode 100644 index e8d0098..0000000 --- a/.history/package-lock_20231001134438.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.2.2", - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package-lock_20231002184359.json b/.history/package-lock_20231002184359.json deleted file mode 100644 index 3d5d392..0000000 --- a/.history/package-lock_20231002184359.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - Replace the line with "typescript": "^5.0.2",, - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package-lock_20231002184402.json b/.history/package-lock_20231002184402.json deleted file mode 100644 index e8d0098..0000000 --- a/.history/package-lock_20231002184402.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.2.2", - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package-lock_20231002184404.json b/.history/package-lock_20231002184404.json deleted file mode 100644 index 05eee64..0000000 --- a/.history/package-lock_20231002184404.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - Replace the line with "typescript": "^5.0.2", - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package-lock_20231002184406.json b/.history/package-lock_20231002184406.json deleted file mode 100644 index 68b9c1e..0000000 --- a/.history/package-lock_20231002184406.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package-lock_20231002184408.json b/.history/package-lock_20231002184408.json deleted file mode 100644 index 68b9c1e..0000000 --- a/.history/package-lock_20231002184408.json +++ /dev/null @@ -1,3497 +0,0 @@ -{ - "name": "terminal-portfolio", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal-portfolio", - "version": "0.0.0", - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/.history/package_20231001134133.json b/.history/package_20231001134133.json deleted file mode 100644 index c935887..0000000 --- a/.history/package_20231001134133.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "terminal-portfolio", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.2.2", - "vite": "^4.4.5" - } -} diff --git a/.history/package_20231002184336.json b/.history/package_20231002184336.json deleted file mode 100644 index 72f1053..0000000 --- a/.history/package_20231002184336.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "terminal-portfolio", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2" - "vite": "^4.4.5" - } -} diff --git a/.history/package_20231002184338.json b/.history/package_20231002184338.json deleted file mode 100644 index 86495f3..0000000 --- a/.history/package_20231002184338.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "terminal-portfolio", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@vercel/analytics": "^1.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.30", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } -} diff --git a/.history/src/App_20231001131835.tsx b/.history/src/App_20231001131835.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001131835.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134627.tsx b/.history/src/App_20231001134627.tsx deleted file mode 100644 index efaa4b0..0000000 --- a/.history/src/App_20231001134627.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134629.tsx b/.history/src/App_20231001134629.tsx deleted file mode 100644 index 0a70d71..0000000 --- a/.history/src/App_20231001134629.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134636.tsx b/.history/src/App_20231001134636.tsx deleted file mode 100644 index f5ff92d..0000000 --- a/.history/src/App_20231001134636.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134637.tsx b/.history/src/App_20231001134637.tsx deleted file mode 100644 index 4eb5401..0000000 --- a/.history/src/App_20231001134637.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134651.tsx b/.history/src/App_20231001134651.tsx deleted file mode 100644 index c8620b4..0000000 --- a/.history/src/App_20231001134651.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134658.tsx b/.history/src/App_20231001134658.tsx deleted file mode 100644 index f6ef193..0000000 --- a/.history/src/App_20231001134658.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134702.tsx b/.history/src/App_20231001134702.tsx deleted file mode 100644 index 4eb5401..0000000 --- a/.history/src/App_20231001134702.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134713.tsx b/.history/src/App_20231001134713.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001134713.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134725.tsx b/.history/src/App_20231001134725.tsx deleted file mode 100644 index 8caf5e2..0000000 --- a/.history/src/App_20231001134725.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134727.tsx b/.history/src/App_20231001134727.tsx deleted file mode 100644 index 4935ed0..0000000 --- a/.history/src/App_20231001134727.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134729.tsx b/.history/src/App_20231001134729.tsx deleted file mode 100644 index 07288ff..0000000 --- a/.history/src/App_20231001134729.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134738.tsx b/.history/src/App_20231001134738.tsx deleted file mode 100644 index 878a1fc..0000000 --- a/.history/src/App_20231001134738.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134744.tsx b/.history/src/App_20231001134744.tsx deleted file mode 100644 index 26c9776..0000000 --- a/.history/src/App_20231001134744.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134835.tsx b/.history/src/App_20231001134835.tsx deleted file mode 100644 index a50e6e9..0000000 --- a/.history/src/App_20231001134835.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( - -
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134839.tsx b/.history/src/App_20231001134839.tsx deleted file mode 100644 index 063bab2..0000000 --- a/.history/src/App_20231001134839.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134846.tsx b/.history/src/App_20231001134846.tsx deleted file mode 100644 index 0e3e1a2..0000000 --- a/.history/src/App_20231001134846.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
- { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134847.tsx b/.history/src/App_20231001134847.tsx deleted file mode 100644 index 0444a73..0000000 --- a/.history/src/App_20231001134847.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134853.tsx b/.history/src/App_20231001134853.tsx deleted file mode 100644 index 4a76e56..0000000 --- a/.history/src/App_20231001134853.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

- { - /* History */ - history.map((history) => ( -

- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134855.tsx b/.history/src/App_20231001134855.tsx deleted file mode 100644 index 4a76e56..0000000 --- a/.history/src/App_20231001134855.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

- { - /* History */ - history.map((history) => ( -

- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134857.tsx b/.history/src/App_20231001134857.tsx deleted file mode 100644 index b5380d4..0000000 --- a/.history/src/App_20231001134857.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134906.tsx b/.history/src/App_20231001134906.tsx deleted file mode 100644 index b3246e3..0000000 --- a/.history/src/App_20231001134906.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134908.tsx b/.history/src/App_20231001134908.tsx deleted file mode 100644 index e48ddd4..0000000 --- a/.history/src/App_20231001134908.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134909.tsx b/.history/src/App_20231001134909.tsx deleted file mode 100644 index ca817f8..0000000 --- a/.history/src/App_20231001134909.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134929.tsx b/.history/src/App_20231001134929.tsx deleted file mode 100644 index 19122b3..0000000 --- a/.history/src/App_20231001134929.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134932.tsx b/.history/src/App_20231001134932.tsx deleted file mode 100644 index 56e5333..0000000 --- a/.history/src/App_20231001134932.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134934.tsx b/.history/src/App_20231001134934.tsx deleted file mode 100644 index 857521c..0000000 --- a/.history/src/App_20231001134934.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134943.tsx b/.history/src/App_20231001134943.tsx deleted file mode 100644 index 9accda2..0000000 --- a/.history/src/App_20231001134943.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134947.tsx b/.history/src/App_20231001134947.tsx deleted file mode 100644 index 2308941..0000000 --- a/.history/src/App_20231001134947.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134949.tsx b/.history/src/App_20231001134949.tsx deleted file mode 100644 index 5af9875..0000000 --- a/.history/src/App_20231001134949.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134952.tsx b/.history/src/App_20231001134952.tsx deleted file mode 100644 index 1c853e6..0000000 --- a/.history/src/App_20231001134952.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134954.tsx b/.history/src/App_20231001134954.tsx deleted file mode 100644 index ddcca97..0000000 --- a/.history/src/App_20231001134954.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001134957.tsx b/.history/src/App_20231001134957.tsx deleted file mode 100644 index e59fdd0..0000000 --- a/.history/src/App_20231001134957.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135000.tsx b/.history/src/App_20231001135000.tsx deleted file mode 100644 index 2d7781a..0000000 --- a/.history/src/App_20231001135000.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135002.tsx b/.history/src/App_20231001135002.tsx deleted file mode 100644 index 2e31c7a..0000000 --- a/.history/src/App_20231001135002.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135003.tsx b/.history/src/App_20231001135003.tsx deleted file mode 100644 index 9debdc1..0000000 --- a/.history/src/App_20231001135003.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135006.tsx b/.history/src/App_20231001135006.tsx deleted file mode 100644 index d86b6a5..0000000 --- a/.history/src/App_20231001135006.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135013.tsx b/.history/src/App_20231001135013.tsx deleted file mode 100644 index 9debdc1..0000000 --- a/.history/src/App_20231001135013.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135017.tsx b/.history/src/App_20231001135017.tsx deleted file mode 100644 index 22fc7b5..0000000 --- a/.history/src/App_20231001135017.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135020.tsx b/.history/src/App_20231001135020.tsx deleted file mode 100644 index 6d8fbf3..0000000 --- a/.history/src/App_20231001135020.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135023.tsx b/.history/src/App_20231001135023.tsx deleted file mode 100644 index 7272fa2..0000000 --- a/.history/src/App_20231001135023.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135037.tsx b/.history/src/App_20231001135037.tsx deleted file mode 100644 index fab6f90..0000000 --- a/.history/src/App_20231001135037.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135041.tsx b/.history/src/App_20231001135041.tsx deleted file mode 100644 index ced7c33..0000000 --- a/.history/src/App_20231001135041.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135050.tsx b/.history/src/App_20231001135050.tsx deleted file mode 100644 index 981a57b..0000000 --- a/.history/src/App_20231001135050.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135052.tsx b/.history/src/App_20231001135052.tsx deleted file mode 100644 index e63cc8d..0000000 --- a/.history/src/App_20231001135052.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135054.tsx b/.history/src/App_20231001135054.tsx deleted file mode 100644 index 3d51d9d..0000000 --- a/.history/src/App_20231001135054.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135100.tsx b/.history/src/App_20231001135100.tsx deleted file mode 100644 index 2e98ede..0000000 --- a/.history/src/App_20231001135100.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135113.tsx b/.history/src/App_20231001135113.tsx deleted file mode 100644 index 5e04509..0000000 --- a/.history/src/App_20231001135113.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135117.tsx b/.history/src/App_20231001135117.tsx deleted file mode 100644 index 2e98ede..0000000 --- a/.history/src/App_20231001135117.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135121.tsx b/.history/src/App_20231001135121.tsx deleted file mode 100644 index 7b644ef..0000000 --- a/.history/src/App_20231001135121.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135124.tsx b/.history/src/App_20231001135124.tsx deleted file mode 100644 index d59f649..0000000 --- a/.history/src/App_20231001135124.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135131.tsx b/.history/src/App_20231001135131.tsx deleted file mode 100644 index cb5c4a1..0000000 --- a/.history/src/App_20231001135131.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135132.tsx b/.history/src/App_20231001135132.tsx deleted file mode 100644 index a00d851..0000000 --- a/.history/src/App_20231001135132.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135137.tsx b/.history/src/App_20231001135137.tsx deleted file mode 100644 index a79ba58..0000000 --- a/.history/src/App_20231001135137.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135143.tsx b/.history/src/App_20231001135143.tsx deleted file mode 100644 index d768e53..0000000 --- a/.history/src/App_20231001135143.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135144.tsx b/.history/src/App_20231001135144.tsx deleted file mode 100644 index d4afa53..0000000 --- a/.history/src/App_20231001135144.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135151.tsx b/.history/src/App_20231001135151.tsx deleted file mode 100644 index 5bf0d63..0000000 --- a/.history/src/App_20231001135151.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135153.tsx b/.history/src/App_20231001135153.tsx deleted file mode 100644 index b32b0fe..0000000 --- a/.history/src/App_20231001135153.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135203.tsx b/.history/src/App_20231001135203.tsx deleted file mode 100644 index 56199cb..0000000 --- a/.history/src/App_20231001135203.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135207.tsx b/.history/src/App_20231001135207.tsx deleted file mode 100644 index 2342ded..0000000 --- a/.history/src/App_20231001135207.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135223.tsx b/.history/src/App_20231001135223.tsx deleted file mode 100644 index 506d82e..0000000 --- a/.history/src/App_20231001135223.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135250.tsx b/.history/src/App_20231001135250.tsx deleted file mode 100644 index c59d7cb..0000000 --- a/.history/src/App_20231001135250.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135313.tsx b/.history/src/App_20231001135313.tsx deleted file mode 100644 index cc7d5d7..0000000 --- a/.history/src/App_20231001135313.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Welcome to my portfolio!

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135318.tsx b/.history/src/App_20231001135318.tsx deleted file mode 100644 index c84d7bc..0000000 --- a/.history/src/App_20231001135318.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instruc

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135319.tsx b/.history/src/App_20231001135319.tsx deleted file mode 100644 index 1e3745e..0000000 --- a/.history/src/App_20231001135319.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135321.tsx b/.history/src/App_20231001135321.tsx deleted file mode 100644 index c017d39..0000000 --- a/.history/src/App_20231001135321.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions ->

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135326.tsx b/.history/src/App_20231001135326.tsx deleted file mode 100644 index c78457b..0000000 --- a/.history/src/App_20231001135326.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions --> Y

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135330.tsx b/.history/src/App_20231001135330.tsx deleted file mode 100644 index a90931f..0000000 --- a/.history/src/App_20231001135330.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions -

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135332.tsx b/.history/src/App_20231001135332.tsx deleted file mode 100644 index 03f7d81..0000000 --- a/.history/src/App_20231001135332.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - You

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135354.tsx b/.history/src/App_20231001135354.tsx deleted file mode 100644 index 81a5bc2..0000000 --- a/.history/src/App_20231001135354.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135409.tsx b/.history/src/App_20231001135409.tsx deleted file mode 100644 index aa3ab0d..0000000 --- a/.history/src/App_20231001135409.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You need

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135410.tsx b/.history/src/App_20231001135410.tsx deleted file mode 100644 index 4ad0f07..0000000 --- a/.history/src/App_20231001135410.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You need to

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135414.tsx b/.history/src/App_20231001135414.tsx deleted file mode 100644 index 81a5bc2..0000000 --- a/.history/src/App_20231001135414.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135422.tsx b/.history/src/App_20231001135422.tsx deleted file mode 100644 index 4dc7397..0000000 --- a/.history/src/App_20231001135422.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135436.tsx b/.history/src/App_20231001135436.tsx deleted file mode 100644 index d5fe94b..0000000 --- a/.history/src/App_20231001135436.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135442.tsx b/.history/src/App_20231001135442.tsx deleted file mode 100644 index 7d94392..0000000 --- a/.history/src/App_20231001135442.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135451.tsx b/.history/src/App_20231001135451.tsx deleted file mode 100644 index 87ed32b..0000000 --- a/.history/src/App_20231001135451.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135500.tsx b/.history/src/App_20231001135500.tsx deleted file mode 100644 index 75dc8d6..0000000 --- a/.history/src/App_20231001135500.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135505.tsx b/.history/src/App_20231001135505.tsx deleted file mode 100644 index 64af407..0000000 --- a/.history/src/App_20231001135505.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135512.tsx b/.history/src/App_20231001135512.tsx deleted file mode 100644 index db8ecaf..0000000 --- a/.history/src/App_20231001135512.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135521.tsx b/.history/src/App_20231001135521.tsx deleted file mode 100644 index c8458b2..0000000 --- a/.history/src/App_20231001135521.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135533.tsx b/.history/src/App_20231001135533.tsx deleted file mode 100644 index ee8f849..0000000 --- a/.history/src/App_20231001135533.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135549.tsx b/.history/src/App_20231001135549.tsx deleted file mode 100644 index 4fd190f..0000000 --- a/.history/src/App_20231001135549.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135603.tsx b/.history/src/App_20231001135603.tsx deleted file mode 100644 index 639a723..0000000 --- a/.history/src/App_20231001135603.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135605.tsx b/.history/src/App_20231001135605.tsx deleted file mode 100644 index 3419a51..0000000 --- a/.history/src/App_20231001135605.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135608.tsx b/.history/src/App_20231001135608.tsx deleted file mode 100644 index dcb054d..0000000 --- a/.history/src/App_20231001135608.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135619.tsx b/.history/src/App_20231001135619.tsx deleted file mode 100644 index f43a4e1..0000000 --- a/.history/src/App_20231001135619.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135627.tsx b/.history/src/App_20231001135627.tsx deleted file mode 100644 index 9d09848..0000000 --- a/.history/src/App_20231001135627.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135632.tsx b/.history/src/App_20231001135632.tsx deleted file mode 100644 index ef5bc16..0000000 --- a/.history/src/App_20231001135632.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135638.tsx b/.history/src/App_20231001135638.tsx deleted file mode 100644 index c5478d8..0000000 --- a/.history/src/App_20231001135638.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135640.tsx b/.history/src/App_20231001135640.tsx deleted file mode 100644 index 3294d2a..0000000 --- a/.history/src/App_20231001135640.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135648.tsx b/.history/src/App_20231001135648.tsx deleted file mode 100644 index 9d09848..0000000 --- a/.history/src/App_20231001135648.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135651.tsx b/.history/src/App_20231001135651.tsx deleted file mode 100644 index 96813d6..0000000 --- a/.history/src/App_20231001135651.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135653.tsx b/.history/src/App_20231001135653.tsx deleted file mode 100644 index f086d41..0000000 --- a/.history/src/App_20231001135653.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135657.tsx b/.history/src/App_20231001135657.tsx deleted file mode 100644 index 28f9555..0000000 --- a/.history/src/App_20231001135657.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135704.tsx b/.history/src/App_20231001135704.tsx deleted file mode 100644 index bb91f83..0000000 --- a/.history/src/App_20231001135704.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135709.tsx b/.history/src/App_20231001135709.tsx deleted file mode 100644 index e3cf7e8..0000000 --- a/.history/src/App_20231001135709.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135714.tsx b/.history/src/App_20231001135714.tsx deleted file mode 100644 index 21ca530..0000000 --- a/.history/src/App_20231001135714.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135717.tsx b/.history/src/App_20231001135717.tsx deleted file mode 100644 index f086d41..0000000 --- a/.history/src/App_20231001135717.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135720.tsx b/.history/src/App_20231001135720.tsx deleted file mode 100644 index 6fec240..0000000 --- a/.history/src/App_20231001135720.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135724.tsx b/.history/src/App_20231001135724.tsx deleted file mode 100644 index 7995086..0000000 --- a/.history/src/App_20231001135724.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135732.tsx b/.history/src/App_20231001135732.tsx deleted file mode 100644 index 904190d..0000000 --- a/.history/src/App_20231001135732.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135736.tsx b/.history/src/App_20231001135736.tsx deleted file mode 100644 index dcb054d..0000000 --- a/.history/src/App_20231001135736.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135800.tsx b/.history/src/App_20231001135800.tsx deleted file mode 100644 index d216736..0000000 --- a/.history/src/App_20231001135800.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135801.tsx b/.history/src/App_20231001135801.tsx deleted file mode 100644 index 802abd0..0000000 --- a/.history/src/App_20231001135801.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135803.tsx b/.history/src/App_20231001135803.tsx deleted file mode 100644 index 2989c25..0000000 --- a/.history/src/App_20231001135803.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135809.tsx b/.history/src/App_20231001135809.tsx deleted file mode 100644 index bb8b8c2..0000000 --- a/.history/src/App_20231001135809.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is made to replicate a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135829.tsx b/.history/src/App_20231001135829.tsx deleted file mode 100644 index d6d3424..0000000 --- a/.history/src/App_20231001135829.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135835.tsx b/.history/src/App_20231001135835.tsx deleted file mode 100644 index cadf933..0000000 --- a/.history/src/App_20231001135835.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You can use it like your local terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135858.tsx b/.history/src/App_20231001135858.tsx deleted file mode 100644 index 55b6ba7..0000000 --- a/.history/src/App_20231001135858.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for an.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135901.tsx b/.history/src/App_20231001135901.tsx deleted file mode 100644 index c08ad99..0000000 --- a/.history/src/App_20231001135901.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functional.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135902.tsx b/.history/src/App_20231001135902.tsx deleted file mode 100644 index 5c215f7..0000000 --- a/.history/src/App_20231001135902.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001135931.tsx b/.history/src/App_20231001135931.tsx deleted file mode 100644 index d2263dc..0000000 --- a/.history/src/App_20231001135931.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140017.tsx b/.history/src/App_20231001140017.tsx deleted file mode 100644 index 565161a..0000000 --- a/.history/src/App_20231001140017.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140037.tsx b/.history/src/App_20231001140037.tsx deleted file mode 100644 index 8051168..0000000 --- a/.history/src/App_20231001140037.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140051.tsx b/.history/src/App_20231001140051.tsx deleted file mode 100644 index 5f27501..0000000 --- a/.history/src/App_20231001140051.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140112.tsx b/.history/src/App_20231001140112.tsx deleted file mode 100644 index 562804b..0000000 --- a/.history/src/App_20231001140112.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140124.tsx b/.history/src/App_20231001140124.tsx deleted file mode 100644 index d8819f6..0000000 --- a/.history/src/App_20231001140124.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140134.tsx b/.history/src/App_20231001140134.tsx deleted file mode 100644 index d389899..0000000 --- a/.history/src/App_20231001140134.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140147.tsx b/.history/src/App_20231001140147.tsx deleted file mode 100644 index df1a087..0000000 --- a/.history/src/App_20231001140147.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140219.tsx b/.history/src/App_20231001140219.tsx deleted file mode 100644 index 92e6018..0000000 --- a/.history/src/App_20231001140219.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140236.tsx b/.history/src/App_20231001140236.tsx deleted file mode 100644 index b806255..0000000 --- a/.history/src/App_20231001140236.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140326.tsx b/.history/src/App_20231001140326.tsx deleted file mode 100644 index 3799f19..0000000 --- a/.history/src/App_20231001140326.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140400.tsx b/.history/src/App_20231001140400.tsx deleted file mode 100644 index ad24776..0000000 --- a/.history/src/App_20231001140400.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140404.tsx b/.history/src/App_20231001140404.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140404.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140410.tsx b/.history/src/App_20231001140410.tsx deleted file mode 100644 index d624b7d..0000000 --- a/.history/src/App_20231001140410.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140413.tsx b/.history/src/App_20231001140413.tsx deleted file mode 100644 index 41489fd..0000000 --- a/.history/src/App_20231001140413.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140416.tsx b/.history/src/App_20231001140416.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140416.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140419.tsx b/.history/src/App_20231001140419.tsx deleted file mode 100644 index fcee569..0000000 --- a/.history/src/App_20231001140419.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140423.tsx b/.history/src/App_20231001140423.tsx deleted file mode 100644 index c1e6d31..0000000 --- a/.history/src/App_20231001140423.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140441.tsx b/.history/src/App_20231001140441.tsx deleted file mode 100644 index 119e7d0..0000000 --- a/.history/src/App_20231001140441.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140445.tsx b/.history/src/App_20231001140445.tsx deleted file mode 100644 index 187b95e..0000000 --- a/.history/src/App_20231001140445.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140447.tsx b/.history/src/App_20231001140447.tsx deleted file mode 100644 index c3437eb..0000000 --- a/.history/src/App_20231001140447.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140603.tsx b/.history/src/App_20231001140603.tsx deleted file mode 100644 index f13d7c4..0000000 --- a/.history/src/App_20231001140603.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140611.tsx b/.history/src/App_20231001140611.tsx deleted file mode 100644 index c3437eb..0000000 --- a/.history/src/App_20231001140611.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140612.tsx b/.history/src/App_20231001140612.tsx deleted file mode 100644 index 13b2a39..0000000 --- a/.history/src/App_20231001140612.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140633.tsx b/.history/src/App_20231001140633.tsx deleted file mode 100644 index 639ecfd..0000000 --- a/.history/src/App_20231001140633.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140645.tsx b/.history/src/App_20231001140645.tsx deleted file mode 100644 index 37cc961..0000000 --- a/.history/src/App_20231001140645.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140657.tsx b/.history/src/App_20231001140657.tsx deleted file mode 100644 index 13b2a39..0000000 --- a/.history/src/App_20231001140657.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140705.tsx b/.history/src/App_20231001140705.tsx deleted file mode 100644 index 4584c93..0000000 --- a/.history/src/App_20231001140705.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140721.tsx b/.history/src/App_20231001140721.tsx deleted file mode 100644 index 4584c93..0000000 --- a/.history/src/App_20231001140721.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140723.tsx b/.history/src/App_20231001140723.tsx deleted file mode 100644 index 7ffccb1..0000000 --- a/.history/src/App_20231001140723.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140735.tsx b/.history/src/App_20231001140735.tsx deleted file mode 100644 index d5b2c2b..0000000 --- a/.history/src/App_20231001140735.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear '.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140744.tsx b/.history/src/App_20231001140744.tsx deleted file mode 100644 index 6031975..0000000 --- a/.history/src/App_20231001140744.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the .

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140746.tsx b/.history/src/App_20231001140746.tsx deleted file mode 100644 index 21ff0fe..0000000 --- a/.history/src/App_20231001140746.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231001140755.tsx b/.history/src/App_20231001140755.tsx deleted file mode 100644 index 5a71bef..0000000 --- a/.history/src/App_20231001140755.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231002184302.tsx b/.history/src/App_20231002184302.tsx deleted file mode 100644 index 0140b6c..0000000 --- a/.history/src/App_20231002184302.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/App_20231002184303.tsx b/.history/src/App_20231002184303.tsx deleted file mode 100644 index 0140b6c..0000000 --- a/.history/src/App_20231002184303.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useEffect, useRef, useState } from "react"; - -import info from "../data.json"; -import { username, hostname, path, symbol } from "../constants"; - -const options = info.options.map((option) => option.label); - -function App() { - const [history, setHistory] = useState([ - { - command: "help", - output: - "Here are the available commands:
" + options.join("
"), - }, - ]); - - const [userInput, setUserInput] = useState(""); - - const executeCommand = (command: string) => { - command = command.trim().toLowerCase(); - - if (options.includes(command)) { - let output = info.options.find( - (option) => option.label === command - )!.value; - - // check if 'data' exists within the options - if (info.options.find((option) => option.label === command)?.data) { - console.log("data exists"); - // append to output - const data = info.options.find( - (option) => option.label === command - )!.data; - - output += data?.map((item) => { - return `

- ${item.label}
- ${item.value}`; - }); - } - - setHistory((history) => [ - ...history, - { - command, - output, - }, - ]); - } else { - if (command === "help") { - setHistory((history) => [ - ...history, - { - command: command, - output: - "Here are the available commands:
" + - info.options - .map((option) => option.label + " - " + option.about) - .join("
") + - "
" + - info.additional_commands - .map((option) => option.label + " - " + option.about) - .join("
"), - }, - ]); - } else if (command === "clear") { - setHistory([]); - } else if (command === "") { - setHistory((history) => [ - ...history, - { - command: command, - output: "", - }, - ]); - } else { - setHistory((history) => [ - ...history, - { - command: command, - output: "command not found", - }, - ]); - } - } - }; - - const inputRef = useRef(null); - const focusInput = () => { - if (inputRef.current) { - inputRef.current.focus(); - } - }; - - const handleInputChange = (e: React.ChangeEvent) => { - setUserInput(e.target.value); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - executeCommand(userInput); - setUserInput(""); - }; - - useEffect(() => { - document.addEventListener("click", focusInput); - - // Cleanup the event listener when the component unmounts - return () => { - document.removeEventListener("click", focusInput); - }; - }, []); - - return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
- { - /* History */ - history.map((history) => ( -
- - {history.command}
- -
- )) - } - {/* Prompt */} -
- - -
- -
-
-
-
-
- ); -} - -const Prompt = () => { - return ( - - - {username}@{hostname} - - :{path} - {symbol} - - ); -}; - -export default App; diff --git a/.history/src/index_20231001131835.css b/.history/src/index_20231001131835.css deleted file mode 100644 index 3dd1d24..0000000 --- a/.history/src/index_20231001131835.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #300a24; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134557.css b/.history/src/index_20231001134557.css deleted file mode 100644 index d7ec15d..0000000 --- a/.history/src/index_20231001134557.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #2b2529; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134601.css b/.history/src/index_20231001134601.css deleted file mode 100644 index 178c35c..0000000 --- a/.history/src/index_20231001134601.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #2b2429; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134608.css b/.history/src/index_20231001134608.css deleted file mode 100644 index dd46734..0000000 --- a/.history/src/index_20231001134608.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #332c31; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001134611.css b/.history/src/index_20231001134611.css deleted file mode 100644 index a67e39f..0000000 --- a/.history/src/index_20231001134611.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242324; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001135943.css b/.history/src/index_20231001135943.css deleted file mode 100644 index dd46734..0000000 --- a/.history/src/index_20231001135943.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #332c31; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001135947.css b/.history/src/index_20231001135947.css deleted file mode 100644 index 3dd1d24..0000000 --- a/.history/src/index_20231001135947.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #300a24; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140011.css b/.history/src/index_20231001140011.css deleted file mode 100644 index 06e2b8a..0000000 --- a/.history/src/index_20231001140011.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140513.css b/.history/src/index_20231001140513.css deleted file mode 100644 index b51f619..0000000 --- a/.history/src/index_20231001140513.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 200; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140528.css b/.history/src/index_20231001140528.css deleted file mode 100644 index ac00e64..0000000 --- a/.history/src/index_20231001140528.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 00; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140529.css b/.history/src/index_20231001140529.css deleted file mode 100644 index fdb112d..0000000 --- a/.history/src/index_20231001140529.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 600; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140535.css b/.history/src/index_20231001140535.css deleted file mode 100644 index c054cdb..0000000 --- a/.history/src/index_20231001140535.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 800; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/.history/src/index_20231001140542.css b/.history/src/index_20231001140542.css deleted file mode 100644 index 06e2b8a..0000000 --- a/.history/src/index_20231001140542.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - /* background-color: #300a24; */ - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - display: flex; -} - -@tailwind base; -@tailwind components; -@tailwind utilities; From ed92fa9c93d4c144ff000a32c4d00cdfd559480f Mon Sep 17 00:00:00 2001 From: "Tasnimul H. Tauhid" Date: Mon, 2 Oct 2023 19:36:13 +0530 Subject: [PATCH 5/9] Fixed merge conflicts --- src/App.tsx | 86 +++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index ee5ec02..f5e8eac 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -36,12 +36,11 @@ function App() { } }; const executeCommand = (command: string) => { - if (command.trim().startsWith("setname")){ + if (command.trim().startsWith("setname")) { command = command; //Handled by previous commit - } - else{ - command = (command.split(" "))[0]; + } else { + command = command.split(" ")[0]; } command = command.trim().toLowerCase(); historyPos = history.length + 1; @@ -175,54 +174,57 @@ function App() { }, []); return ( -
-

Welcome to my portfolio!

-

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

Hint - Use 'clear' command to clear the terminal.

-
-
- { - /* History */ - history.map((history) => ( -
+
+

+ Welcome to my portfolio! +

+

+ Instructions - This portfolio is a replica of a terminal. You need to + provide commands for any functionality.{" "} +

+

+ Hint - Use 'clear' command to clear the terminal.{" "} +

+
+
+ { + /* History */ + history.map((history) => ( +
+ + {history.command}
+ +
+ )) + } + {/* Prompt */} +
- {history.command}
- + +
+ +
+
- )) - } - {/* Prompt */} -
- - -
- -
-
+
-
); } const Prompt = (props: { customUserName: string }) => { return ( - - - {username}@{hostname} - + {props.customUserName == "" ? username : props.customUserName}@ {hostname} From e2c0b9a36e2d5ceb6bbf2dee7089103f9a6a8272 Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Tue, 3 Oct 2023 12:31:11 +0530 Subject: [PATCH 6/9] Added a state to remove the welcome section when user types clear command --- src/App.tsx | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e557dc0..29e9f65 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,7 +9,26 @@ import { Queue } from "queue-typescript"; const historyCommand = new Queue(); let count = 1; let historyPos = 1; + +const WelcomeSection = () => { + return ( +
+

+ Welcome to my portfolio! +

+

+ Instructions - This portfolio is a replica of a terminal. You need to + provide commands for any functionality. +

+

+ Hint - Use 'clear' command to clear the terminal. +

+
+ ); +}; + function App() { + const [showWelcome, setShowWelcome] = useState(true); const [history, setHistory] = useState([ { command: "help", @@ -101,6 +120,7 @@ function App() { } else if (command === "clear") { setHistory([]); historyPos -= 1; + setShowWelcome(false); // Hide welcome section on clear command } else if (command === "") { setHistory((history) => [ ...history, @@ -182,7 +202,8 @@ function App() { return (
-

+ {showWelcome && } + {/*

Welcome to my portfolio!

@@ -191,7 +212,7 @@ function App() {

Hint - Use 'clear' command to clear the terminal.{" "} -

+

*/}
{ From b030ed13a98e07f1b463b674c537d8cefb09e201 Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Tue, 3 Oct 2023 18:12:03 +0530 Subject: [PATCH 7/9] Improved bg color CSS and fixed stlying of hint --- src/App.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 29e9f65..d7b69be 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,11 +16,11 @@ const WelcomeSection = () => {

Welcome to my portfolio!

-

+

Instructions - This portfolio is a replica of a terminal. You need to provide commands for any functionality.

-

+

Hint - Use 'clear' command to clear the terminal.

@@ -201,7 +201,7 @@ function App() { }, []); return ( -
+
{showWelcome && } {/*

Welcome to my portfolio! From 728cd9d52d21df48aba865dc446915e489a3ac9b Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Tue, 3 Oct 2023 18:16:00 +0530 Subject: [PATCH 8/9] Improved bg color CSS and fixed stlying of hint Again --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index d7b69be..7d9bbb0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -201,7 +201,7 @@ function App() { }, []); return ( -

+
{showWelcome && } {/*

Welcome to my portfolio! From 12817c9a9a7477e361d3e2b5d2162f80d8f83736 Mon Sep 17 00:00:00 2001 From: Ayansaxena24 Date: Wed, 11 Oct 2023 22:59:52 +0530 Subject: [PATCH 9/9] solving merge conflicts --- src/App.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 97a83d6..d6a3e9a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,6 +12,8 @@ const historyCommand = new Queue(); let count = 1; let historyPos = 1; +// + const WelcomeSection = () => { return (