From 5075c3554c8d2937b2815fc9c6f6e0ac97002cb6 Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Fri, 23 Aug 2024 17:21:11 -0400 Subject: [PATCH 01/66] add vscode theme for editor --- new-log-viewer/package.json | 5 +- new-log-viewer/src/App.tsx | 100 +++++++++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/new-log-viewer/package.json b/new-log-viewer/package.json index c236450b..8ce0c12c 100644 --- a/new-log-viewer/package.json +++ b/new-log-viewer/package.json @@ -22,7 +22,10 @@ "dayjs": "^1.11.11", "monaco-editor": "^0.50.0", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "@emotion/react": "^11.13.0", + "@mui/icons-material": "^5.16.7", + "@mui/joy": "^5.0.0-beta.48" }, "devDependencies": { "@babel/core": "^7.24.5", diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index a52aba4e..f7a625a5 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -1,8 +1,104 @@ +import { + CssVarsProvider, + extendTheme, +} from "@mui/joy/styles"; + +import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; + import Layout from "./components/Layout"; import StateContextProvider from "./contexts/StateContextProvider"; import UrlContextProvider from "./contexts/UrlContextProvider"; +const monacoTheme = extendTheme({ + colorSchemes: { + light: { + palette: { + success: { + solidBg: "#007acc", + solidHoverBg: "#0062a3", + solidActiveBg: "#0062a3", + }, + neutral: { + outlinedBg: "#F6F8FA", + outlinedHoverBg: "#F3F4F6", + outlinedActiveBg: "#F3F4F6", + }, + focusVisible: "#0090f1", + }, + }, + dark: { + palette: { + success: { + solidBg: "#0e639c", + solidHoverBg: "#1177bb", + solidActiveBg: "#1177bb", + }, + neutral: { + outlinedBg: "#313131", + outlinedHoverBg: "#3c3c3c", + outlinedActiveBg: "#3c3c3c", + }, + focusVisible: "#007fd4", + }, + }, + }, + focus: { + default: { + outlineWidth: "3px", + }, + }, + fontFamily: { + body: "SF Pro Text, var(--gh-fontFamily-fallback)", + }, + components: { + JoyButton: { + styleOverrides: { + root: ({ownerState}) => ({ + borderRadius: "2px", + ...("md" === ownerState.size && { + "fontWeight": 600, + "minHeight": "32px", + "fontSize": "14px", + "--Button-paddingInline": "1rem", + }), + ...("success" === ownerState.color && + "solid" === ownerState.variant && { + "--gh-palette-focusVisible": "rgba(46, 164, 79, 0.4)", + "border": "1px solid rgba(27, 31, 36, 0.15)", + "&:active": { + boxShadow: "inset 0px 1px 0px rgba(20, 70, 32, 0.2)", + }, + }), + ...("neutral" === ownerState.color && + "outlined" === ownerState.variant && { + "&:active": { + boxShadow: "none", + }, + }), + }), + }, + }, + JoySelect: { + defaultProps: { + indicator: , + }, + styleOverrides: { + root: { + borderRadius: "2px", + }, + }, + }, + JoyInput: { + styleOverrides: { + root: { + borderRadius: "2px", + }, + }, + }, + }, +}); + /** * Renders the main application. * @@ -10,13 +106,13 @@ import UrlContextProvider from "./contexts/UrlContextProvider"; */ const App = () => { return ( - <> + - + ); }; From 3820b35c37d730a9aa816b7cefdc2b87aa835cb0 Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:55:14 -0400 Subject: [PATCH 02/66] remove unnecessary configs for monacoTheme --- new-log-viewer/src/App.tsx | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index f7a625a5..027bebab 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -1,6 +1,7 @@ import { CssVarsProvider, extendTheme, + useTheme, } from "@mui/joy/styles"; import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; @@ -62,20 +63,6 @@ const monacoTheme = extendTheme({ "fontSize": "14px", "--Button-paddingInline": "1rem", }), - ...("success" === ownerState.color && - "solid" === ownerState.variant && { - "--gh-palette-focusVisible": "rgba(46, 164, 79, 0.4)", - "border": "1px solid rgba(27, 31, 36, 0.15)", - "&:active": { - boxShadow: "inset 0px 1px 0px rgba(20, 70, 32, 0.2)", - }, - }), - ...("neutral" === ownerState.color && - "outlined" === ownerState.variant && { - "&:active": { - boxShadow: "none", - }, - }), }), }, }, From 938b7e37870afc38029e30f5043d2c760c3340fd Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:28:14 -0400 Subject: [PATCH 03/66] apply monacoTheme to buttons --- new-log-viewer/src/App.tsx | 15 +++++++-------- new-log-viewer/src/components/Layout.tsx | 23 +++++++++++++++++++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index 027bebab..4842d7c8 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -1,7 +1,6 @@ import { CssVarsProvider, extendTheme, - useTheme, } from "@mui/joy/styles"; import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; @@ -21,9 +20,9 @@ const monacoTheme = extendTheme({ solidActiveBg: "#0062a3", }, neutral: { - outlinedBg: "#F6F8FA", - outlinedHoverBg: "#F3F4F6", - outlinedActiveBg: "#F3F4F6", + solidBg: "#5f6a79", + solidHoverBg: "#4c5561", + solidActiveBg: "#4c5561", }, focusVisible: "#0090f1", }, @@ -36,9 +35,9 @@ const monacoTheme = extendTheme({ solidActiveBg: "#1177bb", }, neutral: { - outlinedBg: "#313131", - outlinedHoverBg: "#3c3c3c", - outlinedActiveBg: "#3c3c3c", + solidBg: "#313131", + solidHoverBg: "#45494e", + solidActiveBg: "#45494e", }, focusVisible: "#007fd4", }, @@ -93,7 +92,7 @@ const monacoTheme = extendTheme({ */ const App = () => { return ( - + diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 6ee937f3..936e4daa 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -7,6 +7,8 @@ import React, { import * as monaco from "monaco-editor"; +import {Button} from "@mui/joy"; + import {StateContext} from "../contexts/StateContextProvider"; import { copyPermalinkToClipboard, @@ -141,8 +143,18 @@ const ConfigForm = () => {
- - + +
); @@ -253,9 +265,12 @@ const Layout = () => { {pageNum} - +
From 0b255da647a115289630f53ea971ef45c1685c72 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:02:16 -0400 Subject: [PATCH 04/66] add missing dependencies to package.json --- new-log-viewer/package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/new-log-viewer/package.json b/new-log-viewer/package.json index 8ce0c12c..2151a484 100644 --- a/new-log-viewer/package.json +++ b/new-log-viewer/package.json @@ -18,14 +18,15 @@ }, "homepage": "https://github.com/y-scope/yscope-log-viewer#readme", "dependencies": { + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^5.16.7", + "@mui/joy": "^5.0.0-beta.48", "axios": "^1.7.2", "dayjs": "^1.11.11", "monaco-editor": "^0.50.0", "react": "^18.3.1", - "react-dom": "^18.3.1", - "@emotion/react": "^11.13.0", - "@mui/icons-material": "^5.16.7", - "@mui/joy": "^5.0.0-beta.48" + "react-dom": "^18.3.1" }, "devDependencies": { "@babel/core": "^7.24.5", From c43b9fdd9aec5ff9f928e561375769a77476b359 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:43:40 -0400 Subject: [PATCH 05/66] Switch to JoyUI Input boxes and apply monacoTheme --- new-log-viewer/src/App.tsx | 7 +++-- new-log-viewer/src/components/Layout.tsx | 35 ++++++++++++++++-------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index 4842d7c8..612ecfd9 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -49,7 +49,7 @@ const monacoTheme = extendTheme({ }, }, fontFamily: { - body: "SF Pro Text, var(--gh-fontFamily-fallback)", + body: "-apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif", }, components: { JoyButton: { @@ -92,7 +92,10 @@ const monacoTheme = extendTheme({ */ const App = () => { return ( - + diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 936e4daa..043aa20c 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -7,7 +7,10 @@ import React, { import * as monaco from "monaco-editor"; -import {Button} from "@mui/joy"; +import { + Button, + Input, +} from "@mui/joy"; import {StateContext} from "../contexts/StateContextProvider"; import { @@ -132,11 +135,15 @@ const ConfigForm = () => { {field.label} - + ))} @@ -252,12 +259,16 @@ const Layout = () => {

LogEventNum - {" "} - + {" "} | PageNum - From 634d6698b8bd4b1e190787aef1d2b4fe517bd160 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:44:03 -0400 Subject: [PATCH 06/66] Add Menu bar Icons; First page, prev page, next page and last page button linked with button handler --- new-log-viewer/src/components/Layout.tsx | 92 ++++++++++++++++++++---- 1 file changed, 80 insertions(+), 12 deletions(-) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 043aa20c..8ca3910e 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -9,9 +9,21 @@ import * as monaco from "monaco-editor"; import { Button, + IconButton, Input, } from "@mui/joy"; +import { + Description, + NavigateBefore, + NavigateNext, + Settings, + SettingsAccessibilityOutlined, + SkipNext, + SkipPrevious, + TipsAndUpdates, +} from "@mui/icons-material"; + import {StateContext} from "../contexts/StateContextProvider"; import { copyPermalinkToClipboard, @@ -195,18 +207,9 @@ const Layout = () => { copyPermalinkToClipboard({}, {logEventNum: numEvents}); }; - /** - * Handles custom actions in the editor. - * - * @param editor - * @param actionName - */ - const handleCustomAction = useCallback(( - editor: monaco.editor.IStandaloneCodeEditor, - actionName: ACTION_NAME - ) => { - const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); + const handleAction = (actionName: ACTION_NAME) => { + const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); switch (actionName) { case ACTION_NAME.FIRST_PAGE: updateWindowUrlHashParams({logEventNum: 1}); @@ -228,6 +231,29 @@ const Layout = () => { case ACTION_NAME.LAST_PAGE: updateWindowUrlHashParams({logEventNum: numEventsRef.current}); break; + default: break; + } + }; + + /** + * Handles custom actions in the editor. + * + * @param editor + * @param actionName + */ + const handleEditorCustomAction = useCallback(( + editor: monaco.editor.IStandaloneCodeEditor, + actionName: ACTION_NAME + ) => { + const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); + + switch (actionName) { + case ACTION_NAME.FIRST_PAGE: + case ACTION_NAME.PREV_PAGE: + case ACTION_NAME.NEXT_PAGE: + case ACTION_NAME.LAST_PAGE: + handleAction(actionName); + break; case ACTION_NAME.PAGE_TOP: goToPositionAndCenter(editor, {lineNumber: 1, column: 1}); break; @@ -242,6 +268,12 @@ const Layout = () => { default: break; } }, []); + const handleButtonClick = (event: React.MouseEvent) => { + const actionName = event.currentTarget.getAttribute("data-action-name") as ACTION_NAME; + if (Object.values(ACTION_NAME).includes(actionName)) { + handleAction(actionName); + } + }; // Synchronize `logEventNumRef` with `logEventNum`. useEffect(() => { @@ -255,6 +287,42 @@ const Layout = () => { return ( <> +
+ + + + + + + + + + + + + + + + + + + + + + +

LogEventNum - @@ -285,7 +353,7 @@ const Layout = () => {
- +

From a7f456a846b5b82239d2556f2062f0199f6fa255 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:35:34 -0400 Subject: [PATCH 07/66] Add Modal for Settings button --- new-log-viewer/src/components/Layout.tsx | 145 +++++++++++++---------- 1 file changed, 82 insertions(+), 63 deletions(-) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 8ca3910e..2d731a37 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -11,6 +11,7 @@ import { Button, IconButton, Input, + Modal, } from "@mui/joy"; import { @@ -274,6 +275,8 @@ const Layout = () => { handleAction(actionName); } }; + const [open, setOpen] = React.useState(false); + // Synchronize `logEventNumRef` with `logEventNum`. useEffect(() => { @@ -287,72 +290,88 @@ const Layout = () => { return ( <> -
- - - - - - - - - - - - - - - - - - - - - +
+
+ + + + + + + + + + + + + + + + { + setOpen(true); + }} + > + + + + + -
-
-

- LogEventNum - - {" "} - - {" "} - | - PageNum - - {" "} - {pageNum} -

+ { + setOpen(false); + }} + > +
+

+ LogEventNum - + {" "} + + {" "} + | + PageNum - + {" "} + {pageNum} +

- + + +
+
- -
+
+
From 65df263fa67e10aa7b4ddae1f15161fb07ae1f1e Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:14:40 -0400 Subject: [PATCH 08/66] Add status bar --- new-log-viewer/src/App.tsx | 1 - new-log-viewer/src/components/Layout.tsx | 29 ++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index 612ecfd9..1fa5328e 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -93,7 +93,6 @@ const monacoTheme = extendTheme({ const App = () => { return ( diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 2d731a37..36d6a125 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -12,6 +12,8 @@ import { IconButton, Input, Modal, + Sheet, + Typography, } from "@mui/joy"; import { @@ -290,8 +292,8 @@ const Layout = () => { return ( <> -
-
+
+ @@ -370,10 +372,29 @@ const Layout = () => {
-
-
+ +
+ {/* */} + + + Status message + + + +
); From bb5fcb72287789ba475f8dba9c7bc57893b0f1ce Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Fri, 30 Aug 2024 20:52:29 -0400 Subject: [PATCH 09/66] Support theme toggling --- new-log-viewer/src/App.tsx | 4 ++++ new-log-viewer/src/components/Layout.tsx | 29 +++++++++++++++++++++++- new-log-viewer/src/utils/config.ts | 12 ---------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index 1fa5328e..2f18f211 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -8,6 +8,8 @@ import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; import Layout from "./components/Layout"; import StateContextProvider from "./contexts/StateContextProvider"; import UrlContextProvider from "./contexts/UrlContextProvider"; +import {CONFIG_KEY} from "./typings/config"; +import {CONFIG_DEFAULT} from "./utils/config"; const monacoTheme = extendTheme({ @@ -93,6 +95,8 @@ const monacoTheme = extendTheme({ const App = () => { return ( diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 36d6a125..0f7e8a3e 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -3,6 +3,7 @@ import React, { useContext, useEffect, useRef, + useState, } from "react"; import * as monaco from "monaco-editor"; @@ -13,15 +14,19 @@ import { Input, Modal, Sheet, + ToggleButtonGroup, Typography, + useColorScheme, } from "@mui/joy"; import { + DarkMode, Description, + HdrAuto, + LightMode, NavigateBefore, NavigateNext, Settings, - SettingsAccessibilityOutlined, SkipNext, SkipPrevious, TipsAndUpdates, @@ -197,6 +202,7 @@ const handleLogEventNumInputChange = (ev: React.ChangeEvent) = * @return */ const Layout = () => { + const {setMode, mode} = useColorScheme(); const { pageNum, numEvents, @@ -206,6 +212,8 @@ const Layout = () => { const logEventNumRef = useRef>(logEventNum); const numEventsRef = useRef>(numEvents); + const [theme, setTheme] = useState(getConfig(CONFIG_KEY.THEME)); + const handleCopyLinkButtonClick = () => { copyPermalinkToClipboard({}, {logEventNum: numEvents}); }; @@ -331,6 +339,25 @@ const Layout = () => { + + { setMode("light"); }} + > + + + { setMode("dark"); }} + > + + + { setMode("system"); }} + > + + + => { result = "Decoder options cannot be empty."; } break; - case CONFIG_KEY.THEME: - if (false === (Object.values(THEME_NAME)).includes(value)) { - result = "Invalid theme name."; - } - break; case CONFIG_KEY.PAGE_SIZE: if (0 >= value || MAX_PAGE_SIZE < value) { result = `Page size must be greater than 0 and less than ${MAX_PAGE_SIZE + 1}.`; @@ -88,9 +83,6 @@ const setConfig = ({key, value}: ConfigUpdate): Nullable => { value.timestampKey ); break; - case CONFIG_KEY.THEME: - window.localStorage.setItem(LOCAL_STORAGE_KEY.THEME, value); - break; case CONFIG_KEY.PAGE_SIZE: window.localStorage.setItem(LOCAL_STORAGE_KEY.PAGE_SIZE, value.toString()); break; @@ -124,10 +116,6 @@ const getConfig = (key: T): ConfigMap[T] => { ), } as DecoderOptionsType; break; - case CONFIG_KEY.THEME: { - value = window.localStorage.getItem(LOCAL_STORAGE_KEY.THEME); - break; - } case CONFIG_KEY.PAGE_SIZE: value = window.localStorage.getItem(LOCAL_STORAGE_KEY.PAGE_SIZE); break; From d1d1f23aacd8006550991d84affd772440f2da64 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:04:18 -0400 Subject: [PATCH 10/66] Avoid hard coding for permalink copying --- new-log-viewer/src/components/Layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 0f7e8a3e..30c753d4 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -411,7 +411,7 @@ const Layout = () => { > Status message - + + + + + + + + + + + ); +}; + +/** + * Renders the major layout of the log viewer. + * + * @return + */ +const Layout = () => { + const { + numEvents, + } = useContext(StateContext); + const {logEventNum} = useContext(UrlContext); + + const logEventNumRef = useRef>(logEventNum); + const numEventsRef = useRef>(numEvents); + + const handleCopyLinkButtonClick = () => { + copyPermalinkToClipboard({}, {}); }; /** @@ -250,14 +385,15 @@ const Layout = () => { editor: monaco.editor.IStandaloneCodeEditor, actionName: ACTION_NAME ) => { - const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); - + if (null === logEventNumRef.current || null === numEventsRef.current) { + return; + } switch (actionName) { case ACTION_NAME.FIRST_PAGE: case ACTION_NAME.PREV_PAGE: case ACTION_NAME.NEXT_PAGE: case ACTION_NAME.LAST_PAGE: - handleAction(actionName); + handleAction(actionName, logEventNumRef.current, numEventsRef.current); break; case ACTION_NAME.PAGE_TOP: goToPositionAndCenter(editor, {lineNumber: 1, column: 1}); @@ -270,16 +406,10 @@ const Layout = () => { goToPositionAndCenter(editor, {lineNumber: lineCount, column: 1}); break; } - default: break; + default: + break; } }, []); - const handleButtonClick = (event: React.MouseEvent) => { - const actionName = event.currentTarget.getAttribute("data-action-name") as ACTION_NAME; - if (Object.values(ACTION_NAME).includes(actionName)) { - handleAction(actionName); - } - }; - const [open, setOpen] = React.useState(false); // Synchronize `logEventNumRef` with `logEventNum`. @@ -294,122 +424,34 @@ const Layout = () => { return ( <> -
- - - - - - - - - - - - - - - - - { - setOpen(true); - }} - > - - - - - - - { setMode("light"); }} - > - - - { setMode("dark"); }} - > - - - { setMode("system"); }} - > - - - - - { - setOpen(false); - }} - > -
-

- LogEventNum - - {" "} - - {" "} - | - PageNum - - {" "} - {pageNum} -

- - - -
-
- -
-
- - - +
+ +
+ + - -
- {/* */} - +
+ Status message - -
From c934ee0e6a506bea910dac92ce25efd744500830 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Tue, 3 Sep 2024 09:33:14 -0400 Subject: [PATCH 14/66] Update initial state of settingsModelOpen to false. --- new-log-viewer/src/components/Layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index e5c0154f..3a8ce179 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -222,7 +222,7 @@ const MenuBar = () => { const {fileName, loadFile, numEvents} = useContext(StateContext); - const [settingsModelOpen, setSettingsModelOpen] = useState(true); + const [settingsModelOpen, setSettingsModelOpen] = useState(false); const handleNavButtonClick = (event: React.MouseEvent) => { if (null === logEventNum) { From 6a82d808ec194542855ac83122661da767fd8170 Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Thu, 5 Sep 2024 12:24:42 -0400 Subject: [PATCH 15/66] Move ConfigForm & theme to new separate files; Create SmallIconNavButton and SmallIconButton to avoid code duplication --- new-log-viewer/src/App.tsx | 82 +------ new-log-viewer/src/components/ConfigForm.tsx | 134 ++++++++++++ new-log-viewer/src/components/Layout.tsx | 215 ++++--------------- new-log-viewer/src/utils/theme.tsx | 75 +++++++ 4 files changed, 258 insertions(+), 248 deletions(-) create mode 100644 new-log-viewer/src/components/ConfigForm.tsx create mode 100644 new-log-viewer/src/utils/theme.tsx diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index a59b9a85..b01f4ef2 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -1,91 +1,13 @@ -import { - CssVarsProvider, - extendTheme, -} from "@mui/joy/styles"; - -import KeyboardArrowDown from "@mui/icons-material/KeyboardArrowDown"; +import {CssVarsProvider} from "@mui/joy/styles"; import Layout from "./components/Layout"; import StateContextProvider from "./contexts/StateContextProvider"; import UrlContextProvider from "./contexts/UrlContextProvider"; import {CONFIG_KEY} from "./typings/config"; import {CONFIG_DEFAULT} from "./utils/config"; +import monacoTheme from "./utils/theme"; -const monacoTheme = extendTheme({ - colorSchemes: { - light: { - palette: { - success: { - solidBg: "#007acc", - solidHoverBg: "#0062a3", - solidActiveBg: "#0062a3", - }, - neutral: { - solidBg: "#5f6a79", - solidHoverBg: "#4c5561", - solidActiveBg: "#4c5561", - }, - focusVisible: "#0090f1", - }, - }, - dark: { - palette: { - success: { - solidBg: "#0e639c", - solidHoverBg: "#1177bb", - solidActiveBg: "#1177bb", - }, - neutral: { - solidBg: "#313131", - solidHoverBg: "#45494e", - solidActiveBg: "#45494e", - }, - focusVisible: "#007fd4", - }, - }, - }, - focus: { - default: { - outlineWidth: "3px", - }, - }, - fontFamily: { - body: "-apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif", - }, - components: { - JoyButton: { - styleOverrides: { - root: ({ownerState}) => ({ - borderRadius: "2px", - ...("md" === ownerState.size && { - "fontWeight": 600, - "fontSize": "14px", - "--Button-paddingInline": "1rem", - }), - }), - }, - }, - JoySelect: { - defaultProps: { - indicator: , - }, - styleOverrides: { - root: { - borderRadius: "2px", - }, - }, - }, - JoyInput: { - styleOverrides: { - root: { - borderRadius: "2px", - }, - }, - }, - }, -}); - /** * Renders the main application. * diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx new file mode 100644 index 00000000..3e72aba8 --- /dev/null +++ b/new-log-viewer/src/components/ConfigForm.tsx @@ -0,0 +1,134 @@ +import React from "react"; + +import { + Button, + Input, +} from "@mui/joy"; + +import { + CONFIG_KEY, + LOCAL_STORAGE_KEY, +} from "../typings/config"; +import { + getConfig, + setConfig, +} from "../utils/config"; + + +const formFields = [ + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), + label: LOCAL_STORAGE_KEY.PAGE_SIZE, + name: LOCAL_STORAGE_KEY.PAGE_SIZE, + type: "number", + }, +]; + +/** + * Renders a form for testing config utilities. + * + * @return + */ +const ConfigForm = () => { + const handleConfigFormReset = (ev: React.FormEvent) => { + ev.preventDefault(); + window.localStorage.clear(); + window.location.reload(); + }; + + const handleConfigFormSubmit = (ev: React.FormEvent) => { + ev.preventDefault(); + const formData = new FormData(ev.target as HTMLFormElement); + + const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); + const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); + const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); + const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); + let error = null; + if ( + "string" === typeof formatString && + "string" === typeof logLevelKey && + "string" === typeof timestampKey + ) { + error ||= setConfig({ + key: CONFIG_KEY.DECODER_OPTIONS, + value: {formatString, logLevelKey, timestampKey}, + }); + } + if ("string" === typeof pageSize) { + error ||= setConfig({ + key: CONFIG_KEY.PAGE_SIZE, + value: Number(pageSize), + }); + } + if (null !== error) { + // eslint-disable-next-line no-alert + window.alert(error); + } else { + window.location.reload(); + } + }; + + return ( +
+ + + {formFields.map((field, index) => ( + + + + + ))} + +
+ {field.label} + + +
+
+ + +
+
+ ); +}; + +export default ConfigForm; diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 3a8ce179..3ddecc84 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -13,7 +13,6 @@ import { DialogContent, DialogTitle, IconButton, - Input, Modal, ModalDialog, Sheet, @@ -32,6 +31,7 @@ import { Settings, SkipNext, SkipPrevious, + SvgIconComponent, TipsAndUpdates, } from "@mui/icons-material"; import FileOpenIcon from "@mui/icons-material/FileOpen"; @@ -46,143 +46,22 @@ import { import {Nullable} from "../typings/common"; import { CONFIG_KEY, - LOCAL_STORAGE_KEY, THEME_NAME, } from "../typings/config"; import {CURSOR_CODE} from "../typings/worker"; import {ACTION_NAME} from "../utils/actions"; -import { - getConfig, - setConfig, -} from "../utils/config"; +import {getConfig} from "../utils/config"; import {openFile} from "../utils/file"; import { getFirstItemNumInNextChunk, getLastItemNumInPrevChunk, } from "../utils/math"; +import ConfigForm from "./ConfigForm"; import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; -const formFields = [ - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), - label: LOCAL_STORAGE_KEY.PAGE_SIZE, - name: LOCAL_STORAGE_KEY.PAGE_SIZE, - type: "number", - }, -]; - -/** - * Renders a form for testing config utilities. - * - * @return - */ -const ConfigForm = () => { - const handleConfigFormReset = (ev: React.FormEvent) => { - ev.preventDefault(); - window.localStorage.clear(); - window.location.reload(); - }; - - const handleConfigFormSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - const formData = new FormData(ev.target as HTMLFormElement); - - const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); - const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); - const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); - const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); - let error = null; - if ( - "string" === typeof formatString && - "string" === typeof logLevelKey && - "string" === typeof timestampKey - ) { - error ||= setConfig({ - key: CONFIG_KEY.DECODER_OPTIONS, - value: {formatString, logLevelKey, timestampKey}, - }); - } - if ("string" === typeof pageSize) { - error ||= setConfig({ - key: CONFIG_KEY.PAGE_SIZE, - value: Number(pageSize), - }); - } - if (null !== error) { - // eslint-disable-next-line no-alert - window.alert(error); - } else { - window.location.reload(); - } - }; - - return ( -
- - - {formFields.map((field, index) => ( - - - - - ))} - -
- {field.label} - - -
-
- - -
-
- ); -}; - - /** * * @param actionName @@ -240,7 +119,29 @@ const MenuBar = () => { }); }; - const iconCommonProps: { size: "sm" | "md" | "lg" } = {size: "sm"}; + const SmallNavIconButton = ({actionName, Icon}: { + actionName: string, + Icon: SvgIconComponent, + }) => ( + + + + ); + const SmallIconButton = ({onClick, Icon}: { + onClick: (event: React.MouseEvent) => void, + Icon: SvgIconComponent, + }) => ( + + + + ); return ( { {fileName} - - - - - - - - - - - - - - - - + + + + + { setSettingsModelOpen(true); - }} - > - - + }}/> @@ -322,11 +201,11 @@ const MenuBar = () => { Settings { setMode(newValue as Mode); }} - {...iconCommonProps} - value={mode as string} > - +
+ +
+ + +
- + + + Status message + + + +
); }; From 3d17738ffcee7e93ef772651533351b922c9a978 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Fri, 6 Sep 2024 15:47:43 -0400 Subject: [PATCH 21/66] Apply suggestions from code review Co-authored-by: Junhao Liao --- new-log-viewer/src/components/ConfigForm.tsx | 6 ++++-- new-log-viewer/src/components/Layout.css | 3 +-- new-log-viewer/src/utils/theme.tsx | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx index 3e72aba8..9a57cf55 100644 --- a/new-log-viewer/src/components/ConfigForm.tsx +++ b/new-log-viewer/src/components/ConfigForm.tsx @@ -43,7 +43,7 @@ const formFields = [ ]; /** - * Renders a form for testing config utilities. + * Renders a configuration settings form. * * @return */ @@ -80,6 +80,8 @@ const ConfigForm = () => { }); } if (null !== error) { + // eslint-disable-next-line no-warning-comments + // TODO: Show an error pop-up once NotificationProvider is implemented. // eslint-disable-next-line no-alert window.alert(error); } else { @@ -118,7 +120,7 @@ const ConfigForm = () => { +
- - - Status message - - - -
+
); }; From d27c65cb9ed099bbe137f418d022bb7e31aa7add Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Fri, 6 Sep 2024 18:39:21 -0400 Subject: [PATCH 24/66] Extract MenuBar & StatusBar out of Layout --- new-log-viewer/src/components/Layout.css | 7 +- new-log-viewer/src/components/Layout.tsx | 264 ++------------------ new-log-viewer/src/components/MenuBar.tsx | 224 +++++++++++++++++ new-log-viewer/src/components/StatusBar.tsx | 38 +++ 4 files changed, 285 insertions(+), 248 deletions(-) create mode 100644 new-log-viewer/src/components/MenuBar.tsx create mode 100644 new-log-viewer/src/components/StatusBar.tsx diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index 01044f9a..f4f58c9c 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -5,7 +5,6 @@ .menu-bar { display: flex; flex-direction: row; - height: 32px; align-items: center; } @@ -17,7 +16,6 @@ align-items: center; bottom: 0; display: flex; - height: 30px; position: absolute; width: 100%; } @@ -29,3 +27,8 @@ .status-button { min-height: 0; } + +:root { + --status-bar-height: 32px; + --menu-bar-height: 32px; +} diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 5609a314..cf3b6acf 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -1,245 +1,36 @@ -import React, { +import { useCallback, useContext, useEffect, useRef, - useState, } from "react"; import * as monaco from "monaco-editor"; -import { - Button, - DialogContent, - DialogTitle, - IconButton, - Modal, - ModalDialog, - Sheet, - ToggleButtonGroup, - Typography, - useColorScheme, -} from "@mui/joy"; import {CssVarsProvider} from "@mui/joy/styles"; -import type {Mode} from "@mui/system/cssVars/useCurrentColorScheme"; - -import {SvgIconComponent} from "@mui/icons-material"; -import DarkMode from "@mui/icons-material/DarkMode"; -import Description from "@mui/icons-material/Description"; -import FileOpenIcon from "@mui/icons-material/FileOpen"; -import LightMode from "@mui/icons-material/LightMode"; -import NavigateBefore from "@mui/icons-material/NavigateBefore"; -import NavigateNext from "@mui/icons-material/NavigateNext"; -import Settings from "@mui/icons-material/Settings"; -import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; -import SkipNext from "@mui/icons-material/SkipNext"; -import SkipPrevious from "@mui/icons-material/SkipPrevious"; -import TipsAndUpdates from "@mui/icons-material/TipsAndUpdates"; import {StateContext} from "../contexts/StateContextProvider"; import { copyPermalinkToClipboard, - updateWindowUrlHashParams, UrlContext, } from "../contexts/UrlContextProvider"; import {Nullable} from "../typings/common"; -import { - CONFIG_KEY, - THEME_NAME, -} from "../typings/config"; -import {CURSOR_CODE} from "../typings/worker"; +import {CONFIG_KEY} from "../typings/config"; import {ACTION_NAME} from "../utils/actions"; -import { - CONFIG_DEFAULT, - getConfig, -} from "../utils/config"; -import {openFile} from "../utils/file"; -import { - getFirstItemNumInNextChunk, - getLastItemNumInPrevChunk, -} from "../utils/math"; +import {CONFIG_DEFAULT} from "../utils/config"; import monacoTheme from "../utils/theme"; -import ConfigForm from "./ConfigForm"; import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; +import { + handleAction, + MenuBar, +} from "./MenuBar"; +import {StatusBar} from "./StatusBar"; import "./Layout.css"; -/** - * - * @param actionName - * @param logEventNum - * @param numEvents - */ -const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEvents: number) => { - const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); - switch (actionName) { - case ACTION_NAME.FIRST_PAGE: - updateWindowUrlHashParams({logEventNum: 1}); - break; - case ACTION_NAME.PREV_PAGE: - updateWindowUrlHashParams({ - logEventNum: getLastItemNumInPrevChunk(logEventNum, pageSize), - }); - break; - case ACTION_NAME.NEXT_PAGE: - updateWindowUrlHashParams({ - logEventNum: getFirstItemNumInNextChunk(logEventNum, pageSize), - }); - break; - case ACTION_NAME.LAST_PAGE: - updateWindowUrlHashParams({logEventNum: numEvents}); - break; - default: - break; - } -}; - -/** - * - */ -const MenuBar = () => { - const {setMode, mode} = useColorScheme(); - const {logEventNum} = useContext(UrlContext); - const {fileName, loadFile, numEvents} = useContext(StateContext); - - const [settingsModelOpen, setSettingsModelOpen] = useState(false); - - const handleNavButtonClick = (event: React.MouseEvent) => { - if (null === logEventNum) { - return; - } - const {actionName} = event.currentTarget.dataset as {actionName: ACTION_NAME}; - if (Object.values(ACTION_NAME).includes(actionName)) { - handleAction(actionName, logEventNum, numEvents); - } - }; - - const handleOpenFileButtonClick = () => { - openFile((file) => { - loadFile(file, {code: CURSOR_CODE.LAST_EVENT, args: null}); - }); - }; - - const SmallNavIconButton = ({actionName, Icon}: { - actionName: string, - Icon: SvgIconComponent, - }) => ( - - - - ); - const SmallIconButton = ({onClick, Icon}: { - onClick: (event: React.MouseEvent) => void, - Icon: SvgIconComponent, - }) => ( - - - - ); - - return ( - - - - {fileName} - - - - - - - - { - setSettingsModelOpen(true); - }}/> - - - - { - setSettingsModelOpen(false); - }} - > - - - - Settings - - { - setMode(newValue as Mode); - }} - > - - - - - - - - - - - - ); -}; - /** * Renders the major layout of the log viewer. * @@ -295,40 +86,21 @@ const Layout = () => { }, [numEvents]); return ( + + // FIXME: these components doesn't apply Layout.css properties -
- -
- - - -
- - - Status message - - - -
+ + + + +
); }; diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx new file mode 100644 index 00000000..d8728c99 --- /dev/null +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -0,0 +1,224 @@ +import React, { + useContext, + useState, +} from "react"; + +import { + Button, + DialogContent, + DialogTitle, + IconButton, + Modal, + ModalDialog, + Sheet, + ToggleButtonGroup, + Typography, + useColorScheme, +} from "@mui/joy"; +import type {Mode} from "@mui/system/cssVars/useCurrentColorScheme"; + +import {SvgIconComponent} from "@mui/icons-material"; +import DarkMode from "@mui/icons-material/DarkMode"; +import Description from "@mui/icons-material/Description"; +import FileOpenIcon from "@mui/icons-material/FileOpen"; +import LightMode from "@mui/icons-material/LightMode"; +import NavigateBefore from "@mui/icons-material/NavigateBefore"; +import NavigateNext from "@mui/icons-material/NavigateNext"; +import Settings from "@mui/icons-material/Settings"; +import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; +import SkipNext from "@mui/icons-material/SkipNext"; +import SkipPrevious from "@mui/icons-material/SkipPrevious"; +import TipsAndUpdates from "@mui/icons-material/TipsAndUpdates"; + +import {StateContext} from "../contexts/StateContextProvider"; +import { + updateWindowUrlHashParams, + UrlContext, +} from "../contexts/UrlContextProvider"; +import { + CONFIG_KEY, + THEME_NAME, +} from "../typings/config"; +import {CURSOR_CODE} from "../typings/worker"; +import {ACTION_NAME} from "../utils/actions"; +import {getConfig} from "../utils/config"; +import {openFile} from "../utils/file"; +import { + getFirstItemNumInNextChunk, + getLastItemNumInPrevChunk, +} from "../utils/math"; +import ConfigForm from "./ConfigForm"; + + +/** + * + * @param actionName + * @param logEventNum + * @param numEvents + */ +export const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEvents: number) => { + const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); + switch (actionName) { + case ACTION_NAME.FIRST_PAGE: + updateWindowUrlHashParams({logEventNum: 1}); + break; + case ACTION_NAME.PREV_PAGE: + updateWindowUrlHashParams({ + logEventNum: getLastItemNumInPrevChunk(logEventNum, pageSize), + }); + break; + case ACTION_NAME.NEXT_PAGE: + updateWindowUrlHashParams({ + logEventNum: getFirstItemNumInNextChunk(logEventNum, pageSize), + }); + break; + case ACTION_NAME.LAST_PAGE: + updateWindowUrlHashParams({logEventNum: numEvents}); + break; + default: + break; + } +}; + +/** + * + */ +export const MenuBar = () => { + const {setMode, mode} = useColorScheme(); + const {logEventNum} = useContext(UrlContext); + const {fileName, loadFile, numEvents} = useContext(StateContext); + + const [settingsModelOpen, setSettingsModelOpen] = useState(false); + + const handleNavButtonClick = (event: React.MouseEvent) => { + if (null === logEventNum) { + return; + } + const {actionName} = event.currentTarget.dataset as { actionName: ACTION_NAME }; + if (Object.values(ACTION_NAME).includes(actionName)) { + handleAction(actionName, logEventNum, numEvents); + } + }; + + const handleOpenFileButtonClick = () => { + openFile((file) => { + loadFile(file, {code: CURSOR_CODE.LAST_EVENT, args: null}); + }); + }; + + const SmallNavIconButton = ({actionName, Icon}: { + actionName: string, + Icon: SvgIconComponent, + }) => ( + + + + ); + const SmallIconButton = ({onClick, Icon}: { + onClick: (event: React.MouseEvent) => void, + Icon: SvgIconComponent, + }) => ( + + + + ); + + return ( + + + + {fileName} + + + + + + + + { + setSettingsModelOpen(true); + }}/> + + + + { + setSettingsModelOpen(false); + }} + > + + + + Settings + + { + setMode(newValue as Mode); + }} + > + + + + + + + + + + + + ); +}; diff --git a/new-log-viewer/src/components/StatusBar.tsx b/new-log-viewer/src/components/StatusBar.tsx new file mode 100644 index 00000000..98949feb --- /dev/null +++ b/new-log-viewer/src/components/StatusBar.tsx @@ -0,0 +1,38 @@ +import React from "react"; + +import Button from "@mui/joy/Button"; +import Sheet from "@mui/joy/Sheet"; +import Typography from "@mui/joy/Typography"; + + +interface StatusBarProps { + handleCopyLinkButtonClick: () => void; + logEventNum: number | null; + numEvents: number | null; +} + +export const StatusBar: React.FC = ({handleCopyLinkButtonClick, logEventNum, numEvents}) => { + return ( + + + Status message + + + + ); +}; From 7f3add49c6d528ed5d5ad480a8b1438611bc2e10 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:24:30 -0400 Subject: [PATCH 25/66] move inline styling to Layout.css --- new-log-viewer/src/components/ConfigForm.tsx | 11 +---- .../src/components/Editor/index.tsx | 20 +++++---- new-log-viewer/src/components/Layout.css | 42 +++++++++++++++---- new-log-viewer/src/components/Layout.tsx | 32 +++++++------- new-log-viewer/src/components/MenuBar.tsx | 20 ++------- 5 files changed, 64 insertions(+), 61 deletions(-) diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx index 80cc41bd..d687f5ff 100644 --- a/new-log-viewer/src/components/ConfigForm.tsx +++ b/new-log-viewer/src/components/ConfigForm.tsx @@ -96,24 +96,15 @@ const ConfigForm = () => { onSubmit={handleConfigFormSubmit} > {formFields.map((field, index) => ( - - // FIXME: Styling needs to be extracted to a CSS file. {field.label} { ]); return ( - +
+ +
); }; diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index f4f58c9c..bb2d182d 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -1,15 +1,36 @@ -.container { +:root { + --status-bar-height: 32px; + --menu-bar-height: 32px; +} + +.layout { height: 100vh; + display: flex; + flex-direction: column; } .menu-bar { display: flex; - flex-direction: row; + flexDirection: "row"; + height: var(--status-bar-height); + alignItems: "center"; +} + +.menu-bar-typography { + align-items: center; + display: flex; + flex-grow: 1; + gap: 2px; +} + +.menu-bar-modal { + display: flex; + justify-content: space-between; align-items: center; } -.editor-container { - height: calc(100vh - 32px - 32px); +.editor { + height: calc(100vh - var(--menu-bar-height) - var(--status-bar-height)); } .status-bar { @@ -20,6 +41,14 @@ width: 100%; } +.config-form-control { + display: flex; + justify-content: space-between; + flex-grow: 1; + margin-bottom: 16px; + width: 100%; +} + .status-message { flex-grow: 1; } @@ -27,8 +56,3 @@ .status-button { min-height: 0; } - -:root { - --status-bar-height: 32px; - --menu-bar-height: 32px; -} diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index cf3b6acf..e0eab0d7 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -86,22 +86,22 @@ const Layout = () => { }, [numEvents]); return ( - - // FIXME: these components doesn't apply Layout.css properties - - - - - - - +
+ + + + + + + +
); }; diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index d8728c99..c0fc31af 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -131,21 +131,8 @@ export const MenuBar = () => { ); return ( - - + + {fileName} @@ -177,13 +164,12 @@ export const MenuBar = () => { { setSettingsModelOpen(false); }} > - + Settings From 860f91a03aa2f1f2a4c73b33d1b029116ddc1bd5 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:12:30 -0400 Subject: [PATCH 26/66] Apply suggestions from code review Co-authored-by: Junhao Liao --- new-log-viewer/src/components/ConfigForm.tsx | 9 +++++---- new-log-viewer/src/components/MenuBar.tsx | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx index d687f5ff..08a0f585 100644 --- a/new-log-viewer/src/components/ConfigForm.tsx +++ b/new-log-viewer/src/components/ConfigForm.tsx @@ -58,11 +58,12 @@ const ConfigForm = () => { const handleConfigFormSubmit = (ev: React.FormEvent) => { ev.preventDefault(); const formData = new FormData(ev.target as HTMLFormElement); + const getFormDataValue = (key: string) => formData.get(key) as string; - const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); - const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); - const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); - const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); + const formatString = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); + const logLevelKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); + const timestampKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); + const pageSize = getFormDataValue(LOCAL_STORAGE_KEY.PAGE_SIZE); let error = null; if ( "string" === typeof formatString && diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index c0fc31af..cfc85a20 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -168,7 +168,7 @@ export const MenuBar = () => { setSettingsModelOpen(false); }} > - + Settings From 6511129e59098384e1b79b75f97eb3a967c4d9bd Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:30:36 -0400 Subject: [PATCH 27/66] pull config handle functions out of ConfigForm(); add CONFIG_KEY.THEME case check back to avoid IDE screaming --- new-log-viewer/src/components/ConfigForm.tsx | 93 +++++++++++--------- new-log-viewer/src/utils/config.ts | 9 ++ 2 files changed, 61 insertions(+), 41 deletions(-) diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx index 08a0f585..74318eac 100644 --- a/new-log-viewer/src/components/ConfigForm.tsx +++ b/new-log-viewer/src/components/ConfigForm.tsx @@ -44,53 +44,64 @@ const formFields = [ ]; /** - * Renders a configuration settings form. + * Handles the reset event for the configuration form. * + * @param ev The form event triggered by the reset action. * @return */ -const ConfigForm = () => { - const handleConfigFormReset = (ev: React.FormEvent) => { - ev.preventDefault(); - window.localStorage.clear(); - window.location.reload(); - }; +const handleConfigFormReset = (ev: React.FormEvent) => { + ev.preventDefault(); + window.localStorage.clear(); + window.location.reload(); +}; - const handleConfigFormSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - const formData = new FormData(ev.target as HTMLFormElement); - const getFormDataValue = (key: string) => formData.get(key) as string; +/** + * Handles the submit event for the configuration form. + * + * @param ev The form event triggered by the submit action. + * @return + */ +const handleConfigFormSubmit = (ev: React.FormEvent) => { + ev.preventDefault(); + const formData = new FormData(ev.target as HTMLFormElement); - const formatString = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); - const logLevelKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); - const timestampKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); - const pageSize = getFormDataValue(LOCAL_STORAGE_KEY.PAGE_SIZE); - let error = null; - if ( - "string" === typeof formatString && - "string" === typeof logLevelKey && - "string" === typeof timestampKey - ) { - error ||= setConfig({ - key: CONFIG_KEY.DECODER_OPTIONS, - value: {formatString, logLevelKey, timestampKey}, - }); - } - if ("string" === typeof pageSize) { - error ||= setConfig({ - key: CONFIG_KEY.PAGE_SIZE, - value: Number(pageSize), - }); - } - if (null !== error) { - // eslint-disable-next-line no-warning-comments - // TODO: Show an error pop-up once NotificationProvider is implemented. - // eslint-disable-next-line no-alert - window.alert(error); - } else { - window.location.reload(); - } - }; + const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); + const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); + const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); + const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); + let error = null; + if ( + "string" === typeof formatString && + "string" === typeof logLevelKey && + "string" === typeof timestampKey + ) { + error ||= setConfig({ + key: CONFIG_KEY.DECODER_OPTIONS, + value: {formatString, logLevelKey, timestampKey}, + }); + } + if ("string" === typeof pageSize) { + error ||= setConfig({ + key: CONFIG_KEY.PAGE_SIZE, + value: Number(pageSize), + }); + } + if (null !== error) { + // eslint-disable-next-line no-warning-comments + // TODO: Show an error pop-up once NotificationProvider is implemented. + // eslint-disable-next-line no-alert + window.alert(error); + } else { + window.location.reload(); + } +}; +/** + * Renders a configuration settings form. + * + * @return + */ +const ConfigForm = () => { return (
=> { result = "Decoder options cannot be empty."; } break; + case CONFIG_KEY.THEME: + result = "Theming should be handled by JoyUI instead."; + break; case CONFIG_KEY.PAGE_SIZE: if (0 >= value || MAX_PAGE_SIZE < value) { result = `Page size must be greater than 0 and less than ${MAX_PAGE_SIZE + 1}.`; @@ -84,6 +87,9 @@ const setConfig = ({key, value}: ConfigUpdate): Nullable => { value.timestampKey ); break; + case CONFIG_KEY.THEME: + // Handled by JoyUI instead. + break; case CONFIG_KEY.PAGE_SIZE: window.localStorage.setItem(LOCAL_STORAGE_KEY.PAGE_SIZE, value.toString()); break; @@ -118,6 +124,9 @@ const getConfig = (key: T): ConfigMap[T] => { ), } as DecoderOptionsType; break; + case CONFIG_KEY.THEME: + // Handled by JoyUI instead. + break; case CONFIG_KEY.PAGE_SIZE: value = window.localStorage.getItem(LOCAL_STORAGE_KEY.PAGE_SIZE); break; From 291c3e843846546239af12dbd7b6a2768ce32e06 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:06:45 -0400 Subject: [PATCH 28/66] Move submit & reset button out of ConfigForm; Rename ConfigForm to ConfigDialog --- .../src/components/ConfigDialog.tsx | 73 +++++++++ new-log-viewer/src/components/ConfigForm.tsx | 149 ------------------ new-log-viewer/src/components/MenuBar.tsx | 139 ++++++++++++---- 3 files changed, 181 insertions(+), 180 deletions(-) create mode 100644 new-log-viewer/src/components/ConfigDialog.tsx delete mode 100644 new-log-viewer/src/components/ConfigForm.tsx diff --git a/new-log-viewer/src/components/ConfigDialog.tsx b/new-log-viewer/src/components/ConfigDialog.tsx new file mode 100644 index 00000000..d84a71fd --- /dev/null +++ b/new-log-viewer/src/components/ConfigDialog.tsx @@ -0,0 +1,73 @@ +import FormControl from "@mui/joy/FormControl/FormControl"; +import FormLabel from "@mui/joy/FormLabel/FormLabel"; +import Input from "@mui/joy/Input"; + +import { + CONFIG_KEY, + LOCAL_STORAGE_KEY, +} from "../typings/config"; +import {getConfig} from "../utils/config"; + + +const formFields = [ + // FIXME: add helper text for each field. + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, + label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, + type: "text", + }, + { + initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), + label: LOCAL_STORAGE_KEY.PAGE_SIZE, + name: LOCAL_STORAGE_KEY.PAGE_SIZE, + type: "number", + }, +]; + +/** + * Renders a configuration settings form. + * + * @return + */ +const ConfigDialog = () => { + return ( + <> + {formFields.map((field, index) => ( + + + {field.label} + + + + + ))} + + ); +}; + +export default ConfigDialog; diff --git a/new-log-viewer/src/components/ConfigForm.tsx b/new-log-viewer/src/components/ConfigForm.tsx deleted file mode 100644 index 74318eac..00000000 --- a/new-log-viewer/src/components/ConfigForm.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import React from "react"; - -import Button from "@mui/joy/Button"; -import FormControl from "@mui/joy/FormControl/FormControl"; -import FormLabel from "@mui/joy/FormLabel/FormLabel"; -import Input from "@mui/joy/Input"; - -import { - CONFIG_KEY, - LOCAL_STORAGE_KEY, -} from "../typings/config"; -import { - getConfig, - setConfig, -} from "../utils/config"; - - -const formFields = [ - // FIXME: add helper text for each field. - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - type: "text", - }, - { - initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), - label: LOCAL_STORAGE_KEY.PAGE_SIZE, - name: LOCAL_STORAGE_KEY.PAGE_SIZE, - type: "number", - }, -]; - -/** - * Handles the reset event for the configuration form. - * - * @param ev The form event triggered by the reset action. - * @return - */ -const handleConfigFormReset = (ev: React.FormEvent) => { - ev.preventDefault(); - window.localStorage.clear(); - window.location.reload(); -}; - -/** - * Handles the submit event for the configuration form. - * - * @param ev The form event triggered by the submit action. - * @return - */ -const handleConfigFormSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - const formData = new FormData(ev.target as HTMLFormElement); - - const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); - const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); - const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); - const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); - let error = null; - if ( - "string" === typeof formatString && - "string" === typeof logLevelKey && - "string" === typeof timestampKey - ) { - error ||= setConfig({ - key: CONFIG_KEY.DECODER_OPTIONS, - value: {formatString, logLevelKey, timestampKey}, - }); - } - if ("string" === typeof pageSize) { - error ||= setConfig({ - key: CONFIG_KEY.PAGE_SIZE, - value: Number(pageSize), - }); - } - if (null !== error) { - // eslint-disable-next-line no-warning-comments - // TODO: Show an error pop-up once NotificationProvider is implemented. - // eslint-disable-next-line no-alert - window.alert(error); - } else { - window.location.reload(); - } -}; - -/** - * Renders a configuration settings form. - * - * @return - */ -const ConfigForm = () => { - return ( - - {formFields.map((field, index) => ( - - - {field.label} - - - - - ))} -
- - -
- - ); -}; - -export default ConfigForm; diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index cfc85a20..5f4d2a44 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -5,6 +5,7 @@ import React, { import { Button, + DialogActions, DialogContent, DialogTitle, IconButton, @@ -37,17 +38,21 @@ import { } from "../contexts/UrlContextProvider"; import { CONFIG_KEY, + LOCAL_STORAGE_KEY, THEME_NAME, } from "../typings/config"; import {CURSOR_CODE} from "../typings/worker"; import {ACTION_NAME} from "../utils/actions"; -import {getConfig} from "../utils/config"; +import { + getConfig, + setConfig, +} from "../utils/config"; import {openFile} from "../utils/file"; import { getFirstItemNumInNextChunk, getLastItemNumInPrevChunk, } from "../utils/math"; -import ConfigForm from "./ConfigForm"; +import ConfigDialog from "./ConfigDialog"; /** @@ -80,6 +85,59 @@ export const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEv } }; +/** + * Handles the reset event for the configuration form. + * + * @param ev The form event triggered by the reset action. + * @return + */ +const handleConfigFormReset = (ev: React.FormEvent) => { + ev.preventDefault(); + window.localStorage.clear(); + window.location.reload(); +}; + +/** + * Handles the submit event for the configuration form. + * + * @param ev The form event triggered by the submit action. + * @return + */ +const handleConfigFormSubmit = (ev: React.FormEvent) => { + ev.preventDefault(); + const formData = new FormData(ev.target as HTMLFormElement); + + const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); + const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); + const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); + const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); + let error = null; + if ( + "string" === typeof formatString && + "string" === typeof logLevelKey && + "string" === typeof timestampKey + ) { + error ||= setConfig({ + key: CONFIG_KEY.DECODER_OPTIONS, + value: {formatString, logLevelKey, timestampKey}, + }); + } + if ("string" === typeof pageSize) { + error ||= setConfig({ + key: CONFIG_KEY.PAGE_SIZE, + value: Number(pageSize), + }); + } + if (null !== error) { + // eslint-disable-next-line no-warning-comments + // TODO: Show an error pop-up once NotificationProvider is implemented. + // eslint-disable-next-line no-alert + window.alert(error); + } else { + window.location.reload(); + } +}; + /** * */ @@ -168,42 +226,61 @@ export const MenuBar = () => { setSettingsModelOpen(false); }} > - - - - Settings - - { - setMode(newValue as Mode); - }} - > - + + + + + + + + + - -
- - - -
+ +
+
); From 1c9bbec3982f53ebde4eb0cbb8b1e3f3e4f8d47a Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:11:07 -0400 Subject: [PATCH 29/66] Add helperText to each form fields --- new-log-viewer/src/components/ConfigDialog.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/ConfigDialog.tsx b/new-log-viewer/src/components/ConfigDialog.tsx index d84a71fd..744ec86c 100644 --- a/new-log-viewer/src/components/ConfigDialog.tsx +++ b/new-log-viewer/src/components/ConfigDialog.tsx @@ -1,4 +1,5 @@ import FormControl from "@mui/joy/FormControl/FormControl"; +import FormHelperText from "@mui/joy/FormHelperText"; import FormLabel from "@mui/joy/FormLabel/FormLabel"; import Input from "@mui/joy/Input"; @@ -10,30 +11,33 @@ import {getConfig} from "../utils/config"; const formFields = [ - // FIXME: add helper text for each field. { initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, type: "text", + helperText: "The format string used to decode the log messages.", }, { initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, type: "text", + helperText: "The key used to determine the log level.", }, { initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, type: "text", + helperText: "The key used to determine the timestamp.", }, { initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), label: LOCAL_STORAGE_KEY.PAGE_SIZE, name: LOCAL_STORAGE_KEY.PAGE_SIZE, type: "number", + helperText: "The number of log messages to display per page.", }, ]; @@ -54,6 +58,9 @@ const ConfigDialog = () => { {field.label} + + {field.helperText} + Date: Mon, 9 Sep 2024 18:34:39 -0400 Subject: [PATCH 30/66] Fix modal spacing issue, add description to config form fields --- .../src/components/ConfigDialog.tsx | 80 ------- new-log-viewer/src/components/Layout.css | 18 +- new-log-viewer/src/components/Layout.tsx | 2 +- new-log-viewer/src/components/MenuBar.tsx | 133 +---------- .../modals/SettingsModal/ConfigDialog.tsx | 209 ++++++++++++++++++ .../src/{utils => components}/theme.tsx | 41 ++-- new-log-viewer/src/index.css | 4 + 7 files changed, 251 insertions(+), 236 deletions(-) delete mode 100644 new-log-viewer/src/components/ConfigDialog.tsx create mode 100644 new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx rename new-log-viewer/src/{utils => components}/theme.tsx (54%) diff --git a/new-log-viewer/src/components/ConfigDialog.tsx b/new-log-viewer/src/components/ConfigDialog.tsx deleted file mode 100644 index 744ec86c..00000000 --- a/new-log-viewer/src/components/ConfigDialog.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import FormControl from "@mui/joy/FormControl/FormControl"; -import FormHelperText from "@mui/joy/FormHelperText"; -import FormLabel from "@mui/joy/FormLabel/FormLabel"; -import Input from "@mui/joy/Input"; - -import { - CONFIG_KEY, - LOCAL_STORAGE_KEY, -} from "../typings/config"; -import {getConfig} from "../utils/config"; - - -const formFields = [ - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, - type: "text", - helperText: "The format string used to decode the log messages.", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, - type: "text", - helperText: "The key used to determine the log level.", - }, - { - initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, - label: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, - type: "text", - helperText: "The key used to determine the timestamp.", - }, - { - initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), - label: LOCAL_STORAGE_KEY.PAGE_SIZE, - name: LOCAL_STORAGE_KEY.PAGE_SIZE, - type: "number", - helperText: "The number of log messages to display per page.", - }, -]; - -/** - * Renders a configuration settings form. - * - * @return - */ -const ConfigDialog = () => { - return ( - <> - {formFields.map((field, index) => ( - - - {field.label} - - - {field.helperText} - - - - - ))} - - ); -}; - -export default ConfigDialog; diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index bb2d182d..1eea3732 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -1,7 +1,4 @@ -:root { - --status-bar-height: 32px; - --menu-bar-height: 32px; -} + .layout { height: 100vh; @@ -12,7 +9,7 @@ .menu-bar { display: flex; flexDirection: "row"; - height: var(--status-bar-height); + height: var(--ylv-status-bar-height); alignItems: "center"; } @@ -23,14 +20,15 @@ gap: 2px; } -.menu-bar-modal { +.settings-modal { display: flex; justify-content: space-between; align-items: center; + flex-wrap: wrap; } .editor { - height: calc(100vh - var(--menu-bar-height) - var(--status-bar-height)); + height: calc(100vh - var(--ylv-menu-bar-height) - var(--ylv-status-bar-height)); } .status-bar { @@ -42,11 +40,7 @@ } .config-form-control { - display: flex; - justify-content: space-between; - flex-grow: 1; - margin-bottom: 16px; - width: 100%; + margin-top: 16px; } .status-message { diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index e0eab0d7..56637c73 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -18,7 +18,6 @@ import {Nullable} from "../typings/common"; import {CONFIG_KEY} from "../typings/config"; import {ACTION_NAME} from "../utils/actions"; import {CONFIG_DEFAULT} from "../utils/config"; -import monacoTheme from "../utils/theme"; import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; @@ -27,6 +26,7 @@ import { MenuBar, } from "./MenuBar"; import {StatusBar} from "./StatusBar"; +import monacoTheme from "./theme"; import "./Layout.css"; diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index 5f4d2a44..5271ad62 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -4,29 +4,18 @@ import React, { } from "react"; import { - Button, - DialogActions, - DialogContent, - DialogTitle, IconButton, Modal, - ModalDialog, Sheet, - ToggleButtonGroup, Typography, - useColorScheme, } from "@mui/joy"; -import type {Mode} from "@mui/system/cssVars/useCurrentColorScheme"; import {SvgIconComponent} from "@mui/icons-material"; -import DarkMode from "@mui/icons-material/DarkMode"; import Description from "@mui/icons-material/Description"; import FileOpenIcon from "@mui/icons-material/FileOpen"; -import LightMode from "@mui/icons-material/LightMode"; import NavigateBefore from "@mui/icons-material/NavigateBefore"; import NavigateNext from "@mui/icons-material/NavigateNext"; import Settings from "@mui/icons-material/Settings"; -import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; import SkipNext from "@mui/icons-material/SkipNext"; import SkipPrevious from "@mui/icons-material/SkipPrevious"; import TipsAndUpdates from "@mui/icons-material/TipsAndUpdates"; @@ -36,23 +25,16 @@ import { updateWindowUrlHashParams, UrlContext, } from "../contexts/UrlContextProvider"; -import { - CONFIG_KEY, - LOCAL_STORAGE_KEY, - THEME_NAME, -} from "../typings/config"; +import {CONFIG_KEY} from "../typings/config"; import {CURSOR_CODE} from "../typings/worker"; import {ACTION_NAME} from "../utils/actions"; -import { - getConfig, - setConfig, -} from "../utils/config"; +import {getConfig} from "../utils/config"; import {openFile} from "../utils/file"; import { getFirstItemNumInNextChunk, getLastItemNumInPrevChunk, } from "../utils/math"; -import ConfigDialog from "./ConfigDialog"; +import ConfigDialog from "./modals/SettingsModal/ConfigDialog"; /** @@ -85,64 +67,11 @@ export const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEv } }; -/** - * Handles the reset event for the configuration form. - * - * @param ev The form event triggered by the reset action. - * @return - */ -const handleConfigFormReset = (ev: React.FormEvent) => { - ev.preventDefault(); - window.localStorage.clear(); - window.location.reload(); -}; - -/** - * Handles the submit event for the configuration form. - * - * @param ev The form event triggered by the submit action. - * @return - */ -const handleConfigFormSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - const formData = new FormData(ev.target as HTMLFormElement); - - const formatString = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); - const logLevelKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); - const timestampKey = formData.get(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); - const pageSize = formData.get(LOCAL_STORAGE_KEY.PAGE_SIZE); - let error = null; - if ( - "string" === typeof formatString && - "string" === typeof logLevelKey && - "string" === typeof timestampKey - ) { - error ||= setConfig({ - key: CONFIG_KEY.DECODER_OPTIONS, - value: {formatString, logLevelKey, timestampKey}, - }); - } - if ("string" === typeof pageSize) { - error ||= setConfig({ - key: CONFIG_KEY.PAGE_SIZE, - value: Number(pageSize), - }); - } - if (null !== error) { - // eslint-disable-next-line no-warning-comments - // TODO: Show an error pop-up once NotificationProvider is implemented. - // eslint-disable-next-line no-alert - window.alert(error); - } else { - window.location.reload(); - } -}; /** * */ export const MenuBar = () => { - const {setMode, mode} = useColorScheme(); const {logEventNum} = useContext(UrlContext); const {fileName, loadFile, numEvents} = useContext(StateContext); @@ -226,61 +155,7 @@ export const MenuBar = () => { setSettingsModelOpen(false); }} > -
- - - - Settings - - { - setMode(newValue as Mode); - }} - > - - - - - - - - - - - - - -
+
); diff --git a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx new file mode 100644 index 00000000..9d02ce99 --- /dev/null +++ b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx @@ -0,0 +1,209 @@ +import React, {forwardRef} from "react"; + +import { + Button, + DialogActions, + DialogContent, + DialogTitle, + ModalDialog, + ToggleButtonGroup, + useColorScheme, +} from "@mui/joy"; +import FormControl from "@mui/joy/FormControl/FormControl"; +import FormHelperText from "@mui/joy/FormHelperText"; +import FormLabel from "@mui/joy/FormLabel/FormLabel"; +import Input from "@mui/joy/Input"; +import type {Mode} from "@mui/system/cssVars/useCurrentColorScheme"; + +import DarkMode from "@mui/icons-material/DarkMode"; +import LightMode from "@mui/icons-material/LightMode"; +import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; + +import {Nullable} from "../../../typings/common"; +import { + CONFIG_KEY, + LOCAL_STORAGE_KEY, + THEME_NAME, +} from "../../../typings/config"; +import { + getConfig, + setConfig, +} from "../../../utils/config"; + + +const CONFIG_FORM_FIELDS = [ + { + helperText: "[JSON] Log messages conversion formats.", + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).formatString, + label: "Decoder: Format string", + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING, + type: "text", + }, + { + helperText: "[JSON] Key to extract the log level from.", + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).logLevelKey, + label: "Decoder: Log level key", + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY, + type: "text", + }, + { + helperText: "[JSON] Key to extract the log timestamp from.", + initialValue: getConfig(CONFIG_KEY.DECODER_OPTIONS).timestampKey, + label: "Decoder: Timestamp key", + name: LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY, + type: "text", + }, + { + helperText: "Number of log messages to display per page.", + initialValue: getConfig(CONFIG_KEY.PAGE_SIZE), + label: "View: Page size", + name: LOCAL_STORAGE_KEY.PAGE_SIZE, + type: "number", + }, +]; + +/** + * Handles the reset event for the configuration form. + * + * @param ev The form event triggered by the reset action. + */ +const handleConfigFormReset = (ev: React.FormEvent) => { + ev.preventDefault(); + window.localStorage.clear(); + window.location.reload(); +}; + +/** + * Handles the submit event for the configuration form. + * + * @param ev The form event triggered by the submit action. + */ +const handleConfigFormSubmit = (ev: React.FormEvent) => { + ev.preventDefault(); + const formData = new FormData(ev.target as HTMLFormElement); + const getFormDataValue = (key: string) => formData.get(key) as string; + + const formatString = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_FORMAT_STRING); + const logLevelKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_LOG_LEVEL_KEY); + const timestampKey = getFormDataValue(LOCAL_STORAGE_KEY.DECODER_OPTIONS_TIMESTAMP_KEY); + const pageSize = getFormDataValue(LOCAL_STORAGE_KEY.PAGE_SIZE); + + let error: Nullable = null; + error ||= setConfig({ + key: CONFIG_KEY.DECODER_OPTIONS, + value: {formatString, logLevelKey, timestampKey}, + }); + error ||= setConfig({ + key: CONFIG_KEY.PAGE_SIZE, + value: Number(pageSize), + }); + + if (null !== error) { + // eslint-disable-next-line no-warning-comments + // TODO: Show an error pop-up once NotificationProvider is implemented. + // eslint-disable-next-line no-alert + window.alert(error); + } else { + window.location.reload(); + } +}; + +/** + * Renders a configuration settings form. + * + * @return + */ +const ConfigDialog = forwardRef((_, ref) => { + const {setMode, mode} = useColorScheme(); + + return ( +
+ + + + Settings + + { + setMode(newValue as Mode); + }} + > + + + + + + + {CONFIG_FORM_FIELDS.map((field, index) => ( + + + {field.label} + + + + {field.helperText} + + + ))} + + + + + + +
+ ); +}); + +ConfigDialog.displayName = "ConfigDialog"; + +export default ConfigDialog; diff --git a/new-log-viewer/src/utils/theme.tsx b/new-log-viewer/src/components/theme.tsx similarity index 54% rename from new-log-viewer/src/utils/theme.tsx rename to new-log-viewer/src/components/theme.tsx index 6002a235..d05ad707 100644 --- a/new-log-viewer/src/utils/theme.tsx +++ b/new-log-viewer/src/components/theme.tsx @@ -8,31 +8,32 @@ const monacoTheme = extendTheme({ light: { palette: { primary: { - solidBg: "#007acc", - solidHoverBg: "#0062a3", - solidActiveBg: "#0062a3", + solidBg: "#005fb8", + solidHoverBg: "#0258a8", + solidActiveBg: "#005fb8", }, neutral: { - solidBg: "#5f6a79", - solidHoverBg: "#4c5561", - solidActiveBg: "#4c5561", + solidBg: "#e5e5e5", + solidHoverBg: "#cccccc", + solidActiveBg: "#e5e5e5", + solidColor: "#3b3b3b", }, - focusVisible: "#0090f1", + focusVisible: "#005fb8", }, }, dark: { palette: { primary: { - solidBg: "#0e639c", - solidHoverBg: "#1177bb", - solidActiveBg: "#1177bb", + solidBg: "#0078d4", + solidHoverBg: "#026ec1", + solidActiveBg: "#0078d4", }, neutral: { - solidBg: "#313131", - solidHoverBg: "#45494e", - solidActiveBg: "#45494e", + solidBg: "#181818", + solidHoverBg: "#323232", + solidActiveBg: "#181818", }, - focusVisible: "#007fd4", + focusVisible: "#0078d4", }, }, }, @@ -69,6 +70,18 @@ const monacoTheme = extendTheme({ }, }, }, + JoyFormControl: { + styleOverrides: { + root: ({theme}) => ({ + [theme.getColorSchemeSelector("dark")]: { + ":hover": {backgroundColor: "#232424"}, + }, + [theme.getColorSchemeSelector("light")]: { + ":hover": {backgroundColor: "#f8f8f8"}, + }, + }), + }, + }, }, }); diff --git a/new-log-viewer/src/index.css b/new-log-viewer/src/index.css index b21e3278..22de1ccc 100644 --- a/new-log-viewer/src/index.css +++ b/new-log-viewer/src/index.css @@ -13,6 +13,10 @@ html { --ylv-ui-font-family: -apple-system, BlinkMacSystemFont, system-ui, Ubuntu, "Droid Sans", Roboto; + /* size globals */ + --ylv-status-bar-height: 32px; + --ylv-menu-bar-height: 32px; + /* z-index globals * * Other z-index values in the project for reference: From 5d1f4d938af90492e500eb76988cc7872e775866 Mon Sep 17 00:00:00 2001 From: Henry <50559854+Henry8192@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:03:43 -0400 Subject: [PATCH 31/66] Move SettingsModal from MenuBar to SettingsModal folder --- new-log-viewer/src/components/MenuBar.tsx | 12 ++++------ .../components/modals/SettingsModal/index.tsx | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 new-log-viewer/src/components/modals/SettingsModal/index.tsx diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index 5271ad62..f8c1d67e 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -5,7 +5,6 @@ import React, { import { IconButton, - Modal, Sheet, Typography, } from "@mui/joy"; @@ -34,7 +33,7 @@ import { getFirstItemNumInNextChunk, getLastItemNumInPrevChunk, } from "../utils/math"; -import ConfigDialog from "./modals/SettingsModal/ConfigDialog"; +import ConfigModal from "./modals/SettingsModal"; /** @@ -149,14 +148,11 @@ export const MenuBar = () => { > - { setSettingsModelOpen(false); - }} - > - - + }}/> ); }; diff --git a/new-log-viewer/src/components/modals/SettingsModal/index.tsx b/new-log-viewer/src/components/modals/SettingsModal/index.tsx new file mode 100644 index 00000000..69f89e49 --- /dev/null +++ b/new-log-viewer/src/components/modals/SettingsModal/index.tsx @@ -0,0 +1,24 @@ +import Modal from "@mui/joy/Modal"; + +import ConfigDialog from "./ConfigDialog"; + + +/** + * + * @param isOpen.isOpen + * @param isOpen + * @param onClose + * @param isOpen.onClose + */ +const ConfigModal = ({isOpen, onClose}: { isOpen: boolean, onClose: () => void }) => { + return ( + + + + ); +}; + +export default ConfigModal; From 5b6132015e46cda5a44875bf56bcb475b179aba4 Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:31:27 -0400 Subject: [PATCH 32/66] Apply suggestions from code review Co-authored-by: Junhao Liao --- new-log-viewer/src/App.tsx | 2 -- new-log-viewer/src/components/Layout.css | 2 -- new-log-viewer/src/components/MenuBar.tsx | 1 - new-log-viewer/src/components/StatusBar.tsx | 2 +- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/new-log-viewer/src/App.tsx b/new-log-viewer/src/App.tsx index 8c4089ee..afaaa4b3 100644 --- a/new-log-viewer/src/App.tsx +++ b/new-log-viewer/src/App.tsx @@ -10,13 +10,11 @@ import UrlContextProvider from "./contexts/UrlContextProvider"; */ const App = () => { return ( - - ); }; diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index 1eea3732..2eff24a4 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -1,5 +1,3 @@ - - .layout { height: 100vh; display: flex; diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar.tsx index f8c1d67e..8423d872 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar.tsx @@ -66,7 +66,6 @@ export const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEv } }; - /** * */ diff --git a/new-log-viewer/src/components/StatusBar.tsx b/new-log-viewer/src/components/StatusBar.tsx index 98949feb..67b2a155 100644 --- a/new-log-viewer/src/components/StatusBar.tsx +++ b/new-log-viewer/src/components/StatusBar.tsx @@ -11,7 +11,7 @@ interface StatusBarProps { numEvents: number | null; } -export const StatusBar: React.FC = ({handleCopyLinkButtonClick, logEventNum, numEvents}) => { +const StatusBar = ({handleCopyLinkButtonClick, logEventNum, numEvents}: StatusBarProps) => { return ( Date: Wed, 11 Sep 2024 10:55:38 -0400 Subject: [PATCH 33/66] Extract MenuBar & StatusBar to their corresponding component folders --- new-log-viewer/src/components/Layout.css | 41 ------------- new-log-viewer/src/components/Layout.tsx | 21 +++---- .../src/components/MenuBar/index.css | 13 ++++ .../{MenuBar.tsx => MenuBar/index.tsx} | 61 ++++++------------- .../components/{ => StatusBar}/StatusBar.tsx | 26 ++++++-- .../src/components/StatusBar/index.css | 15 +++++ .../modals/SettingsModal/ConfigDialog.tsx | 11 +--- .../components/modals/SettingsModal/index.css | 10 +++ .../components/modals/SettingsModal/index.tsx | 2 + new-log-viewer/src/index.tsx | 1 + new-log-viewer/src/utils/actions.ts | 37 +++++++++++ 11 files changed, 127 insertions(+), 111 deletions(-) create mode 100644 new-log-viewer/src/components/MenuBar/index.css rename new-log-viewer/src/components/{MenuBar.tsx => MenuBar/index.tsx} (69%) rename new-log-viewer/src/components/{ => StatusBar}/StatusBar.tsx (58%) create mode 100644 new-log-viewer/src/components/StatusBar/index.css create mode 100644 new-log-viewer/src/components/modals/SettingsModal/index.css diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index 2eff24a4..9ffba568 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -4,47 +4,6 @@ flex-direction: column; } -.menu-bar { - display: flex; - flexDirection: "row"; - height: var(--ylv-status-bar-height); - alignItems: "center"; -} - -.menu-bar-typography { - align-items: center; - display: flex; - flex-grow: 1; - gap: 2px; -} - -.settings-modal { - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; -} - .editor { height: calc(100vh - var(--ylv-menu-bar-height) - var(--ylv-status-bar-height)); } - -.status-bar { - align-items: center; - bottom: 0; - display: flex; - position: absolute; - width: 100%; -} - -.config-form-control { - margin-top: 16px; -} - -.status-message { - flex-grow: 1; -} - -.status-button { - min-height: 0; -} diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 56637c73..f7e96a77 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -10,22 +10,19 @@ import * as monaco from "monaco-editor"; import {CssVarsProvider} from "@mui/joy/styles"; import {StateContext} from "../contexts/StateContextProvider"; -import { - copyPermalinkToClipboard, - UrlContext, -} from "../contexts/UrlContextProvider"; +import {UrlContext} from "../contexts/UrlContextProvider"; import {Nullable} from "../typings/common"; import {CONFIG_KEY} from "../typings/config"; -import {ACTION_NAME} from "../utils/actions"; +import { + ACTION_NAME, + handleAction, +} from "../utils/actions"; import {CONFIG_DEFAULT} from "../utils/config"; import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; -import { - handleAction, - MenuBar, -} from "./MenuBar"; -import {StatusBar} from "./StatusBar"; +import MenuBar from "./MenuBar"; +import StatusBar from "./StatusBar/StatusBar"; import monacoTheme from "./theme"; import "./Layout.css"; @@ -43,9 +40,6 @@ const Layout = () => { const logEventNumRef = useRef>(logEventNum); const numEventsRef = useRef>(numEvents); - const handleCopyLinkButtonClick = () => { - copyPermalinkToClipboard({}, {}); - }; const handleEditorCustomAction = useCallback(( editor: monaco.editor.IStandaloneCodeEditor, @@ -97,7 +91,6 @@ const Layout = () => { diff --git a/new-log-viewer/src/components/MenuBar/index.css b/new-log-viewer/src/components/MenuBar/index.css new file mode 100644 index 00000000..f6282877 --- /dev/null +++ b/new-log-viewer/src/components/MenuBar/index.css @@ -0,0 +1,13 @@ +.menu-bar { + display: flex; + flexDirection: "row"; + height: var(--ylv-status-bar-height); + alignItems: "center"; +} + +.menu-bar-typography { + align-items: center; + display: flex; + flex-grow: 1; + gap: 2px; +} diff --git a/new-log-viewer/src/components/MenuBar.tsx b/new-log-viewer/src/components/MenuBar/index.tsx similarity index 69% rename from new-log-viewer/src/components/MenuBar.tsx rename to new-log-viewer/src/components/MenuBar/index.tsx index 8423d872..9a74f098 100644 --- a/new-log-viewer/src/components/MenuBar.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -19,57 +19,28 @@ import SkipNext from "@mui/icons-material/SkipNext"; import SkipPrevious from "@mui/icons-material/SkipPrevious"; import TipsAndUpdates from "@mui/icons-material/TipsAndUpdates"; -import {StateContext} from "../contexts/StateContextProvider"; +import {StateContext} from "../../contexts/StateContextProvider"; +import {UrlContext} from "../../contexts/UrlContextProvider"; +import {CURSOR_CODE} from "../../typings/worker"; import { - updateWindowUrlHashParams, - UrlContext, -} from "../contexts/UrlContextProvider"; -import {CONFIG_KEY} from "../typings/config"; -import {CURSOR_CODE} from "../typings/worker"; -import {ACTION_NAME} from "../utils/actions"; -import {getConfig} from "../utils/config"; -import {openFile} from "../utils/file"; -import { - getFirstItemNumInNextChunk, - getLastItemNumInPrevChunk, -} from "../utils/math"; -import ConfigModal from "./modals/SettingsModal"; + ACTION_NAME, + handleAction, +} from "../../utils/actions"; +import {openFile} from "../../utils/file"; +import ConfigModal from "../modals/SettingsModal"; +import "./index.css"; -/** - * - * @param actionName - * @param logEventNum - * @param numEvents - */ -export const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEvents: number) => { - const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); - switch (actionName) { - case ACTION_NAME.FIRST_PAGE: - updateWindowUrlHashParams({logEventNum: 1}); - break; - case ACTION_NAME.PREV_PAGE: - updateWindowUrlHashParams({ - logEventNum: getLastItemNumInPrevChunk(logEventNum, pageSize), - }); - break; - case ACTION_NAME.NEXT_PAGE: - updateWindowUrlHashParams({ - logEventNum: getFirstItemNumInNextChunk(logEventNum, pageSize), - }); - break; - case ACTION_NAME.LAST_PAGE: - updateWindowUrlHashParams({logEventNum: numEvents}); - break; - default: - break; - } -}; /** + * MenuBar component + * + * This component renders a menu bar with various navigation and action buttons. + * It uses context to access the current log event number, file name, and other state information. * + * @return The rendered MenuBar component. */ -export const MenuBar = () => { +const MenuBar = () => { const {logEventNum} = useContext(UrlContext); const {fileName, loadFile, numEvents} = useContext(StateContext); @@ -155,3 +126,5 @@ export const MenuBar = () => { ); }; + +export default MenuBar; diff --git a/new-log-viewer/src/components/StatusBar.tsx b/new-log-viewer/src/components/StatusBar/StatusBar.tsx similarity index 58% rename from new-log-viewer/src/components/StatusBar.tsx rename to new-log-viewer/src/components/StatusBar/StatusBar.tsx index 67b2a155..4b07711e 100644 --- a/new-log-viewer/src/components/StatusBar.tsx +++ b/new-log-viewer/src/components/StatusBar/StatusBar.tsx @@ -1,17 +1,33 @@ -import React from "react"; - import Button from "@mui/joy/Button"; import Sheet from "@mui/joy/Sheet"; import Typography from "@mui/joy/Typography"; +import {copyPermalinkToClipboard} from "../../contexts/UrlContextProvider"; + +import "./index.css"; + interface StatusBarProps { - handleCopyLinkButtonClick: () => void; logEventNum: number | null; numEvents: number | null; } -const StatusBar = ({handleCopyLinkButtonClick, logEventNum, numEvents}: StatusBarProps) => { +/** + * + */ +const handleCopyLinkButtonClick = () => { + copyPermalinkToClipboard({}, {}); +}; + +/** + * StatusBar component displays the current log event number and total number of events. + * + * @param props The properties object. + * @param props.logEventNum The current log event number. + * @param props.numEvents The total number of events. + * @return The rendered StatusBar component. + */ +const StatusBar = ({logEventNum, numEvents}: StatusBarProps) => { return ( ); }; + +export default StatusBar; diff --git a/new-log-viewer/src/components/StatusBar/index.css b/new-log-viewer/src/components/StatusBar/index.css new file mode 100644 index 00000000..884d0e6f --- /dev/null +++ b/new-log-viewer/src/components/StatusBar/index.css @@ -0,0 +1,15 @@ +.status-bar { + align-items: center; + bottom: 0; + display: flex; + position: absolute; + width: 100%; +} + +.status-message { + flex-grow: 1; +} + +.status-button { + min-height: 0; +} diff --git a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx index 9d02ce99..eec8ab48 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx @@ -171,14 +171,9 @@ const ConfigDialog = forwardRef((_, ref) => { {field.label} + defaultValue={field.initialValue} + name={field.name} + type={field.type}/> {field.helperText} diff --git a/new-log-viewer/src/components/modals/SettingsModal/index.css b/new-log-viewer/src/components/modals/SettingsModal/index.css new file mode 100644 index 00000000..c0283b41 --- /dev/null +++ b/new-log-viewer/src/components/modals/SettingsModal/index.css @@ -0,0 +1,10 @@ +.settings-modal { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.config-form-control { + margin-top: 16px; +} diff --git a/new-log-viewer/src/components/modals/SettingsModal/index.tsx b/new-log-viewer/src/components/modals/SettingsModal/index.tsx index 69f89e49..479c0f43 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/index.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/index.tsx @@ -2,6 +2,8 @@ import Modal from "@mui/joy/Modal"; import ConfigDialog from "./ConfigDialog"; +import "./index.css"; + /** * diff --git a/new-log-viewer/src/index.tsx b/new-log-viewer/src/index.tsx index 4409e0de..c9ab6c08 100644 --- a/new-log-viewer/src/index.tsx +++ b/new-log-viewer/src/index.tsx @@ -13,3 +13,4 @@ root.render( ); +export {handleAction} from "./utils/actions"; diff --git a/new-log-viewer/src/utils/actions.ts b/new-log-viewer/src/utils/actions.ts index 65810e9c..f2347844 100644 --- a/new-log-viewer/src/utils/actions.ts +++ b/new-log-viewer/src/utils/actions.ts @@ -1,6 +1,13 @@ import * as monaco from "monaco-editor/esm/vs/editor/editor.api.js"; +import {updateWindowUrlHashParams} from "../contexts/UrlContextProvider"; import {Nullable} from "../typings/common"; +import {CONFIG_KEY} from "../typings/config"; +import {getConfig} from "./config"; +import { + getFirstItemNumInNextChunk, + getLastItemNumInPrevChunk, +} from "./math"; enum ACTION_NAME { @@ -62,8 +69,38 @@ const EDITOR_ACTIONS : ActionType[] = [ ]; /* eslint-enable sort-keys */ +/** + * + * @param actionName + * @param logEventNum + * @param numEvents + */ +const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEvents: number) => { + const pageSize = getConfig(CONFIG_KEY.PAGE_SIZE); + switch (actionName) { + case ACTION_NAME.FIRST_PAGE: + updateWindowUrlHashParams({logEventNum: 1}); + break; + case ACTION_NAME.PREV_PAGE: + updateWindowUrlHashParams({ + logEventNum: getLastItemNumInPrevChunk(logEventNum, pageSize), + }); + break; + case ACTION_NAME.NEXT_PAGE: + updateWindowUrlHashParams({ + logEventNum: getFirstItemNumInNextChunk(logEventNum, pageSize), + }); + break; + case ACTION_NAME.LAST_PAGE: + updateWindowUrlHashParams({logEventNum: numEvents}); + break; + default: + break; + } +}; export { ACTION_NAME, EDITOR_ACTIONS, + handleAction, }; export type {ActionType}; From 51cfed3cd70aa759e705534659458df01296bd22 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 13:16:27 -0400 Subject: [PATCH 34/66] Rearrange the layout to have CssVarsProvider as the outer element wrapping the layout div to allow any style overrides in `.layout` in the future. --- new-log-viewer/src/components/Layout.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index f7e96a77..088b8f57 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -80,12 +80,12 @@ const Layout = () => { }, [numEvents]); return ( -
- + +
@@ -93,8 +93,8 @@ const Layout = () => { - -
+
+ ); }; From 3d50ea4ac437ef5a73b7a5377c28e45d906be2d1 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 13:18:03 -0400 Subject: [PATCH 35/66] Upgrade dependencies. --- new-log-viewer/package-lock.json | 2424 +++++++++++++----------------- new-log-viewer/package.json | 4 +- 2 files changed, 1078 insertions(+), 1350 deletions(-) diff --git a/new-log-viewer/package-lock.json b/new-log-viewer/package-lock.json index c4ecd2f4..00a41826 100644 --- a/new-log-viewer/package-lock.json +++ b/new-log-viewer/package-lock.json @@ -9,9 +9,9 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@emotion/react": "^11.13.0", + "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", - "@mui/icons-material": "^5.16.7", + "@mui/icons-material": "^6.1.0", "@mui/joy": "^5.0.0-beta.48", "axios": "^1.7.2", "clp-ffi-js": "^0.1.0", @@ -72,30 +72,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -111,11 +111,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -150,14 +150,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -166,19 +166,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -189,9 +187,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -221,48 +219,14 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -281,16 +245,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -312,23 +275,23 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -338,14 +301,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -380,21 +343,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } @@ -408,37 +360,36 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -459,9 +410,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -470,13 +424,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -486,12 +455,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -518,13 +487,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -609,12 +578,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -624,12 +593,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -780,12 +749,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -826,15 +795,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" }, "engines": { "node": ">=6.9.0" @@ -876,12 +845,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -891,13 +860,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -924,18 +893,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -962,12 +929,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1007,6 +974,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -1072,14 +1055,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1105,12 +1088,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1167,13 +1150,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-simple-access": "^7.24.7" }, "engines": { @@ -1184,15 +1167,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1331,12 +1314,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1363,13 +1346,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1427,16 +1410,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1569,12 +1552,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1584,14 +1567,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", - "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { @@ -1649,13 +1633,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1665,19 +1649,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1698,29 +1683,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1729,9 +1715,9 @@ "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", @@ -1740,16 +1726,16 @@ "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -1819,9 +1805,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1830,31 +1816,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1863,11 +1846,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -1888,7 +1871,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", @@ -1906,23 +1888,12 @@ "node_modules/@emotion/babel-plugin/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==", - "license": "MIT" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/@emotion/cache": { "version": "11.13.1", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", @@ -1934,14 +1905,12 @@ "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -1949,14 +1918,12 @@ "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { "version": "11.13.3", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", @@ -1980,7 +1947,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", - "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", @@ -1992,14 +1958,12 @@ "node_modules/@emotion/sheet": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "node_modules/@emotion/styled": { "version": "11.13.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", @@ -2021,14 +1985,12 @@ "node_modules/@emotion/unitless": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", - "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } @@ -2036,27 +1998,22 @@ "node_modules/@emotion/utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==", - "license": "MIT" + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz", - "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==", + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", + "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", "dev": true, "peer": true, "dependencies": { - "@types/eslint": "^8.56.5", - "@types/estree": "^1.0.5", - "@typescript-eslint/types": "^7.2.0", "comment-parser": "1.4.1", - "esquery": "^1.5.0", + "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { @@ -2079,9 +2036,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2165,7 +2122,6 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", - "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.7" } @@ -2174,7 +2130,6 @@ "version": "1.6.10", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", - "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.7" @@ -2184,7 +2139,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -2196,8 +2150,7 @@ "node_modules/@floating-ui/utils": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", - "license": "MIT" + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2261,50 +2214,6 @@ "dev": true, "peer": true }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -2345,9 +2254,9 @@ } }, "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==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2375,9 +2284,9 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", - "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, "dependencies": { "@jsonjoy.com/base64": "^1.1.1", @@ -2397,9 +2306,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz", - "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", "dev": true, "engines": { "node": ">=10.0" @@ -2422,7 +2331,6 @@ "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@floating-ui/react-dom": "^2.0.8", @@ -2454,31 +2362,29 @@ "version": "5.16.7", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", - "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.0.tgz", + "integrity": "sha512-HxfB0jxwiMTYMN8gAnYn3avbF1aDrqBEuGIj6JDQ3YkLl650E1Wy8AIhwwyP47wdrv0at9aAR0iOO6VLb74A9w==", "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.25.6" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@mui/material": "^6.1.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2490,7 +2396,6 @@ "version": "5.0.0-beta.48", "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.48.tgz", "integrity": "sha512-OhTvjuGl9I5IvpBr0BQyDehIW/xb2yteW6YglHJMdOb/279nItn76X1NBtPV9ImldNlBjReGwvpOXmBTTGER9w==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", @@ -2528,27 +2433,26 @@ } }, "node_modules/@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.0.tgz", + "integrity": "sha512-4MJ46vmy1xbm8x+ZdRcWm8jEMMowdS8pYlhKQzg/qoKhOcLhImZvf2Jn6z9Dj6gl+lY+C/0MxaHF/avAAGys3Q==", "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6", + "@mui/core-downloads-tracker": "^6.1.0", + "@mui/system": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.3.1", "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2557,9 +2461,10 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@mui/material-pigment-css": "^6.1.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2568,38 +2473,44 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true + "node_modules/@mui/material/node_modules/@mui/core-downloads-tracker": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.0.tgz", + "integrity": "sha512-covEnIn/2er5YdtuukDRA52kmARhKrHjOvPsyTFMQApZdrTBI4h8jbEy2mxZqwMwcAFS9coonQXnEZKL1rUNdQ==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } }, - "node_modules/@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", - "license": "MIT", + "node_modules/@mui/material/node_modules/@mui/private-theming": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.0.tgz", + "integrity": "sha512-+L5qccs4gwsR0r1dgjqhN24QEQRkqIbfOdxILyMbMkuI50x6wNyt9XrV+J3WtjtZTMGJCrUa5VmZBE6OEPGPWA==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.25.6", + "@mui/utils": "^6.1.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2607,19 +2518,20 @@ } } }, - "node_modules/@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", - "license": "MIT", + "node_modules/@mui/material/node_modules/@mui/styled-engine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.0.tgz", + "integrity": "sha512-MZ+vtaCkjamrT41+b0Er9OMenjAtP/32+L6fARL9/+BZKuV2QbR3q3TmavT2x0NhDu35IM03s4yKqj32Ziqnyg==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@babel/runtime": "^7.25.6", + "@emotion/cache": "^11.13.1", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2628,7 +2540,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2639,23 +2551,23 @@ } } }, - "node_modules/@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", - "license": "MIT", + "node_modules/@mui/material/node_modules/@mui/system": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.0.tgz", + "integrity": "sha512-NumkGDqT6EdXfcoFLYQ+M4XlTW5hH3+aK48xAbRqKPXJfxl36CBt4DLduw/Voa5dcayGus9T6jm1AwU2hoJ5hQ==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", - "clsx": "^2.1.0", + "@babel/runtime": "^7.25.6", + "@mui/private-theming": "^6.1.0", + "@mui/styled-engine": "^6.1.0", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.1.0", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -2664,8 +2576,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2679,13 +2591,138 @@ } } }, - "node_modules/@mui/types": { - "version": "7.2.16", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.16.tgz", - "integrity": "sha512-qI8TV3M7ShITEEc8Ih15A2vLzZGLhD+/UPNwck/hcls2gwg7dyRjNGXcQYHKLB5Q7PuTRfrTkAoPa2VV1s67Ag==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "node_modules/@mui/material/node_modules/@mui/utils": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-oT8ZzMISRUhTVpdbYzY0CgrCBb3t/YEdcaM13tUnuTjZ15pdA6g5lx15ZJUdgYXV6PbJdw7tDQgMEr4uXK5TXQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/types": "^7.2.16", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.16", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.16.tgz", + "integrity": "sha512-qI8TV3M7ShITEEc8Ih15A2vLzZGLhD+/UPNwck/hcls2gwg7dyRjNGXcQYHKLB5Q7PuTRfrTkAoPa2VV1s67Ag==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2697,7 +2734,6 @@ "version": "5.16.6", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/types": "^7.2.15", @@ -2723,12 +2759,6 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2764,14 +2794,26 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, - "optional": true, "engines": { - "node": ">=14" + "node": ">=12.4.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { @@ -2822,16 +2864,31 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "peer": true + }, "node_modules/@stylistic/eslint-plugin-js": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.8.1.tgz", @@ -2924,25 +2981,16 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -2962,9 +3010,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -2986,9 +3034,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3014,12 +3062,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -3034,8 +3082,7 @@ "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { "version": "15.7.12", @@ -3055,9 +3102,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", + "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3076,7 +3123,6 @@ "version": "4.4.11", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", - "license": "MIT", "peer": true, "dependencies": { "@types/react": "*" @@ -3135,25 +3181,25 @@ } }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz", - "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/type-utils": "7.13.0", - "@typescript-eslint/utils": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3177,15 +3223,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", - "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3199,15 +3245,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz", - "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { @@ -3227,13 +3273,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", - "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3244,13 +3290,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz", - "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/utils": "7.13.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3271,15 +3317,15 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", - "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3293,9 +3339,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", - "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3306,13 +3352,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", - "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3334,9 +3380,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3467,9 +3513,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "peer": true, "bin": { @@ -3480,12 +3526,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", - "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3719,9 +3765,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3783,15 +3829,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4032,19 +4078,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -4107,9 +4140,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4137,7 +4170,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -4163,13 +4195,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4221,9 +4253,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -4234,7 +4266,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4268,6 +4300,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", @@ -4306,9 +4353,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -4325,10 +4372,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4405,9 +4452,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001633", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001633.tgz", - "integrity": "sha512-6sT0yf/z5jqf8tISAgpJDrmwOpLsrpnyCdD/lOZKvKkkJK4Dn0X5i7KF7THEZhOq+30bmhwBlNEaqPUiHiKtZg==", + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", "dev": true, "funding": [ { @@ -4528,14 +4575,12 @@ "node_modules/clp-ffi-js": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/clp-ffi-js/-/clp-ffi-js-0.1.0.tgz", - "integrity": "sha512-/g1EBxKDd6syknCGj7c/pM4tl1nEhLfRRf8zwaAfDQBxWcO0isXREFya8+TBVm2KTuik9O8hb9HidR17LtI3jg==", - "license": "Apache-2.0" + "integrity": "sha512-/g1EBxKDd6syknCGj7c/pM4tl1nEhLfRRf8zwaAfDQBxWcO0isXREFya8+TBVm2KTuik9O8hb9HidR17LtI3jg==" }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -4705,12 +4750,12 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -4718,9 +4763,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -4738,7 +4783,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -4800,9 +4844,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4911,16 +4955,16 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4966,18 +5010,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -5108,7 +5140,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.8.7", @@ -5180,12 +5211,6 @@ "tslib": "^2.0.3" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5193,15 +5218,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.802", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz", - "integrity": "sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "1.5.19", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz", + "integrity": "sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==", "dev": true }, "node_modules/emojis-list": { @@ -5214,18 +5233,18 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5260,7 +5279,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -5383,9 +5401,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es-object-atoms": { @@ -5445,9 +5463,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -5568,17 +5586,18 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", "is-glob": "^4.0.3" }, "engines": { @@ -5589,13 +5608,22 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -5619,27 +5647,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, "peer": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, @@ -5714,20 +5743,23 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.11.tgz", - "integrity": "sha512-mM4RSR1hBPwdtI+boITfDZTxvEYTANSWr3y/D+YR8OshtU3pMgYXC8LrjudhYf0O0g67A7QwlT1gZzhmNy1S4Q==", + "version": "48.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.11.0.tgz", + "integrity": "sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==", "dev": true, "peer": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.43.1", + "@es-joy/jsdoccomment": "~0.46.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.4", + "debug": "^4.3.5", "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "semver": "^7.6.2", - "spdx-expression-parse": "^4.0.0" + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { "node": ">=18" @@ -5736,10 +5768,41 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "peer": true, "bin": { @@ -5767,36 +5830,36 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", - "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", + "version": "7.35.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz", + "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==", "dev": true, "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { @@ -5868,9 +5931,9 @@ } }, "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz", - "integrity": "sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, "peer": true, "peerDependencies": { @@ -6051,9 +6114,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "peer": true, "dependencies": { @@ -6117,61 +6180,38 @@ "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", + "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6244,6 +6284,12 @@ "dev": true, "peer": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -6326,6 +6372,15 @@ "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6351,8 +6406,7 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { "version": "5.0.0", @@ -6403,9 +6457,9 @@ "peer": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -6431,34 +6485,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/foreground-child": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.0.tgz", - "integrity": "sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6576,18 +6602,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -6607,9 +6621,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", + "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -6852,11 +6866,15 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -7059,15 +7077,6 @@ } } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/hyperdyperid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", @@ -7102,9 +7111,9 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -7126,9 +7135,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -7289,8 +7298,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { "version": "2.0.0", @@ -7350,6 +7358,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -7364,11 +7393,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7443,15 +7475,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -7641,18 +7664,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -7795,24 +7806,6 @@ "set-function-name": "^2.0.1" } }, - "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7963,9 +7956,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -7989,8 +7982,7 @@ "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==", - "license": "MIT" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -8089,14 +8081,14 @@ } }, "node_modules/memfs": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.2.tgz", - "integrity": "sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", "dev": true, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.1.2", - "sonic-forest": "^1.0.0", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", "tslib": "^2.0.0" }, "engines": { @@ -8108,10 +8100,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -8138,9 +8133,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -8193,19 +8188,10 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -8229,9 +8215,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -8253,15 +8239,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/monaco-editor": { "version": "0.50.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", @@ -8281,9 +8258,9 @@ } }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -8357,9 +8334,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -8371,18 +8348,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -8404,10 +8369,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8490,24 +8458,6 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -8563,21 +8513,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -8693,11 +8628,24 @@ "node": ">=6" } }, + "node_modules/parse-imports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", + "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", + "dev": true, + "peer": true, + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -8763,35 +8711,10 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/path-type": { @@ -8803,9 +8726,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "4.0.2", @@ -8906,9 +8829,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -8928,9 +8851,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", "dev": true, "funding": [ { @@ -8948,7 +8871,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -9015,9 +8938,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9069,6 +8992,11 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -9206,9 +9134,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-refresh": { "version": "0.14.2", @@ -9223,7 +9151,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/runtime": "^7.5.5", @@ -9650,15 +9577,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -9712,9 +9639,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -9750,11 +9677,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -9844,9 +9774,9 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", + "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", @@ -9858,6 +9788,54 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -9957,12 +9935,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9972,6 +9944,13 @@ "node": ">=8" } }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "peer": true + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -9983,38 +9962,18 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sonic-forest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz", - "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==", - "dev": true, - "dependencies": { - "tree-dump": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -10058,9 +10017,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "peer": true }, @@ -10118,71 +10077,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -10210,6 +10104,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -10274,19 +10179,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "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-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -10297,15 +10189,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10338,8 +10221,7 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "5.5.0", @@ -10363,6 +10245,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "peer": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -10373,9 +10272,9 @@ } }, "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", + "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -10503,9 +10402,9 @@ } }, "node_modules/tree-dump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", - "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, "engines": { "node": ">=10.0" @@ -10557,9 +10456,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "dev": true }, "node_modules/type-check": { @@ -10679,9 +10578,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10708,9 +10607,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -10763,9 +10662,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -10841,9 +10740,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -10863,12 +10762,11 @@ } }, "node_modules/webpack": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.0.tgz", - "integrity": "sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -10877,7 +10775,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -10964,9 +10862,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz", - "integrity": "sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -10993,9 +10891,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.13", @@ -11011,8 +10909,7 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.19.2", "graceful-fs": "^4.2.6", "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", @@ -11020,14 +10917,13 @@ "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", - "rimraf": "^5.0.5", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -11051,46 +10947,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -11210,14 +11066,14 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "peer": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -11226,8 +11082,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -11291,133 +11147,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11426,9 +11155,9 @@ "peer": true }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -11456,7 +11185,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", "engines": { "node": ">= 6" } diff --git a/new-log-viewer/package.json b/new-log-viewer/package.json index 996e50bf..947a35fe 100644 --- a/new-log-viewer/package.json +++ b/new-log-viewer/package.json @@ -22,9 +22,9 @@ }, "homepage": "https://github.com/y-scope/yscope-log-viewer#readme", "dependencies": { - "@emotion/react": "^11.13.0", + "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", - "@mui/icons-material": "^5.16.7", + "@mui/icons-material": "^6.1.0", "@mui/joy": "^5.0.0-beta.48", "axios": "^1.7.2", "clp-ffi-js": "^0.1.0", From afc12bf6ba18e33c7bf95f6ff03f3325f81edead Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:00:53 -0400 Subject: [PATCH 36/66] Rename StatusBar.tsx to index.tsx; Brute-force fixing file icon not aligning with name issue; Add TSDocs for functions --- new-log-viewer/src/components/Layout.tsx | 2 +- new-log-viewer/src/components/MenuBar/index.css | 8 ++++---- .../components/StatusBar/{StatusBar.tsx => index.tsx} | 3 ++- .../src/components/modals/SettingsModal/index.tsx | 9 +++++---- 4 files changed, 12 insertions(+), 10 deletions(-) rename new-log-viewer/src/components/StatusBar/{StatusBar.tsx => index.tsx} (93%) diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 088b8f57..837438b7 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -22,7 +22,7 @@ import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; import MenuBar from "./MenuBar"; -import StatusBar from "./StatusBar/StatusBar"; +import StatusBar from "./StatusBar"; import monacoTheme from "./theme"; import "./Layout.css"; diff --git a/new-log-viewer/src/components/MenuBar/index.css b/new-log-viewer/src/components/MenuBar/index.css index f6282877..9f0f8312 100644 --- a/new-log-viewer/src/components/MenuBar/index.css +++ b/new-log-viewer/src/components/MenuBar/index.css @@ -1,13 +1,13 @@ .menu-bar { display: flex; - flexDirection: "row"; + flex-direction: row; height: var(--ylv-status-bar-height); - alignItems: "center"; + align-items: center; } .menu-bar-typography { align-items: center; - display: flex; + display: flex !important; flex-grow: 1; gap: 2px; -} +} \ No newline at end of file diff --git a/new-log-viewer/src/components/StatusBar/StatusBar.tsx b/new-log-viewer/src/components/StatusBar/index.tsx similarity index 93% rename from new-log-viewer/src/components/StatusBar/StatusBar.tsx rename to new-log-viewer/src/components/StatusBar/index.tsx index 4b07711e..b78dc496 100644 --- a/new-log-viewer/src/components/StatusBar/StatusBar.tsx +++ b/new-log-viewer/src/components/StatusBar/index.tsx @@ -13,7 +13,8 @@ interface StatusBarProps { } /** - * + * Handles the click event for the "Copy Link" button. + * Copies the permalink to the clipboard. */ const handleCopyLinkButtonClick = () => { copyPermalinkToClipboard({}, {}); diff --git a/new-log-viewer/src/components/modals/SettingsModal/index.tsx b/new-log-viewer/src/components/modals/SettingsModal/index.tsx index 479c0f43..ab97c820 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/index.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/index.tsx @@ -6,11 +6,12 @@ import "./index.css"; /** + * ConfigModal component. * - * @param isOpen.isOpen - * @param isOpen - * @param onClose - * @param isOpen.onClose + * @param props The component props. + * @param props.isOpen Determines if the modal is open. + * @param props.onClose Function to call when the modal is closed. + * @return The rendered ConfigModal component. */ const ConfigModal = ({isOpen, onClose}: { isOpen: boolean, onClose: () => void }) => { return ( From b410ae392e7e76e94d314adc54b716c3125b8dbe Mon Sep 17 00:00:00 2001 From: Henry8192 <50559854+Henry8192@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:08:04 -0400 Subject: [PATCH 37/66] Fix brute-force overriding menubar alignment issue --- new-log-viewer/src/components/MenuBar/index.css | 7 ------- new-log-viewer/src/components/MenuBar/index.tsx | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/index.css b/new-log-viewer/src/components/MenuBar/index.css index 9f0f8312..5bcdd9a5 100644 --- a/new-log-viewer/src/components/MenuBar/index.css +++ b/new-log-viewer/src/components/MenuBar/index.css @@ -4,10 +4,3 @@ height: var(--ylv-status-bar-height); align-items: center; } - -.menu-bar-typography { - align-items: center; - display: flex !important; - flex-grow: 1; - gap: 2px; -} \ No newline at end of file diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 9a74f098..08fbed00 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -6,6 +6,7 @@ import React, { import { IconButton, Sheet, + Stack, Typography, } from "@mui/joy"; @@ -88,10 +89,18 @@ const MenuBar = () => { return ( - + - {fileName} - + + {fileName} + + Date: Wed, 11 Sep 2024 16:08:51 -0400 Subject: [PATCH 38/66] Change minWidth from large to mid Co-authored-by: Junhao Liao --- .../src/components/modals/SettingsModal/ConfigDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx index eec8ab48..991187da 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx @@ -124,7 +124,7 @@ const ConfigDialog = forwardRef((_, ref) => { onSubmit={handleConfigFormSubmit} > From 01f179d50dea99c2225e63b97803bc349f46fd67 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 16:55:52 -0400 Subject: [PATCH 39/66] Remove redundant props passing by using context directly in StatusBar and Editor. --- .../src/components/Editor/index.tsx | 64 +++++++++++++---- new-log-viewer/src/components/Layout.tsx | 68 +------------------ .../src/components/StatusBar/index.tsx | 23 ++++--- 3 files changed, 66 insertions(+), 89 deletions(-) diff --git a/new-log-viewer/src/components/Editor/index.tsx b/new-log-viewer/src/components/Editor/index.tsx index a5ce3557..71304713 100644 --- a/new-log-viewer/src/components/Editor/index.tsx +++ b/new-log-viewer/src/components/Editor/index.tsx @@ -16,7 +16,11 @@ import { import {Nullable} from "../../typings/common"; import {CONFIG_KEY} from "../../typings/config"; import {BeginLineNumToLogEventNumMap} from "../../typings/worker"; -import {EDITOR_ACTIONS} from "../../utils/actions"; +import { + ACTION_NAME, + EDITOR_ACTIONS, + handleAction, +} from "../../utils/actions"; import { CONFIG_DEFAULT, getConfig, @@ -27,22 +31,16 @@ import { getMapValueWithNearestLessThanOrEqualKey, } from "../../utils/data"; import MonacoInstance from "./MonacoInstance"; -import {CustomActionCallback} from "./MonacoInstance/typings"; - +import {goToPositionAndCenter} from "./MonacoInstance/utils"; -interface EditorProps { - onCustomAction: CustomActionCallback, -} /** * Renders a read-only editor for viewing logs. * - * @param props - * @param props.onCustomAction * @return */ -const Editor = ({onCustomAction}: EditorProps) => { - const {logData, beginLineNumToLogEventNum} = useContext(StateContext); +const Editor = () => { + const {beginLineNumToLogEventNum, logData, numEvents} = useContext(StateContext); const {logEventNum} = useContext(UrlContext); const [lineNum, setLineNum] = useState(1); @@ -51,8 +49,40 @@ const Editor = ({onCustomAction}: EditorProps) => { ); const editorRef = useRef>(null); const isMouseDownRef = useRef(false); + const logEventNumRef = useRef>(logEventNum); + const numEventsRef = useRef>(numEvents); const pageSizeRef = useRef(getConfig(CONFIG_KEY.PAGE_SIZE)); + const handleEditorCustomAction = useCallback(( + editor: monaco.editor.IStandaloneCodeEditor, + actionName: ACTION_NAME + ) => { + if (null === logEventNumRef.current || null === numEventsRef.current) { + return; + } + switch (actionName) { + case ACTION_NAME.FIRST_PAGE: + case ACTION_NAME.PREV_PAGE: + case ACTION_NAME.NEXT_PAGE: + case ACTION_NAME.LAST_PAGE: + handleAction(actionName, logEventNumRef.current, numEventsRef.current); + break; + case ACTION_NAME.PAGE_TOP: + goToPositionAndCenter(editor, {lineNumber: 1, column: 1}); + break; + case ACTION_NAME.PAGE_BOTTOM: { + const lineCount = editor.getModel()?.getLineCount(); + if ("undefined" === typeof lineCount) { + break; + } + goToPositionAndCenter(editor, {lineNumber: lineCount, column: 1}); + break; + } + default: + break; + } + }, []); + /** * Sets `editorRef` and configures callbacks for mouse down detection. */ @@ -123,9 +153,19 @@ const Editor = ({onCustomAction}: EditorProps) => { beginLineNumToLogEventNumRef.current = beginLineNumToLogEventNum; }, [beginLineNumToLogEventNum]); + // Synchronize `logEventNumRef` with `logEventNum`. + useEffect(() => { + logEventNumRef.current = logEventNum; + }, [logEventNum]); + + // Synchronize `numEventsRef` with `numEvents`. + useEffect(() => { + numEventsRef.current = numEvents; + }, [numEvents]); + // On `logEventNum` update, update line number in the editor. useEffect(() => { - if (null === editorRef.current || true === isMouseDownRef.current) { + if (null === editorRef.current || isMouseDownRef.current) { // Don't update the line number if the user is actively selecting text. return; } @@ -151,7 +191,7 @@ const Editor = ({onCustomAction}: EditorProps) => { lineNum={lineNum} text={logData} onCursorExplicitPosChange={handleCursorExplicitPosChange} - onCustomAction={onCustomAction} + onCustomAction={handleEditorCustomAction} onMount={handleMount} onTextUpdate={restoreCachedPageSize}/>
diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 837438b7..1ecc78c6 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -1,26 +1,9 @@ -import { - useCallback, - useContext, - useEffect, - useRef, -} from "react"; - -import * as monaco from "monaco-editor"; - import {CssVarsProvider} from "@mui/joy/styles"; -import {StateContext} from "../contexts/StateContextProvider"; -import {UrlContext} from "../contexts/UrlContextProvider"; -import {Nullable} from "../typings/common"; import {CONFIG_KEY} from "../typings/config"; -import { - ACTION_NAME, - handleAction, -} from "../utils/actions"; import {CONFIG_DEFAULT} from "../utils/config"; import DropFileContainer from "./DropFileContainer"; import Editor from "./Editor"; -import {goToPositionAndCenter} from "./Editor/MonacoInstance/utils"; import MenuBar from "./MenuBar"; import StatusBar from "./StatusBar"; import monacoTheme from "./theme"; @@ -34,51 +17,6 @@ import "./Layout.css"; * @return */ const Layout = () => { - const {numEvents} = useContext(StateContext); - const {logEventNum} = useContext(UrlContext); - - const logEventNumRef = useRef>(logEventNum); - const numEventsRef = useRef>(numEvents); - - - const handleEditorCustomAction = useCallback(( - editor: monaco.editor.IStandaloneCodeEditor, - actionName: ACTION_NAME - ) => { - if (null === logEventNumRef.current || null === numEventsRef.current) { - return; - } - switch (actionName) { - case ACTION_NAME.FIRST_PAGE: - case ACTION_NAME.PREV_PAGE: - case ACTION_NAME.NEXT_PAGE: - case ACTION_NAME.LAST_PAGE: - handleAction(actionName, logEventNumRef.current, numEventsRef.current); - break; - case ACTION_NAME.PAGE_TOP: - goToPositionAndCenter(editor, {lineNumber: 1, column: 1}); - break; - case ACTION_NAME.PAGE_BOTTOM: { - const lineCount = editor.getModel()?.getLineCount(); - if ("undefined" === typeof lineCount) { - break; - } - goToPositionAndCenter(editor, {lineNumber: lineCount, column: 1}); - break; - } - default: - break; - } - }, []); - - useEffect(() => { - logEventNumRef.current = logEventNum; - }, [logEventNum]); - - useEffect(() => { - numEventsRef.current = numEvents; - }, [numEvents]); - return ( {
- + - +
); diff --git a/new-log-viewer/src/components/StatusBar/index.tsx b/new-log-viewer/src/components/StatusBar/index.tsx index b78dc496..a15df762 100644 --- a/new-log-viewer/src/components/StatusBar/index.tsx +++ b/new-log-viewer/src/components/StatusBar/index.tsx @@ -1,17 +1,18 @@ +import {useContext} from "react"; + import Button from "@mui/joy/Button"; import Sheet from "@mui/joy/Sheet"; import Typography from "@mui/joy/Typography"; -import {copyPermalinkToClipboard} from "../../contexts/UrlContextProvider"; +import {StateContext} from "../../contexts/StateContextProvider"; +import { + copyPermalinkToClipboard, + UrlContext, +} from "../../contexts/UrlContextProvider"; import "./index.css"; -interface StatusBarProps { - logEventNum: number | null; - numEvents: number | null; -} - /** * Handles the click event for the "Copy Link" button. * Copies the permalink to the clipboard. @@ -23,12 +24,12 @@ const handleCopyLinkButtonClick = () => { /** * StatusBar component displays the current log event number and total number of events. * - * @param props The properties object. - * @param props.logEventNum The current log event number. - * @param props.numEvents The total number of events. - * @return The rendered StatusBar component. + * @return */ -const StatusBar = ({logEventNum, numEvents}: StatusBarProps) => { +const StatusBar = () => { + const {numEvents} = useContext(StateContext); + const {logEventNum} = useContext(UrlContext); + return ( Date: Wed, 11 Sep 2024 17:00:36 -0400 Subject: [PATCH 40/66] Update MenuBar to wrap the ConfigModal in a React fragment. --- .../src/components/MenuBar/index.tsx | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 08fbed00..8c3f35e1 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -88,51 +88,53 @@ const MenuBar = () => { ); return ( - - - - - {fileName} - - + <> + + + + + {fileName} + + - - - - - - { - setSettingsModelOpen(true); - }}/> - - - + + + + + + { + setSettingsModelOpen(true); + }}/> + + + + { setSettingsModelOpen(false); }}/> - + ); }; From ae66796b2015ea3834692befcedd34f7b3832000 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 17:09:45 -0400 Subject: [PATCH 41/66] Remove unused Tip button from MenuBar. --- new-log-viewer/src/components/MenuBar/index.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 8c3f35e1..585a6d4f 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -123,11 +123,6 @@ const MenuBar = () => { onClick={() => { setSettingsModelOpen(true); }}/> - - - Date: Wed, 11 Sep 2024 17:13:57 -0400 Subject: [PATCH 42/66] Add vertical dividers to MenuBar. --- new-log-viewer/src/components/MenuBar/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 585a6d4f..d77bf724 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -4,6 +4,7 @@ import React, { } from "react"; import { + Divider, IconButton, Sheet, Stack, @@ -18,7 +19,6 @@ import NavigateNext from "@mui/icons-material/NavigateNext"; import Settings from "@mui/icons-material/Settings"; import SkipNext from "@mui/icons-material/SkipNext"; import SkipPrevious from "@mui/icons-material/SkipPrevious"; -import TipsAndUpdates from "@mui/icons-material/TipsAndUpdates"; import {StateContext} from "../../contexts/StateContextProvider"; import {UrlContext} from "../../contexts/UrlContextProvider"; @@ -103,6 +103,7 @@ const MenuBar = () => { + @@ -115,9 +116,12 @@ const MenuBar = () => { + + + { From f3166a65db6571421ac24bcbbf5f2f6b44b3a72c Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:09:37 -0400 Subject: [PATCH 43/66] Add page navigation feature to MenuBar. --- .../src/components/MenuBar/NavigationBar.tsx | 70 ++++++++++++++ .../src/components/MenuBar/PageNumInput.tsx | 94 +++++++++++++++++++ .../components/MenuBar/SmallIconButton.tsx | 17 ++++ .../src/components/MenuBar/index.tsx | 78 +++------------ .../src/contexts/StateContextProvider.tsx | 22 ++++- 5 files changed, 210 insertions(+), 71 deletions(-) create mode 100644 new-log-viewer/src/components/MenuBar/NavigationBar.tsx create mode 100644 new-log-viewer/src/components/MenuBar/PageNumInput.tsx create mode 100644 new-log-viewer/src/components/MenuBar/SmallIconButton.tsx diff --git a/new-log-viewer/src/components/MenuBar/NavigationBar.tsx b/new-log-viewer/src/components/MenuBar/NavigationBar.tsx new file mode 100644 index 00000000..a519af30 --- /dev/null +++ b/new-log-viewer/src/components/MenuBar/NavigationBar.tsx @@ -0,0 +1,70 @@ +import React, {useContext} from "react"; + +import NavigateBefore from "@mui/icons-material/NavigateBefore"; +import NavigateNext from "@mui/icons-material/NavigateNext"; +import SkipNext from "@mui/icons-material/SkipNext"; +import SkipPrevious from "@mui/icons-material/SkipPrevious"; + +import {StateContext} from "../../contexts/StateContextProvider"; +import {UrlContext} from "../../contexts/UrlContextProvider"; +import { + ACTION_NAME, + handleAction, +} from "../../utils/actions"; +import PageNumInput from "./PageNumInput"; +import SmallIconButton from "./SmallIconButton"; + + +/** + * Renders a navigation bar for page switching actions. + * + * @return + */ +const NavigationBar = () => { + const {numEvents} = useContext(StateContext); + const {logEventNum} = useContext(UrlContext); + + const handleNavButtonClick = (event: React.MouseEvent) => { + if (null === logEventNum) { + return; + } + const {actionName} = event.currentTarget.dataset as { actionName: ACTION_NAME }; + if (Object.values(ACTION_NAME).includes(actionName)) { + handleAction(actionName, logEventNum, numEvents); + } + }; + + return ( + <> + + + + + + + + + + + + + + + + + ); +}; + +export default NavigationBar; diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx new file mode 100644 index 00000000..26cc3f7e --- /dev/null +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx @@ -0,0 +1,94 @@ +import React, { + useContext, + useEffect, + useRef, + useState, +} from "react"; + +import {Typography} from "@mui/joy"; +import Input from "@mui/joy/Input"; + +import {StateContext} from "../../contexts/StateContextProvider"; + + +/** + * + */ +const PageNumInput = () => { + const {loadPage, numPages, pageNum} = useContext(StateContext); + const adjustedPageNum = (null === pageNum) ? + 0 : + pageNum; + + const [isEditing, setIsEditing] = useState(false); + const inputRef = useRef(null); + + const handleSubmit = (ev?: React.FormEvent) => { + if ("undefined" !== typeof ev) { + ev.preventDefault(); + } + if (null === inputRef.current || false === isEditing) { + return; + } + + loadPage(Number(inputRef.current.value)); + setIsEditing(false); + }; + + const handleBlur = () => { + handleSubmit(); + }; + + const handleInputClick = () => { + inputRef.current?.select(); + }; + + const adjustInputWidth = () => { + if (null === inputRef.current) { + return; + } + inputRef.current.style.width = "0"; + inputRef.current.style.width = `${inputRef.current.scrollWidth + 4}px`; + }; + + const handleInputChange = () => { + setIsEditing(true); + adjustInputWidth(); + }; + + useEffect(() => { + if (null === inputRef.current) { + return; + } + inputRef.current.value = adjustedPageNum.toString(); + adjustInputWidth(); + }, [adjustedPageNum]); + + return ( +
+ + / + {numPages} + + } + sx={{ + "input::-webkit-outer-spin-button, input::-webkit-inner-spin-button": { + "-webkit-appearance": "none", + "margin": 0, + }, + }} + onBlur={handleBlur} + onChange={handleInputChange} + onClick={handleInputClick}/> +
+ ); +}; + +export default PageNumInput; diff --git a/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx b/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx new file mode 100644 index 00000000..aee28f05 --- /dev/null +++ b/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx @@ -0,0 +1,17 @@ +import {IconButton} from "@mui/joy"; + + +/** + * A small JoyUI IconButton. + * + * @param props The props for IconButton. + * @return + */ +const SmallIconButton = (props: React.ComponentProps) => ( + +); + + +export default SmallIconButton; diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index d77bf724..14d148c8 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -1,34 +1,25 @@ -import React, { +import { useContext, useState, } from "react"; import { Divider, - IconButton, Sheet, Stack, Typography, } from "@mui/joy"; -import {SvgIconComponent} from "@mui/icons-material"; import Description from "@mui/icons-material/Description"; import FileOpenIcon from "@mui/icons-material/FileOpen"; -import NavigateBefore from "@mui/icons-material/NavigateBefore"; -import NavigateNext from "@mui/icons-material/NavigateNext"; import Settings from "@mui/icons-material/Settings"; -import SkipNext from "@mui/icons-material/SkipNext"; -import SkipPrevious from "@mui/icons-material/SkipPrevious"; import {StateContext} from "../../contexts/StateContextProvider"; -import {UrlContext} from "../../contexts/UrlContextProvider"; import {CURSOR_CODE} from "../../typings/worker"; -import { - ACTION_NAME, - handleAction, -} from "../../utils/actions"; import {openFile} from "../../utils/file"; import ConfigModal from "../modals/SettingsModal"; +import NavigationBar from "./NavigationBar"; +import SmallIconButton from "./SmallIconButton"; import "./index.css"; @@ -42,51 +33,16 @@ import "./index.css"; * @return The rendered MenuBar component. */ const MenuBar = () => { - const {logEventNum} = useContext(UrlContext); - const {fileName, loadFile, numEvents} = useContext(StateContext); + const {fileName, loadFile} = useContext(StateContext); const [settingsModelOpen, setSettingsModelOpen] = useState(false); - const handleNavButtonClick = (event: React.MouseEvent) => { - if (null === logEventNum) { - return; - } - const {actionName} = event.currentTarget.dataset as { actionName: ACTION_NAME }; - if (Object.values(ACTION_NAME).includes(actionName)) { - handleAction(actionName, logEventNum, numEvents); - } - }; - const handleOpenFileButtonClick = () => { openFile((file) => { loadFile(file, {code: CURSOR_CODE.LAST_EVENT, args: null}); }); }; - const SmallNavIconButton = ({actionName, Icon}: { - actionName: string, - Icon: SvgIconComponent, - }) => ( - - - - ); - const SmallIconButton = ({onClick, Icon}: { - onClick: (event: React.MouseEvent) => void, - Icon: SvgIconComponent, - }) => ( - - - - ); - return ( <> @@ -104,29 +60,19 @@ const MenuBar = () => { - - - - - + - + + + { setSettingsModelOpen(true); - }}/> + }} + > + + void, + loadPage: (newPageNum: number) => void, logData: string, numEvents: number, numPages: number, @@ -52,6 +53,7 @@ const STATE_DEFAULT: Readonly = Object.freeze({ beginLineNumToLogEventNum: new Map(), fileName: "", loadFile: () => null, + loadPage: () => null, logData: "Loading...", numEvents: 0, numPages: 0, @@ -186,6 +188,18 @@ const StateContextProvider = ({children}: StateContextProviderProps) => { handleMainWorkerResp, ]); + const loadPage = (newPageNum: number) => { + if (null === mainWorkerRef.current) { + console.error("Unexpected null mainWorkerRef.current"); + + return; + } + workerPostReq(mainWorkerRef.current, WORKER_REQ_CODE.LOAD_PAGE, { + cursor: {code: CURSOR_CODE.PAGE_NUM, args: {pageNum: newPageNum}}, + decoderOptions: getConfig(CONFIG_KEY.DECODER_OPTIONS), + }); + }; + // Synchronize `logEventNumRef` with `logEventNum`. useEffect(() => { logEventNumRef.current = logEventNum; @@ -202,7 +216,7 @@ const StateContextProvider = ({children}: StateContextProviderProps) => { // On `logEventNum` update, clamp it then switch page if necessary or simply update the URL. useEffect(() => { - if (null === mainWorkerRef.current || URL_HASH_PARAMS_DEFAULT.logEventNum === logEventNum) { + if (URL_HASH_PARAMS_DEFAULT.logEventNum === logEventNum) { return; } @@ -221,10 +235,7 @@ const StateContextProvider = ({children}: StateContextProviderProps) => { // NOTE: We don't need to call `updateLogEventNumInUrl()` since it's called when // handling the `WORKER_RESP_CODE.PAGE_DATA` response (the response to // `WORKER_REQ_CODE.LOAD_PAGE` requests) . - workerPostReq(mainWorkerRef.current, WORKER_REQ_CODE.LOAD_PAGE, { - cursor: {code: CURSOR_CODE.PAGE_NUM, args: {pageNum: newPageNum}}, - decoderOptions: getConfig(CONFIG_KEY.DECODER_OPTIONS), - }); + loadPage(newPageNum); } } @@ -264,6 +275,7 @@ const StateContextProvider = ({children}: StateContextProviderProps) => { beginLineNumToLogEventNum: beginLineNumToLogEventNumRef.current, fileName: fileName, loadFile: loadFile, + loadPage: loadPage, logData: logData, numEvents: numEvents, numPages: numPagesRef.current, From 4e8f002085e95b7cba9a508c88e60d4db404a6c8 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:10:18 -0400 Subject: [PATCH 44/66] Add docs for handleAction. --- new-log-viewer/src/utils/actions.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/new-log-viewer/src/utils/actions.ts b/new-log-viewer/src/utils/actions.ts index f2347844..cded5069 100644 --- a/new-log-viewer/src/utils/actions.ts +++ b/new-log-viewer/src/utils/actions.ts @@ -70,6 +70,7 @@ const EDITOR_ACTIONS : ActionType[] = [ /* eslint-enable sort-keys */ /** + * Handles an action based on the given action name, log event number, and total number of events. * * @param actionName * @param logEventNum @@ -98,6 +99,7 @@ const handleAction = (actionName: ACTION_NAME, logEventNum: number, numEvents: n break; } }; + export { ACTION_NAME, EDITOR_ACTIONS, From 74dbb6b161f981b8384086725819b9cbb029c9ed Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:15:42 -0400 Subject: [PATCH 45/66] Move inline CSS for removing spin buttons to an external CSS file. --- .../src/components/MenuBar/PageNumInput.css | 5 +++++ .../src/components/MenuBar/PageNumInput.tsx | 11 +++++------ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 new-log-viewer/src/components/MenuBar/PageNumInput.css diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.css b/new-log-viewer/src/components/MenuBar/PageNumInput.css new file mode 100644 index 00000000..07c770c8 --- /dev/null +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.css @@ -0,0 +1,5 @@ +.page-num-input input::-webkit-outer-spin-button, +.page-num-input input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} \ No newline at end of file diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx index 26cc3f7e..913eac43 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx @@ -10,9 +10,13 @@ import Input from "@mui/joy/Input"; import {StateContext} from "../../contexts/StateContextProvider"; +import "./PageNumInput.css"; + /** + * Renders a component for inputting page number. * + * @return */ const PageNumInput = () => { const {loadPage, numPages, pageNum} = useContext(StateContext); @@ -69,6 +73,7 @@ const PageNumInput = () => { onSubmit={handleSubmit} > { {numPages} } - sx={{ - "input::-webkit-outer-spin-button, input::-webkit-inner-spin-button": { - "-webkit-appearance": "none", - "margin": 0, - }, - }} onBlur={handleBlur} onChange={handleInputChange} onClick={handleInputClick}/> From 5ef2efcc46589cb53f78d23339f2dde91db38778 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:17:23 -0400 Subject: [PATCH 46/66] Pull out handlers for setting isSettingsModalOpen. --- .../src/components/MenuBar/index.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 14d148c8..bacc25b6 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -35,7 +35,7 @@ import "./index.css"; const MenuBar = () => { const {fileName, loadFile} = useContext(StateContext); - const [settingsModelOpen, setSettingsModelOpen] = useState(false); + const [isSettingsModalOpen, setIsSettingsModalOpen] = useState(false); const handleOpenFileButtonClick = () => { openFile((file) => { @@ -43,6 +43,14 @@ const MenuBar = () => { }); }; + const handleSettingsModalClose = () => { + setIsSettingsModalOpen(false); + }; + + const handleSettingsModalOpen = () => { + setIsSettingsModalOpen(true); + }; + return ( <> @@ -67,18 +75,14 @@ const MenuBar = () => {
{ - setSettingsModelOpen(true); - }} + onClick={handleSettingsModalClose} > { - setSettingsModelOpen(false); - }}/> + isOpen={isSettingsModalOpen} + onClose={handleSettingsModalOpen}/> ); }; From 199b010b8f62421e1bd6e84e18c7a034977b5d15 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:29:57 -0400 Subject: [PATCH 47/66] Add newline to EOF. --- new-log-viewer/src/components/MenuBar/PageNumInput.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.css b/new-log-viewer/src/components/MenuBar/PageNumInput.css index 07c770c8..d8f61448 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.css +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.css @@ -2,4 +2,4 @@ .page-num-input input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; -} \ No newline at end of file +} From 4696112ef32fa8c9b8a77b4cf5cd75976b432228 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:32:46 -0400 Subject: [PATCH 48/66] Add dedicated CSS file for Editor component. --- new-log-viewer/src/components/Editor/index.css | 3 +++ new-log-viewer/src/components/Editor/index.tsx | 2 ++ new-log-viewer/src/components/Layout.css | 4 ---- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 new-log-viewer/src/components/Editor/index.css diff --git a/new-log-viewer/src/components/Editor/index.css b/new-log-viewer/src/components/Editor/index.css new file mode 100644 index 00000000..5e8ab09c --- /dev/null +++ b/new-log-viewer/src/components/Editor/index.css @@ -0,0 +1,3 @@ +.editor { + height: calc(100vh - var(--ylv-menu-bar-height) - var(--ylv-status-bar-height)); +} diff --git a/new-log-viewer/src/components/Editor/index.tsx b/new-log-viewer/src/components/Editor/index.tsx index 71304713..f09810c0 100644 --- a/new-log-viewer/src/components/Editor/index.tsx +++ b/new-log-viewer/src/components/Editor/index.tsx @@ -33,6 +33,8 @@ import { import MonacoInstance from "./MonacoInstance"; import {goToPositionAndCenter} from "./MonacoInstance/utils"; +import "./index.css"; + /** * Renders a read-only editor for viewing logs. diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css index 9ffba568..44d801b7 100644 --- a/new-log-viewer/src/components/Layout.css +++ b/new-log-viewer/src/components/Layout.css @@ -3,7 +3,3 @@ display: flex; flex-direction: column; } - -.editor { - height: calc(100vh - var(--ylv-menu-bar-height) - var(--ylv-status-bar-height)); -} From 023fe2365e5618bd704a743d5db51ffb8e2d7d81 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:35:50 -0400 Subject: [PATCH 49/66] Rename ConfigDialog to SettingsDialog; fix settings modal open condition. --- new-log-viewer/src/components/MenuBar/index.tsx | 4 ++-- .../{ConfigDialog.tsx => SettingsDialog.tsx} | 8 ++++---- .../src/components/modals/SettingsModal/index.tsx | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename new-log-viewer/src/components/modals/SettingsModal/{ConfigDialog.tsx => SettingsDialog.tsx} (97%) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index bacc25b6..60de61e4 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -75,14 +75,14 @@ const MenuBar = () => {
+ onClose={handleSettingsModalClose}/> ); }; diff --git a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx b/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx similarity index 97% rename from new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx rename to new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx index 991187da..798888c1 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/ConfigDialog.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx @@ -109,11 +109,11 @@ const handleConfigFormSubmit = (ev: React.FormEvent) => { }; /** - * Renders a configuration settings form. + * Renders a settings dialog for configurations. * * @return */ -const ConfigDialog = forwardRef((_, ref) => { +const SettingsDialog = forwardRef((_, ref) => { const {setMode, mode} = useColorScheme(); return ( @@ -199,6 +199,6 @@ const ConfigDialog = forwardRef((_, ref) => { ); }); -ConfigDialog.displayName = "ConfigDialog"; +SettingsDialog.displayName = "SettingsDialog"; -export default ConfigDialog; +export default SettingsDialog; diff --git a/new-log-viewer/src/components/modals/SettingsModal/index.tsx b/new-log-viewer/src/components/modals/SettingsModal/index.tsx index ab97c820..235bfa15 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/index.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/index.tsx @@ -1,6 +1,6 @@ import Modal from "@mui/joy/Modal"; -import ConfigDialog from "./ConfigDialog"; +import SettingsDialog from "./SettingsDialog"; import "./index.css"; @@ -19,7 +19,7 @@ const ConfigModal = ({isOpen, onClose}: { isOpen: boolean, onClose: () => void } open={isOpen} onClose={onClose} > - + ); }; From e24e70e23f87f32ec2c67a53fe36461b8f343dbe Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:42:56 -0400 Subject: [PATCH 50/66] Remove unused CSS classes in Layout; Remove height specification of DropFileContainer to allow its height to be the same as its children. --- new-log-viewer/src/components/DropFileContainer/index.css | 2 -- new-log-viewer/src/components/Layout.css | 5 ----- new-log-viewer/src/components/Layout.tsx | 2 -- 3 files changed, 9 deletions(-) delete mode 100644 new-log-viewer/src/components/Layout.css diff --git a/new-log-viewer/src/components/DropFileContainer/index.css b/new-log-viewer/src/components/DropFileContainer/index.css index 2bf46acd..6c6fc50b 100644 --- a/new-log-viewer/src/components/DropFileContainer/index.css +++ b/new-log-viewer/src/components/DropFileContainer/index.css @@ -1,6 +1,4 @@ .drop-file-container { - width: 100%; - height: 100%; position: relative; } diff --git a/new-log-viewer/src/components/Layout.css b/new-log-viewer/src/components/Layout.css deleted file mode 100644 index 44d801b7..00000000 --- a/new-log-viewer/src/components/Layout.css +++ /dev/null @@ -1,5 +0,0 @@ -.layout { - height: 100vh; - display: flex; - flex-direction: column; -} diff --git a/new-log-viewer/src/components/Layout.tsx b/new-log-viewer/src/components/Layout.tsx index 1ecc78c6..db146550 100644 --- a/new-log-viewer/src/components/Layout.tsx +++ b/new-log-viewer/src/components/Layout.tsx @@ -8,8 +8,6 @@ import MenuBar from "./MenuBar"; import StatusBar from "./StatusBar"; import monacoTheme from "./theme"; -import "./Layout.css"; - /** * Renders the major layout of the log viewer. From c90caf08b063d6349a442c001414d0e3f60c3faf Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:48:09 -0400 Subject: [PATCH 51/66] Add const PAGE_NUM_INPUT_FIT_EXTRA_WIDTH. --- new-log-viewer/src/components/MenuBar/PageNumInput.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx index 913eac43..6dcb744e 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx @@ -13,6 +13,9 @@ import {StateContext} from "../../contexts/StateContextProvider"; import "./PageNumInput.css"; +const PAGE_NUM_INPUT_FIT_EXTRA_WIDTH = 2; + + /** * Renders a component for inputting page number. * @@ -52,7 +55,7 @@ const PageNumInput = () => { return; } inputRef.current.style.width = "0"; - inputRef.current.style.width = `${inputRef.current.scrollWidth + 4}px`; + inputRef.current.style.width = `${inputRef.current.scrollWidth + PAGE_NUM_INPUT_FIT_EXTRA_WIDTH}px`; }; const handleInputChange = () => { From f63f60ee4e5fd74b387c83c47891a0e571e99209 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:50:57 -0400 Subject: [PATCH 52/66] Improve appearance of numPages. --- new-log-viewer/src/components/MenuBar/PageNumInput.css | 4 ++++ new-log-viewer/src/components/MenuBar/PageNumInput.tsx | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.css b/new-log-viewer/src/components/MenuBar/PageNumInput.css index d8f61448..48dd3f53 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.css +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.css @@ -3,3 +3,7 @@ -webkit-appearance: none; margin: 0; } + +.page-num-input-num-pages-text { + font-size: inherit!important; +} diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx index 6dcb744e..e8ad1489 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.tsx +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.tsx @@ -81,8 +81,11 @@ const PageNumInput = () => { slotProps={{input: {ref: inputRef}}} type={"number"} endDecorator={ - - / + + {"/ "} {numPages} } From ff171c8b39310cd136ad170f559a9cc05577eea2 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:52:47 -0400 Subject: [PATCH 53/66] Lint PageNumInput.css --- new-log-viewer/src/components/MenuBar/PageNumInput.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/new-log-viewer/src/components/MenuBar/PageNumInput.css b/new-log-viewer/src/components/MenuBar/PageNumInput.css index 48dd3f53..afdc3b86 100644 --- a/new-log-viewer/src/components/MenuBar/PageNumInput.css +++ b/new-log-viewer/src/components/MenuBar/PageNumInput.css @@ -5,5 +5,5 @@ } .page-num-input-num-pages-text { - font-size: inherit!important; + font-size: inherit !important; } From 35ee1c39cce6c6ef1abde08b5a2f1f2661c72f43 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:53:52 -0400 Subject: [PATCH 54/66] Remove redundant line in SmallIconButton.tsx --- new-log-viewer/src/components/MenuBar/SmallIconButton.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx b/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx index aee28f05..3fc3447e 100644 --- a/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx +++ b/new-log-viewer/src/components/MenuBar/SmallIconButton.tsx @@ -13,5 +13,4 @@ const SmallIconButton = (props: React.ComponentProps) => ( {...props}/> ); - export default SmallIconButton; From 0ffbdba1ca590a30214d625555d5119c52ca9fff Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:55:51 -0400 Subject: [PATCH 55/66] Update MenuBar component documentation. --- new-log-viewer/src/components/MenuBar/index.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/new-log-viewer/src/components/MenuBar/index.tsx b/new-log-viewer/src/components/MenuBar/index.tsx index 60de61e4..31f7fd6e 100644 --- a/new-log-viewer/src/components/MenuBar/index.tsx +++ b/new-log-viewer/src/components/MenuBar/index.tsx @@ -25,12 +25,9 @@ import "./index.css"; /** - * MenuBar component + * Renders a menu bar which displays file information and provides navigation and settings buttons. * - * This component renders a menu bar with various navigation and action buttons. - * It uses context to access the current log event number, file name, and other state information. - * - * @return The rendered MenuBar component. + * @return */ const MenuBar = () => { const {fileName, loadFile} = useContext(StateContext); From 993370ea31845fd50a62088116ad836c81dbcd73 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:57:44 -0400 Subject: [PATCH 56/66] Add left padding to status-message class. --- new-log-viewer/src/components/StatusBar/index.css | 1 + 1 file changed, 1 insertion(+) diff --git a/new-log-viewer/src/components/StatusBar/index.css b/new-log-viewer/src/components/StatusBar/index.css index 884d0e6f..07216170 100644 --- a/new-log-viewer/src/components/StatusBar/index.css +++ b/new-log-viewer/src/components/StatusBar/index.css @@ -7,6 +7,7 @@ } .status-message { + padding-left: 8px; flex-grow: 1; } From c328ec21d9d3d800c51aafcebf8e23d7572b8da9 Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 19:59:53 -0400 Subject: [PATCH 57/66] Remove ineffective `.status-button` class. --- new-log-viewer/src/components/StatusBar/index.css | 4 ---- new-log-viewer/src/components/StatusBar/index.tsx | 1 - 2 files changed, 5 deletions(-) diff --git a/new-log-viewer/src/components/StatusBar/index.css b/new-log-viewer/src/components/StatusBar/index.css index 07216170..2f9ba8f3 100644 --- a/new-log-viewer/src/components/StatusBar/index.css +++ b/new-log-viewer/src/components/StatusBar/index.css @@ -10,7 +10,3 @@ padding-left: 8px; flex-grow: 1; } - -.status-button { - min-height: 0; -} diff --git a/new-log-viewer/src/components/StatusBar/index.tsx b/new-log-viewer/src/components/StatusBar/index.tsx index a15df762..5a66dfcb 100644 --- a/new-log-viewer/src/components/StatusBar/index.tsx +++ b/new-log-viewer/src/components/StatusBar/index.tsx @@ -39,7 +39,6 @@ const StatusBar = () => { Status message From b86efe7ea75658ffc4c81f47b7fe873df3c68f8b Mon Sep 17 00:00:00 2001 From: Junhao Liao Date: Wed, 11 Sep 2024 20:05:33 -0400 Subject: [PATCH 59/66] Rename icons and remove redundant parameter descriptions. --- .../modals/SettingsModal/SettingsDialog.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx b/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx index 798888c1..dfe3a665 100644 --- a/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx +++ b/new-log-viewer/src/components/modals/SettingsModal/SettingsDialog.tsx @@ -15,8 +15,8 @@ import FormLabel from "@mui/joy/FormLabel/FormLabel"; import Input from "@mui/joy/Input"; import type {Mode} from "@mui/system/cssVars/useCurrentColorScheme"; -import DarkMode from "@mui/icons-material/DarkMode"; -import LightMode from "@mui/icons-material/LightMode"; +import DarkModeIcon from "@mui/icons-material/DarkMode"; +import LightModeIcon from "@mui/icons-material/LightMode"; import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; import {Nullable} from "../../../typings/common"; @@ -65,7 +65,7 @@ const CONFIG_FORM_FIELDS = [ /** * Handles the reset event for the configuration form. * - * @param ev The form event triggered by the reset action. + * @param ev */ const handleConfigFormReset = (ev: React.FormEvent) => { ev.preventDefault(); @@ -76,7 +76,7 @@ const handleConfigFormReset = (ev: React.FormEvent) => { /** * Handles the submit event for the configuration form. * - * @param ev The form event triggered by the submit action. + * @param ev */ const handleConfigFormSubmit = (ev: React.FormEvent) => { ev.preventDefault(); @@ -142,7 +142,7 @@ const SettingsDialog = forwardRef((_, ref) => { }} >