From 9b1b950c4186a7234f90da4518c9ee244303b1ff Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Tue, 1 Mar 2022 16:57:20 +0100 Subject: [PATCH] Work --- .gitignore | 2 + server/server.ts | 2 +- webapp/package.json | 6 + webapp/src/components/command_palette.tsx | 6 +- webapp/src/components/filter.tsx | 88 +++++---- webapp/src/components/navigation_bar.tsx | 11 +- webapp/src/components/page_navigator.tsx | 6 +- webapp/src/editor.tsx | 42 ++-- webapp/src/function_worker.js | 4 +- webapp/src/images/logo.png | Bin 0 -> 56731 bytes webapp/src/index.html | 3 +- webapp/src/manifest.json | 17 ++ webapp/src/navigator.ts | 6 +- webapp/src/plugins/browser_system.ts | 1 + webapp/src/plugins/runtime.ts | 2 +- webapp/src/reducer.ts | 2 +- webapp/src/smart_quotes.ts | 35 ++++ webapp/src/space.ts | 1 + webapp/src/styles.css | 221 ---------------------- webapp/src/styles/editor.scss | 120 ++++++++++++ webapp/src/styles/filter_box.scss | 87 +++++++++ webapp/src/styles/main.scss | 77 ++++++++ webapp/yarn.lock | 187 +++++++++++++++++- 23 files changed, 636 insertions(+), 290 deletions(-) create mode 100644 webapp/src/images/logo.png create mode 100644 webapp/src/manifest.json create mode 100644 webapp/src/smart_quotes.ts delete mode 100644 webapp/src/styles.css create mode 100644 webapp/src/styles/editor.scss create mode 100644 webapp/src/styles/filter_box.scss create mode 100644 webapp/src/styles/main.scss diff --git a/.gitignore b/.gitignore index ad00db7..7a78dd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ pages +logo.pxd +.DS_Store diff --git a/server/server.ts b/server/server.ts index a56ec98..9c77a89 100644 --- a/server/server.ts +++ b/server/server.ts @@ -89,8 +89,8 @@ fsRouter.put("/:page(.*)", async (context) => { const text = await readAll(result.value); file.write(text); file.close(); - const stat = await Deno.stat(localPath); console.log("Wrote to", localPath); + const stat = await Deno.stat(localPath); context.response.status = existingPage ? 200 : 201; context.response.headers.set("Last-Modified", "" + stat.mtime?.getTime()); context.response.body = "OK"; diff --git a/webapp/package.json b/webapp/package.json index dba611a..0017d50 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -13,6 +13,9 @@ "check-watch": "tsc --noEmit --watch" }, "devDependencies": { + "@parcel/packager-raw-url": "2.3.2", + "@parcel/transformer-sass": "2.3.2", + "@parcel/transformer-webmanifest": "2.3.2", "@parcel/validator-typescript": "^2.3.2", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", @@ -29,6 +32,9 @@ "@codemirror/lang-markdown": "^0.19.6", "@codemirror/state": "^0.19.7", "@codemirror/view": "^0.19.42", + "@fortawesome/fontawesome-svg-core": "^1.3.0", + "@fortawesome/free-solid-svg-icons": "^6.0.0", + "@fortawesome/react-fontawesome": "^0.1.17", "@parcel/service-worker": "^2.3.2", "dexie": "^3.2.1", "idb": "^7.0.0", diff --git a/webapp/src/components/command_palette.tsx b/webapp/src/components/command_palette.tsx index f71a418..aca4172 100644 --- a/webapp/src/components/command_palette.tsx +++ b/webapp/src/components/command_palette.tsx @@ -1,6 +1,7 @@ import { AppCommand } from "../types"; import { isMacLike } from "../util"; import { FilterList, Option } from "./filter"; +import { faPersonRunning } from "@fortawesome/free-solid-svg-icons"; export function CommandPalette({ commands, @@ -20,9 +21,12 @@ export function CommandPalette({ console.log("Commands", options); return ( { if (opt) { onTrigger(commands.get(opt.name)); diff --git a/webapp/src/components/filter.tsx b/webapp/src/components/filter.tsx index 3f159f9..10440f5 100644 --- a/webapp/src/components/filter.tsx +++ b/webapp/src/components/filter.tsx @@ -1,4 +1,6 @@ import React, { useEffect, useRef, useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { IconDefinition } from "@fortawesome/free-solid-svg-icons"; export interface Option { name: string; @@ -16,17 +18,23 @@ function magicSorter(a: Option, b: Option): number { export function FilterList({ placeholder, options, + label, onSelect, onKeyPress, allowNew = false, + helpText = "", + icon, newHint, }: { placeholder: string; options: Option[]; + label: string; onKeyPress?: (key: string, currentText: string) => void; onSelect: (option: Option | undefined) => void; allowNew?: boolean; + helpText: string; newHint?: string; + icon?: IconDefinition; }) { const searchBoxRef = useRef(null); const [text, setText] = useState(""); @@ -81,40 +89,45 @@ export function FilterList({ }; }, []); - const returEl = ( -
- { - console.log("Key up", e.key); - if (onKeyPress) { - onKeyPress(e.key, text); - } - switch (e.key) { - case "ArrowUp": - setSelectionOption(Math.max(0, selectedOption - 1)); - break; - case "ArrowDown": - setSelectionOption( - Math.min(matchingOptions.length - 1, selectedOption + 1) - ); - break; - case "Enter": - onSelect(matchingOptions[selectedOption]); - e.preventDefault(); - break; - case "Escape": - onSelect(undefined); - break; - } - }} - className="input" - /> - + const returnEl = ( +
+
+ + { + console.log("Key up", e.key); + if (onKeyPress) { + onKeyPress(e.key, text); + } + switch (e.key) { + case "ArrowUp": + setSelectionOption(Math.max(0, selectedOption - 1)); + break; + case "ArrowDown": + setSelectionOption( + Math.min(matchingOptions.length - 1, selectedOption + 1) + ); + break; + case "Enter": + onSelect(matchingOptions[selectedOption]); + e.preventDefault(); + break; + case "Escape": + onSelect(undefined); + break; + } + }} + /> +
+
{matchingOptions && matchingOptions.length > 0 ? matchingOptions.map((option, idx) => ( @@ -132,7 +145,10 @@ export function FilterList({ onSelect(option); }} > - {option.name} + + {icon && } + + {option.name} {option.hint && {option.hint}}
)) @@ -147,5 +163,5 @@ export function FilterList({ }); }); - return returEl; + return returnEl; } diff --git a/webapp/src/components/navigation_bar.tsx b/webapp/src/components/navigation_bar.tsx index 2424f2e..b77f001 100644 --- a/webapp/src/components/navigation_bar.tsx +++ b/webapp/src/components/navigation_bar.tsx @@ -1,4 +1,6 @@ import { PageMeta } from "../types"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faFileLines } from "@fortawesome/free-solid-svg-icons"; export function NavigationBar({ currentPage, @@ -8,9 +10,12 @@ export function NavigationBar({ onClick: () => void; }) { return ( -
-
- » {currentPage?.name} +
+
+ + + + {currentPage?.name}
); diff --git a/webapp/src/components/page_navigator.tsx b/webapp/src/components/page_navigator.tsx index eb924ba..308012b 100644 --- a/webapp/src/components/page_navigator.tsx +++ b/webapp/src/components/page_navigator.tsx @@ -1,5 +1,6 @@ import { PageMeta } from "../types"; import { FilterList, Option } from "./filter"; +import { faFileLines } from "@fortawesome/free-solid-svg-icons"; export function PageNavigator({ allPages, @@ -28,9 +29,12 @@ export function PageNavigator({ } return ( { onNavigate(opt?.name); diff --git a/webapp/src/editor.tsx b/webapp/src/editor.tsx index 0fb5adb..fe01394 100644 --- a/webapp/src/editor.tsx +++ b/webapp/src/editor.tsx @@ -57,6 +57,7 @@ import { import { safeRun } from "./util"; import { Indexer } from "./indexer"; import { IPageNavigator, PathPageNavigator } from "./navigator"; +import { smartQuoteKeymap } from "./smart_quotes"; class PageState { editorState: EditorState; @@ -123,7 +124,7 @@ export class Editor implements AppEventDispatcher { } async loadPlugins() { - const system = new BrowserSystem("plugin"); + const system = new BrowserSystem("/plugin"); system.registerSyscalls( dbSyscalls, editorSyscalls(this), @@ -222,6 +223,7 @@ export class Editor implements AppEventDispatcher { { selector: "FencedCode", class: "line-fenced-code" }, ]), keymap.of([ + ...smartQuoteKeymap, ...closeBracketsKeymap, ...standardKeymap, ...searchKeymap, @@ -248,8 +250,8 @@ export class Editor implements AppEventDispatcher { }, }, { - key: "Ctrl-e", - mac: "Cmd-e", + key: "Ctrl-k", + mac: "Cmd-k", run: (target): boolean => { this.viewDispatch({ type: "start-navigate" }); return true; @@ -302,7 +304,6 @@ export class Editor implements AppEventDispatcher { ctx: CompletionContext ): Promise { let allCompletionResults = await this.dispatchAppEvent("editor:complete"); - // console.log("All results", allCompletionResults); if (allCompletionResults.length === 1) { return allCompletionResults[0]; } else if (allCompletionResults.length > 1) { @@ -368,13 +369,14 @@ export class Editor implements AppEventDispatcher { console.log("Page not modified, skipping saving"); return; } - // Write to file system - let text = editorState.sliceDoc(); - let pageMeta = await this.space.writePage(this.currentPage.name, text); + // Write to the space + const pageName = this.currentPage.name; + const text = editorState.sliceDoc(); + let pageMeta = await this.space.writePage(pageName, text); // Update in open page cache this.openPages.set( - this.currentPage.name, + pageName, new PageState(editorState, this.editorView!.scrollDOM.scrollTop, pageMeta) ); @@ -422,10 +424,10 @@ export class Editor implements AppEventDispatcher { console.log("File changed on disk, reloading"); let pageData = await this.space.readPage(currentPageName); this.openPages.set( - newPageMeta.name, + currentPageName, new PageState(this.createEditorState(pageData.text), 0, newPageMeta) ); - await this.loadPage(currentPageName); + await this.loadPage(currentPageName, false); } } @@ -433,11 +435,11 @@ export class Editor implements AppEventDispatcher { this.editorView!.focus(); } - async navigate(name: string) { - await this.pageNavigator.navigate(name); + navigate(name: string) { + this.pageNavigator.navigate(name); } - async loadPage(pageName: string) { + async loadPage(pageName: string, checkNewVersion: boolean = true) { let pageState = this.openPages.get(pageName); if (!pageState) { let pageData = await this.space.readPage(pageName); @@ -447,11 +449,8 @@ export class Editor implements AppEventDispatcher { pageData.meta ); this.openPages.set(pageName, pageState!); - } else { - // Loaded page from in-mory cache, let's async see if this page hasn't been updated - this.checkForNewVersion(pageState.meta).catch((e) => { - console.error("Failed to check for new version"); - }); + // Freshly loaded, no need to check for a new version either way + checkNewVersion = false; } this.editorView!.setState(pageState!.editorState); this.editorView!.scrollDOM.scrollTop = pageState!.scrollTop; @@ -470,6 +469,13 @@ export class Editor implements AppEventDispatcher { ) { await this.indexPage(pageState.editorState.sliceDoc(), pageState.meta); } + + if (checkNewVersion) { + // Loaded page from in-memory cache, let's async see if this page hasn't been updated + this.checkForNewVersion(pageState.meta).catch((e) => { + console.error("Failed to check for new version"); + }); + } } ViewComponent(): React.ReactElement { diff --git a/webapp/src/function_worker.js b/webapp/src/function_worker.js index db3e668..99a26eb 100644 --- a/webapp/src/function_worker.js +++ b/webapp/src/function_worker.js @@ -43,8 +43,8 @@ self.addEventListener("message", (event) => { let data = messageEvent.data; switch (data.type) { case "boot": - console.log("Booting", `./${data.prefix}/function/${data.name}`); - importScripts(`./${data.prefix}/function/${data.name}`); + console.log("Booting", `${data.prefix}/function/${data.name}`); + importScripts(`${data.prefix}/function/${data.name}`); self.postMessage({ type: "inited", }); diff --git a/webapp/src/images/logo.png b/webapp/src/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..58185d8d94aabbf3bbedf4715b9d738b0753b51c GIT binary patch literal 56731 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 literal 0 HcmV?d00001 diff --git a/webapp/src/index.html b/webapp/src/index.html index 9c4304c..bff3f30 100644 --- a/webapp/src/index.html +++ b/webapp/src/index.html @@ -3,8 +3,9 @@ Page - + + diff --git a/webapp/src/manifest.json b/webapp/src/manifest.json new file mode 100644 index 0000000..e613bf3 --- /dev/null +++ b/webapp/src/manifest.json @@ -0,0 +1,17 @@ +{ + "short_name": "Nugget", + "name": "Nugget", + "icons": [ + { + "src": "./images/logo.png", + "type": "image/png", + "sizes": "1024x1024" + } + ], + "capture_links": "new-client", + "start_url": "/start", + "display": "standalone", + "scope": "/", + "theme_color": "#000", + "description": "Note taking for winners" +} diff --git a/webapp/src/navigator.ts b/webapp/src/navigator.ts index 863b7d9..8e68067 100644 --- a/webapp/src/navigator.ts +++ b/webapp/src/navigator.ts @@ -17,7 +17,6 @@ function decodePageUrl(url: string): string { export class PathPageNavigator implements IPageNavigator { navigationResolve?: (value: undefined) => void; async navigate(page: string) { - console.log("Pushing state", page); window.history.pushState({ page: page }, page, `/${encodePageUrl(page)}`); window.dispatchEvent(new PopStateEvent("popstate")); await new Promise((resolve) => { @@ -27,7 +26,10 @@ export class PathPageNavigator implements IPageNavigator { } subscribe(pageLoadCallback: (pageName: string) => Promise): void { const cb = () => { - console.log("State popped", this.getCurrentPage()); + const gotoPage = this.getCurrentPage(); + if (!gotoPage) { + return; + } safeRun(async () => { await pageLoadCallback(this.getCurrentPage()); if (this.navigationResolve) { diff --git a/webapp/src/plugins/browser_system.ts b/webapp/src/plugins/browser_system.ts index 295ac50..a8401fe 100644 --- a/webapp/src/plugins/browser_system.ts +++ b/webapp/src/plugins/browser_system.ts @@ -46,6 +46,7 @@ export class BrowserSystem extends System { new URL("../plugin_sw.ts", import.meta.url), { type: "module", + scope: "/", } ); diff --git a/webapp/src/plugins/runtime.ts b/webapp/src/plugins/runtime.ts index c694ed6..b4c2fe6 100644 --- a/webapp/src/plugins/runtime.ts +++ b/webapp/src/plugins/runtime.ts @@ -18,7 +18,7 @@ export class FunctionWorker { // type: "classic", // }); let worker = window.Worker; - this.worker = new worker("function_worker.js"); + this.worker = new worker("/function_worker.js"); // console.log("Starting worker", this.worker); this.worker.onmessage = this.onmessage.bind(this); diff --git a/webapp/src/reducer.ts b/webapp/src/reducer.ts index b9f2932..2f1e651 100644 --- a/webapp/src/reducer.ts +++ b/webapp/src/reducer.ts @@ -4,7 +4,7 @@ export default function reducer( state: AppViewState, action: Action ): AppViewState { - console.log("Got action", action); + // console.log("Got action", action); switch (action.type) { case "page-loaded": return { diff --git a/webapp/src/smart_quotes.ts b/webapp/src/smart_quotes.ts new file mode 100644 index 0000000..8bc9e15 --- /dev/null +++ b/webapp/src/smart_quotes.ts @@ -0,0 +1,35 @@ +import { KeyBinding } from "@codemirror/view"; + +// TODO: Add support for selection (put quotes around or create blockquote block?) +function keyBindingForQuote( + quote: string, + left: string, + right: string +): KeyBinding { + return { + key: quote, + run: (target): boolean => { + let cursorPos = target.state.selection.main.from; + let chBefore = target.state.sliceDoc(cursorPos - 1, cursorPos); + let quote = right; + if (/\W/.exec(chBefore) && !/[!\?,\.\-=“]/.exec(chBefore)) { + quote = left; + } + target.dispatch({ + changes: { + insert: quote, + from: cursorPos, + }, + selection: { + anchor: cursorPos + 1, + }, + }); + return true; + }, + }; +} + +export const smartQuoteKeymap: KeyBinding[] = [ + keyBindingForQuote('"', "“", "”"), + keyBindingForQuote("'", "‘", "’"), +]; diff --git a/webapp/src/space.ts b/webapp/src/space.ts index 0eb03be..deebf8d 100644 --- a/webapp/src/space.ts +++ b/webapp/src/space.ts @@ -10,6 +10,7 @@ export interface Space { export class HttpRemoteSpace implements Space { url: string; + constructor(url: string) { this.url = url; } diff --git a/webapp/src/styles.css b/webapp/src/styles.css deleted file mode 100644 index 3333776..0000000 --- a/webapp/src/styles.css +++ /dev/null @@ -1,221 +0,0 @@ -:root { - --ident: 18px; - /* --editor-font: "Avenir"; */ - --editor-font: "Menlo"; - --top-bar-bg: rgb(41, 41, 41); -} - -html, -body { - height: 100%; - margin: 0; - padding: 0; -} - -#top { - height: 40px; - background-color: var(--top-bar-bg); - position: absolute; - top: 0; - left: 0; - right: 0; - color: #eee; -} - -#bottom { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 25px; - background-color: var(--top-bar-bg); - color: #eee; - margin: 0; - padding: 5px; - font-family: var(--editor-font); - text-align: right; -} - -#editor { - position: absolute; - top: 40px; - bottom: 40px; - left: 0; - right: 0; - overflow-y: hidden; -} - -.cm-editor { - width: 100%; - height: 100%; - font-size: var(--ident); -} - -@media only screen and (max-width: 800px) { - .cm-editor .cm-content { - margin: 0 10px !important; - } -} - -.cm-editor .cm-content { - font-family: var(--editor-font); - margin: auto; - max-width: 800px; -} - -.cm-editor .cm-selectionBackground { - background-color: #d7e1f6 !important; -} - -.cm-editor .h1 { - font-size: 1.5em; - color: #fff; - font-weight: bold; -} - -.cm-editor .cm-line.line-h1 { - display: block; - background-color: rgba(0, 15, 52, 0.6); -} - -.cm-editor .h1.meta { - color: orange; -} - -.cm-editor .h2 { - font-size: 1.2em; - color: #fff; - font-weight: bold; -} - -.cm-editor .cm-line.line-h2 { - display: block; - background-color: rgba(0, 15, 52, 0.6); -} - -.cm-editor .h2.meta { - color: orange; -} - -/* .cm-editor .cm-line { - padding-left: 50px; - max-width: 800px; -} */ - -.cm-editor .line-code { - background-color: #efefef; - margin-left: 30px; -} - -.cm-editor .line-fenced-code { - background-color: #efefef; -} - -.cm-editor .meta { - color: #650007; -} - -.cm-editor .line-blockquote { - background-color: #eee; - color: #676767; - text-indent: calc(-1 * (var(--ident) + 3px)); - padding-left: var(--ident); -} - -.cm-editor .emphasis { - font-style: italic; -} - -.cm-editor .strong { - font-weight: 900; -} - -.cm-editor .link:not(.meta, .url) { - color: #0330cb; - text-decoration: underline; -} - -.cm-editor .link.url { - color: #7e7d7d; -} -.cm-editor .url:not(.link) { - color: #0330cb; - text-decoration: underline; -} - -.cm-editor .wiki-link-page { - color: #0330cb; - text-decoration: underline; -} -.cm-editor .wiki-link { - color: #808080; -} - -.cm-editor .mention { - color: gray; -} - -.cm-editor .tag { - color: #8d8d8d; -} - -.cm-editor .line-li { - text-indent: calc(-1 * var(--ident) - 3px); - margin-left: var(--ident); -} - -.cm-editor .task-marker { - background-color: #ddd; -} - -.current-page { - font-family: var(--editor-font); - margin-left: 10px; - margin-top: 10px; - font-weight: bold; -} - -.filter-container { - font-family: var(--editor-font); - display: block; - border: #333 1px solid; - z-index: 1000; - position: absolute; - left: 25px; - top: 10px; - right: 10px; -} - -.filter-container .result-list { - max-height: 200px; - overflow-y: scroll; - background-color: white; -} - -.filter-container input { - font-family: var(--editor-font); - width: 100%; - /* border: 1px #333 solid; */ - background-color: var(--top-bar-bg); - color: #eee; - border: 0; - padding: 3px; - outline: 0; - font-weight: bold; -} - -.filter-container .option, -.filter-container .selected-option { - padding: 3px 3px 3px 3px; - cursor: pointer; -} - -.filter-container .selected-option { - background-color: #b1b1b1; -} - -.filter-container .hint { - float: right; - margin-right: 10px; - color: #333; -} diff --git a/webapp/src/styles/editor.scss b/webapp/src/styles/editor.scss new file mode 100644 index 0000000..ac4fdab --- /dev/null +++ b/webapp/src/styles/editor.scss @@ -0,0 +1,120 @@ +.cm-editor { + width: 100%; + height: 100%; + font-size: var(--ident); + + .cm-content { + font-family: var(--editor-font); + margin: auto; + max-width: 800px; + } + + .cm-selectionBackground { + background-color: #d7e1f6 !important; + } + + .h1 { + font-size: 1.5em; + color: #fff; + font-weight: bold; + } + + .cm-line.line-h1 { + display: block; + background-color: rgba(0, 15, 52, 0.6); + } + + .h1.meta { + color: orange; + } + + .h2 { + font-size: 1.2em; + color: #fff; + font-weight: bold; + } + + .cm-line.line-h2 { + display: block; + background-color: rgba(0, 15, 52, 0.6); + } + + .h2.meta { + color: orange; + } + + /* Color list item this way */ + .line-li .meta { + color: rgb(0, 123, 19); + } + /* Then undo other meta */ + .line-li .meta ~ .meta { + color: #650007; + } + + .line-code { + background-color: #efefef; + margin-left: 30px; + } + + .line-fenced-code { + background-color: #efefef; + } + + .meta { + color: #650007; + } + + .line-blockquote { + background-color: #eee; + color: #676767; + text-indent: calc(-1 * (var(--ident) + 3px)); + padding-left: var(--ident); + } + + .emphasis { + font-style: italic; + } + + .strong { + font-weight: 900; + } + + .link:not(.meta, .url) { + color: #0330cb; + text-decoration: underline; + } + + .link.url { + color: #7e7d7d; + } + .url:not(.link) { + color: #0330cb; + text-decoration: underline; + } + + .wiki-link-page { + color: #0330cb; + text-decoration: underline; + } + .wiki-link { + color: #808080; + } + + .mention { + color: gray; + } + + .tag { + color: #8d8d8d; + } + + .line-li { + text-indent: calc(-1 * var(--ident) - 3px); + margin-left: var(--ident); + } + + .task-marker { + background-color: #ddd; + } +} diff --git a/webapp/src/styles/filter_box.scss b/webapp/src/styles/filter_box.scss new file mode 100644 index 0000000..3e3a3d9 --- /dev/null +++ b/webapp/src/styles/filter_box.scss @@ -0,0 +1,87 @@ +.filter-box { + position: absolute; + font-family: var(--ui-font); + margin: auto; + width: 500px; + height: 600px; + background-color: #fff; + left: 0; + right: 0; + top: 0; + bottom: 0; + max-height: 290px; + overflow: auto; + z-index: 100; + border: rgb(103, 103, 103) 1px solid; + border-radius: 8px; + box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; + + label { + color: var(--highlight-color); + } + + .header { + border-bottom: 1px rgb(108, 108, 108) solid; + padding: 13px 10px 10px 10px; + } + + .help-text { + background-color: #eee; + border-bottom: 1px rgb(108, 108, 108) solid; + padding: 5px; + color: #555; + } + + .result-list { + max-height: 200px; + overflow-y: scroll; + background-color: white; + + .icon { + padding: 0 8px 0 5px; + } + .name { + padding-top: -3px; + } + } + + input { + font-family: "Arial"; + background: transparent; + color: #000; + border: 0; + padding: 3px; + outline: 0; + font-size: 1em; + } + + input::placeholder { + color: rgb(199, 199, 199); + font-weight: normal; + } + + .option, + .selected-option { + padding: 8px; + cursor: pointer; + } + + .selected-option { + background-color: var(--highlight-color); + color: #eee; + } + + .option .hint, + .selected-option .hint { + float: right; + margin-right: 0; + margin-top: -4px; + padding-left: 5px; + padding-right: 5px; + padding-top: 3px; + padding-bottom: 3px; + color: #eee; + background-color: #212476; + border-radius: 5px; + } +} diff --git a/webapp/src/styles/main.scss b/webapp/src/styles/main.scss new file mode 100644 index 0000000..5161154 --- /dev/null +++ b/webapp/src/styles/main.scss @@ -0,0 +1,77 @@ +@use "editor.scss"; +@use "filter_box.scss"; + +:root { + --ident: 18px; + /* --editor-font: "Avenir"; */ + --editor-font: "Menlo"; + --ui-font: "Arial"; + --top-bar-bg: rgb(41, 41, 41); + --highlight-color: #464cfc; +} + +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +#top { + height: 55px; + position: absolute; + top: 0; + left: 0; + right: 0; + background-color: rgb(213, 213, 213); + border-bottom: rgb(193, 193, 193) 1px solid; + color: rgb(55, 55, 55); + + .inner { + padding-top: 12px; + max-width: 800px; + font-size: 28px; + margin: auto; + } + + .current-page { + font-family: var(--ui-font); + font-weight: bold; + } + + .icon { + padding-left: 5px; + padding-right: 10px; + } +} + +#bottom { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 20px; + background-color: rgb(232, 232, 232); + color: rgb(79, 78, 78); + border-top: rgb(186, 186, 186) 1px solid; + margin: 0; + padding: 5px 10px; + font-family: var(--ui-font); + font-size: 0.9em; + text-align: right; +} + +#editor { + position: absolute; + top: 60px; + bottom: 30px; + left: 0; + right: 0; + overflow-y: hidden; +} + +@media only screen and (max-width: 800px) { + .cm-editor .cm-content { + margin: 0 10px !important; + } +} diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 01039e4..771fb4e 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -280,6 +280,32 @@ style-mod "^4.0.0" w3c-keyname "^2.2.4" +"@fortawesome/fontawesome-common-types@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.3.0.tgz#949995a05c0d8801be7e0a594f775f1dbaa0d893" + integrity sha512-CA3MAZBTxVsF6SkfkHXDerkhcQs0QPofy43eFdbWJJkZiq3SfiaH1msOkac59rQaqto5EqWnASboY1dBuKen5w== + +"@fortawesome/fontawesome-svg-core@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.3.0.tgz#343fac91fa87daa630d26420bfedfba560f85885" + integrity sha512-UIL6crBWhjTNQcONt96ExjUnKt1D68foe3xjEensLDclqQ6YagwCRYVQdrp/hW0ALRp/5Fv/VKw+MqTUWYYvPg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.3.0" + +"@fortawesome/free-solid-svg-icons@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.0.0.tgz#bed4a501b631c6cfa35c09830f7cb63ffca1589d" + integrity sha512-o4FZ1XbndcgeWNb8Wh0y+Hgf73CjmyOQowUSaqQCtgIIdS+XliSBSOwCl330wER+I6CGYE96hT27bHBPmzX2Gg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.3.0" + +"@fortawesome/react-fontawesome@^0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz#06fc06cb1a721e38e5b50b4a1cb851e9b9c77d7a" + integrity sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw== + dependencies: + prop-types "^15.8.1" + "@lezer/common@^0.15.0", "@lezer/common@^0.15.5", "@lezer/common@git://github.com/zefhemel/common.git#046c880d1fcab713cadad327a5b7d8bb5de6522c": version "0.15.11" resolved "git://github.com/zefhemel/common.git#046c880d1fcab713cadad327a5b7d8bb5de6522c" @@ -601,6 +627,14 @@ globals "^13.2.0" nullthrows "^1.1.1" +"@parcel/packager-raw-url@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@parcel/packager-raw-url/-/packager-raw-url-2.3.2.tgz#9dc8e9a5cb3f12a41ec15603aa81e973e015fcd4" + integrity sha512-xkV/fC5OtMi8xIOO6aRAQcIR2rmRfKvVCME4aXfMj4pKSqvZKyF75/UsIezAt41GTaO0H/hYIUTQUJdzI0wq5g== + dependencies: + "@parcel/plugin" "2.3.2" + "@parcel/utils" "2.3.2" + "@parcel/packager-raw@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.3.2.tgz#869cc3e7bee8ff3655891a0af400cf4e7dd4f144" @@ -816,6 +850,15 @@ "@parcel/utils" "2.3.2" react-refresh "^0.9.0" +"@parcel/transformer-sass@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@parcel/transformer-sass/-/transformer-sass-2.3.2.tgz#ee124d02acb1f44417f0d78d366302dd68aa412b" + integrity sha512-jVDdhyzfCYLY/91gOfMAT0Cj3a3czETD71WpvnXhzfctnhZZ/lhC1aFUJxlhIF1hkVNyZ1b9USCCBAD4fje2Jg== + dependencies: + "@parcel/plugin" "2.3.2" + "@parcel/source-map" "^2.0.0" + sass "^1.38.0" + "@parcel/transformer-svg@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.3.2.tgz#9a66aef5011c7bbb1fa3ce9bb52ca56d8f0f964d" @@ -830,6 +873,16 @@ posthtml-render "^3.0.0" semver "^5.7.1" +"@parcel/transformer-webmanifest@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@parcel/transformer-webmanifest/-/transformer-webmanifest-2.3.2.tgz#8796d396049b0db62e87ed5d981a21654ffe1b30" + integrity sha512-aaiDhhfag5ygjoNI1SmE3wVI/C63gABvfzp6BgkXNV/kKsqk/lSftukgcDTekSUtZNOhGJk7LeWkhm8RF38jIw== + dependencies: + "@parcel/diagnostic" "2.3.2" + "@parcel/plugin" "2.3.2" + "@parcel/utils" "2.3.2" + json-source-map "^0.6.1" + "@parcel/ts-utils@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.3.2.tgz#d63f7027574f3c1a128e1c865d683d6aacb4476d" @@ -954,6 +1007,14 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + base-x@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" @@ -961,11 +1022,23 @@ base-x@^3.0.8: dependencies: safe-buffer "^5.0.1" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.6.6: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" @@ -1019,6 +1092,21 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -1263,11 +1351,30 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + get-port@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + globals@^13.2.0: version "13.12.1" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" @@ -1309,6 +1416,11 @@ idb@^7.0.0: resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.0.tgz#f349b418c128f625961147a7d6b0e4b526fd34ed" integrity sha512-jSx0WOY9Nj+QzP6wX5e7g64jqh8ExtDs/IAuOrOEZCD/h6+0HqyrKsDMfdJc0hqhSvh0LsrwqrkDn+EtjjzSRA== +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -1322,11 +1434,35 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-json@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" integrity sha1-a+Fm0USCihMdaGiRuYPfYsOUkf8= +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -1380,7 +1516,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -loose-envify@^1.1.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -1437,6 +1573,11 @@ node-releases@^2.0.1: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -1511,6 +1652,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + postcss-calc@^8.2.0: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -1751,6 +1897,15 @@ posthtml@^0.16.4, posthtml@^0.16.5: posthtml-parser "^0.10.0" posthtml-render "^3.0.0" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -1760,6 +1915,11 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-refresh@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" @@ -1773,6 +1933,13 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + regenerator-runtime@^0.13.7: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -1788,6 +1955,15 @@ safe-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +sass@^1.38.0: + version "1.49.9" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" + integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -1801,7 +1977,7 @@ semver@^5.7.0, semver@^5.7.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -1883,6 +2059,13 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"