From 581cf68a2f401c8850e68ca8c31ab5a8d8db5f4c Mon Sep 17 00:00:00 2001 From: Esme <23175119+esme@users.noreply.github.com> Date: Tue, 14 Feb 2023 12:11:53 -0800 Subject: [PATCH] Create demo app UI using React and TS (#63) * Create demo app UI using React and TS --- .eslintignore | 2 +- demo-v1/.eslintignore | 2 + demo-v1/.eslintrc | 20 + demo-v1/.prettierignore | 4 + demo-v1/.prettierrc.json | 1 + demo-v1/babel.config.js | 8 + demo-v1/package.json | 37 + demo-v1/src/components/App.tsx | 144 + demo-v1/src/components/CallDurationTimer.ts | 25 + demo-v1/src/components/Components.tsx | 84 + demo-v1/src/components/Keypad.tsx | 55 + .../components/screens/CallEndedScreen.tsx | 40 + .../src/components/screens/CallingScreen.tsx | 156 + .../src/components/screens/DialingScreen.tsx | 33 + .../src/components/screens/KeypadScreen.tsx | 113 + .../src/components/screens/LoginScreen.tsx | 49 + demo-v1/src/hooks/useAutoFocus.ts | 11 + demo-v1/src/hooks/useCti.ts | 51 + demo-v1/src/hooks/useTimer.ts | 24 + demo-v1/src/index.tsx | 10 + .../utils/millisecondsToFormattedDuration.ts | 22 + .../button/VizExButton.stories.tsx | 83 + .../button/VizExButton.tsx | 56 + .../button/VizExCloseButton.js | 73 + .../button/VizExFileButton.js | 45 + .../button/VizExIconButton.tsx | 49 + .../button/VizExLoadingButton.js | 86 + .../button/constants/ButtonSizes.ts | 19 + .../button/constants/ButtonUses.ts | 3 + .../button/constants/IconButtonShapes.ts | 2 + .../constants/IconButtonSizeToIconSize.ts | 12 + .../button/constants/IconButtonUses.ts | 3 + .../button/constants/LoadingButtonUses.ts | 26 + .../button/theme/buttonTheme.ts | 59 + .../button/theme/closeButtonThemeOperators.js | 11 + .../button/theme/iconButtonTheme.ts | 84 + .../button/theme/iconButtonThemeOperators.ts | 30 + .../card/VizExCard.js | 17 + .../constants/keyCodes.ts | 4 + .../constants/sizes.ts | 6 + .../input/VizExCheckbox.js | 129 + .../input/VizExExpandingInput.js | 221 + .../input/VizExInput.js | 148 + .../constants/ExpandingInputVariations.ts | 2 + .../input/constants/InputVariations.ts | 2 + .../input/theme/checkboxThemeOperators.js | 11 + .../theme/expandingInputThemeOperators.js | 19 + .../input/theme/inputThemeOperators.js | 16 + .../link/VizExExternalLink.tsx | 43 + .../link/VizExLink.tsx | 42 + .../link/constants/LinkVariations.ts | 3 + .../link/theme/linkTheme.ts | 34 + .../link/theme/linkThemeOperators.ts | 18 + .../list/VizExList.stories.tsx | 49 + .../list/VizExList.tsx | 13 + .../list/VizExListItemButton.tsx | 49 + .../list/theme/listItemButtonTheme.ts | 36 + .../list/theme/listTheme.ts | 12 + .../ratings/VizExCsatRating.js | 111 + .../ratings/constants/RatingSizes.ts | 8 + .../theme/VizExCsatRatingThemeOperator.ts | 10 + .../theme/ColorConstants.ts | 22 + .../theme/VizExThemeProvider.tsx | 25 + .../theme/createTheme.ts | 64 + .../theme/createThemeV2.ts | 78 + .../theme/defaultTheme.ts | 51 + .../theme/defaultThemeOperators.ts | 57 + .../theme/styled.d.ts | 61 + .../tooltip/VizExTooltip.js | 124 + .../tooltip/VizExTooltipArrow.js | 25 + .../tooltip/VizExTooltipBody.js | 29 + .../tooltip/constants/PlacementConstants.ts | 28 + .../tooltip/theme/tooltipThemeOperators.ts | 19 + .../tooltip/utils/getArrowSpacing.js | 79 + .../tooltip/utils/getBodySpacing.js | 98 + .../tooltip/utils/getPlacement.js | 20 + .../typography/VizExSmall.js | 33 + .../typography/constants/SmallVariations.ts | 3 + .../utils/getBodyTypographyStyles.js | 12 + .../typography/utils/getHeadingStyles.js | 72 + .../typography/utils/getSmallStyles.js | 14 + .../utils/SyntheticEvent.ts | 37 + .../utils/adjustLuminance.ts | 25 + .../utils/aria-live/AriaLiveAnnouncer.ts | 137 + .../aria-live/AriaLiveContext.stories.tsx | 79 + .../utils/aria-live/AriaLiveContext.tsx | 113 + .../utils/browserTest.js | 7 + .../utils/callIfValid.ts | 3 + .../utils/curryable.ts | 8 + .../visitor-ui-component-library/utils/get.ts | 6 + .../utils/getContrastRatio.ts | 33 + .../utils/getTextColorFromBgColor.ts | 28 + .../utils/hexToRGB.ts | 16 + .../utils/hexToRgba.ts | 5 + .../utils/isUnsafeUrl.ts | 25 + .../utils/mergeDeep.ts | 33 + .../utils/mixins.ts | 6 + .../utils/pipe.ts | 3 + .../utils/stripHTML.js | 6 + .../utils/themePropType.ts | 5 + .../utils/types.ts | 19 + demo-v1/tsconfig.json | 16 + demo-v1/webpack.config.js | 35 + demo-v1/yarn.lock | 4616 +++++++++++++++++ package.json | 4 +- 105 files changed, 8712 insertions(+), 2 deletions(-) create mode 100644 demo-v1/.eslintignore create mode 100644 demo-v1/.eslintrc create mode 100644 demo-v1/.prettierignore create mode 100644 demo-v1/.prettierrc.json create mode 100644 demo-v1/babel.config.js create mode 100644 demo-v1/package.json create mode 100644 demo-v1/src/components/App.tsx create mode 100644 demo-v1/src/components/CallDurationTimer.ts create mode 100644 demo-v1/src/components/Components.tsx create mode 100644 demo-v1/src/components/Keypad.tsx create mode 100644 demo-v1/src/components/screens/CallEndedScreen.tsx create mode 100644 demo-v1/src/components/screens/CallingScreen.tsx create mode 100644 demo-v1/src/components/screens/DialingScreen.tsx create mode 100644 demo-v1/src/components/screens/KeypadScreen.tsx create mode 100644 demo-v1/src/components/screens/LoginScreen.tsx create mode 100644 demo-v1/src/hooks/useAutoFocus.ts create mode 100644 demo-v1/src/hooks/useCti.ts create mode 100644 demo-v1/src/hooks/useTimer.ts create mode 100644 demo-v1/src/index.tsx create mode 100644 demo-v1/src/utils/millisecondsToFormattedDuration.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExButton.stories.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExButton.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExCloseButton.js create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExFileButton.js create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExIconButton.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/button/VizExLoadingButton.js create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/ButtonSizes.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/ButtonUses.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/IconButtonShapes.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/IconButtonSizeToIconSize.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/IconButtonUses.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/constants/LoadingButtonUses.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/theme/buttonTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/theme/closeButtonThemeOperators.js create mode 100644 demo-v1/src/visitor-ui-component-library/button/theme/iconButtonTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/button/theme/iconButtonThemeOperators.ts create mode 100644 demo-v1/src/visitor-ui-component-library/card/VizExCard.js create mode 100644 demo-v1/src/visitor-ui-component-library/constants/keyCodes.ts create mode 100644 demo-v1/src/visitor-ui-component-library/constants/sizes.ts create mode 100644 demo-v1/src/visitor-ui-component-library/input/VizExCheckbox.js create mode 100644 demo-v1/src/visitor-ui-component-library/input/VizExExpandingInput.js create mode 100644 demo-v1/src/visitor-ui-component-library/input/VizExInput.js create mode 100644 demo-v1/src/visitor-ui-component-library/input/constants/ExpandingInputVariations.ts create mode 100644 demo-v1/src/visitor-ui-component-library/input/constants/InputVariations.ts create mode 100644 demo-v1/src/visitor-ui-component-library/input/theme/checkboxThemeOperators.js create mode 100644 demo-v1/src/visitor-ui-component-library/input/theme/expandingInputThemeOperators.js create mode 100644 demo-v1/src/visitor-ui-component-library/input/theme/inputThemeOperators.js create mode 100644 demo-v1/src/visitor-ui-component-library/link/VizExExternalLink.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/link/VizExLink.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/link/constants/LinkVariations.ts create mode 100644 demo-v1/src/visitor-ui-component-library/link/theme/linkTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/link/theme/linkThemeOperators.ts create mode 100644 demo-v1/src/visitor-ui-component-library/list/VizExList.stories.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/list/VizExList.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/list/VizExListItemButton.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/list/theme/listItemButtonTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/list/theme/listTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/ratings/VizExCsatRating.js create mode 100644 demo-v1/src/visitor-ui-component-library/ratings/constants/RatingSizes.ts create mode 100644 demo-v1/src/visitor-ui-component-library/ratings/theme/VizExCsatRatingThemeOperator.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/ColorConstants.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/VizExThemeProvider.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/theme/createTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/createThemeV2.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/defaultTheme.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/defaultThemeOperators.ts create mode 100644 demo-v1/src/visitor-ui-component-library/theme/styled.d.ts create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltip.js create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipArrow.js create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipBody.js create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/constants/PlacementConstants.ts create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/theme/tooltipThemeOperators.ts create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/utils/getArrowSpacing.js create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/utils/getBodySpacing.js create mode 100644 demo-v1/src/visitor-ui-component-library/tooltip/utils/getPlacement.js create mode 100644 demo-v1/src/visitor-ui-component-library/typography/VizExSmall.js create mode 100644 demo-v1/src/visitor-ui-component-library/typography/constants/SmallVariations.ts create mode 100644 demo-v1/src/visitor-ui-component-library/typography/utils/getBodyTypographyStyles.js create mode 100644 demo-v1/src/visitor-ui-component-library/typography/utils/getHeadingStyles.js create mode 100644 demo-v1/src/visitor-ui-component-library/typography/utils/getSmallStyles.js create mode 100644 demo-v1/src/visitor-ui-component-library/utils/SyntheticEvent.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/adjustLuminance.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveAnnouncer.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.stories.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.tsx create mode 100644 demo-v1/src/visitor-ui-component-library/utils/browserTest.js create mode 100644 demo-v1/src/visitor-ui-component-library/utils/callIfValid.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/curryable.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/get.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/getContrastRatio.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/getTextColorFromBgColor.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/hexToRGB.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/hexToRgba.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/isUnsafeUrl.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/mergeDeep.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/mixins.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/pipe.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/stripHTML.js create mode 100644 demo-v1/src/visitor-ui-component-library/utils/themePropType.ts create mode 100644 demo-v1/src/visitor-ui-component-library/utils/types.ts create mode 100644 demo-v1/tsconfig.json create mode 100644 demo-v1/webpack.config.js create mode 100644 demo-v1/yarn.lock diff --git a/.eslintignore b/.eslintignore index 93c972b5..4cc54db1 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ node_modules demo/build -karma.conf.js \ No newline at end of file +karma.conf.js diff --git a/demo-v1/.eslintignore b/demo-v1/.eslintignore new file mode 100644 index 00000000..a907d23f --- /dev/null +++ b/demo-v1/.eslintignore @@ -0,0 +1,2 @@ +dist +visitor-ui-component-library diff --git a/demo-v1/.eslintrc b/demo-v1/.eslintrc new file mode 100644 index 00000000..3c908003 --- /dev/null +++ b/demo-v1/.eslintrc @@ -0,0 +1,20 @@ +{ + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript" + ], + "rules": { + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "never", + "jsx": "never", + "ts": "never", + "tsx": "never" + } + ] + } +} diff --git a/demo-v1/.prettierignore b/demo-v1/.prettierignore new file mode 100644 index 00000000..8ca45f54 --- /dev/null +++ b/demo-v1/.prettierignore @@ -0,0 +1,4 @@ +# Ignore artifacts: +dist +node_modules +visitor-ui-component-library diff --git a/demo-v1/.prettierrc.json b/demo-v1/.prettierrc.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/demo-v1/.prettierrc.json @@ -0,0 +1 @@ +{} diff --git a/demo-v1/babel.config.js b/demo-v1/babel.config.js new file mode 100644 index 00000000..91944748 --- /dev/null +++ b/demo-v1/babel.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: ["babel-plugin-styled-components"], + presets: [ + "@babel/preset-typescript", + "@babel/preset-react", + "@babel/preset-env", + ], +}; diff --git a/demo-v1/package.json b/demo-v1/package.json new file mode 100644 index 00000000..00587a3e --- /dev/null +++ b/demo-v1/package.json @@ -0,0 +1,37 @@ +{ + "name": "calling-integration-sdk-demo-v1", + "version": "0.1.0", + "description": "HubSpot calling integration sdk test app", + "private": true, + "scripts": { + "build": "webpack", + "start": "npm i && webpack-dev-server --open" + }, + "license": "ISC", + "dependencies": { + "@hubspot/calling-extensions-sdk": "^0.0.10", + "react": "^18.2.0", + "react-aria": "^3.22.0", + "react-dom": "^18.2.0", + "styled-components": "^5.3.6" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@types/styled-components": "^5.1.26", + "babel-loader": "^9.1.2", + "babel-plugin-styled-components": "^2.0.7", + "prettier": "2.8.4", + "prop-types": "^15.8.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + }, + "resolutions": { + "styled-components": "^5.3.6" + } +} diff --git a/demo-v1/src/components/App.tsx b/demo-v1/src/components/App.tsx new file mode 100644 index 00000000..4e61ebc2 --- /dev/null +++ b/demo-v1/src/components/App.tsx @@ -0,0 +1,144 @@ +import { useState, useMemo, MouseEventHandler } from "react"; +import { ThemeProvider } from "styled-components"; +import { createTheme } from "../visitor-ui-component-library/theme/createTheme"; +import { + setDisabledBackgroundColor, + setPrimaryColor, + setTextColor, +} from "../visitor-ui-component-library/theme/defaultThemeOperators"; +import { setTooltipBackgroundColor } from "../visitor-ui-component-library/tooltip/theme/tooltipThemeOperators"; +import LoginScreen from "./screens/LoginScreen"; +import KeypadScreen from "./screens/KeypadScreen"; +import DialingScreen from "./screens/DialingScreen"; +import CallingScreen from "./screens/CallingScreen"; +import CallEndedScreen from "./screens/CallEndedScreen"; +import { useCti } from "../hooks/useCti"; +import { useCallDurationTimer } from "../hooks/useTimer"; +import { WHITE } from "../visitor-ui-component-library/theme/ColorConstants"; + +export interface ScreenProps { + handleNextScreen: Function; + handlePreviousScreen: Function; + handleNavigateToScreen: Function; + cti: any; + phoneNumber: string; + engagementId: string; + dialNumber: string; + setDialNumber: Function; + notes: string; + setNotes: Function; + callDurationString: string; + startTimer: Function; + stopTimer: Function; + handleEndCall: MouseEventHandler; + handleSaveCall: MouseEventHandler; +} + +export enum ScreenNames { + Login, + Keypad, + Dialing, + Calling, + CallEnded, +} + +export const screens = [ + LoginScreen, + KeypadScreen, + DialingScreen, + CallingScreen, + CallEndedScreen, +]; + +export const formatTime = (totalSeconds: number) => { + const getTimeStr = (time: number) => + time < 10 ? `0${time}` : time.toString(); + const hour = Math.floor(totalSeconds / 3600); + const minute = Math.floor((totalSeconds - hour * 3600) / 60); + const second = totalSeconds - (hour * 3600 + minute * 60); + return `${getTimeStr(hour)}:${getTimeStr(minute)}:${getTimeStr(second)}`; +}; + +function App() { + const { cti, phoneNumber, engagementId } = useCti(); + const [screenIndex, setScreenIndex] = useState(0); + const [dialNumber, setDialNumber] = useState("+1"); + const [notes, setNotes] = useState(""); + const { callDurationString, startTimer, stopTimer } = useCallDurationTimer(); + + const handleNextScreen = () => { + if (screenIndex === screens.length - 1) { + setScreenIndex(1); + return; + } + setScreenIndex(screenIndex + 1); + }; + + const handleNavigateToScreen = (screenIndex: ScreenNames) => { + setScreenIndex(screenIndex); + }; + + const handlePreviousScreen = () => { + if (screenIndex !== 0) { + setScreenIndex(screenIndex + 1); + } + }; + + const resetInputs = () => { + setDialNumber("+1"); + setNotes(""); + }; + + const handleEndCall = () => { + stopTimer(); + cti.callAnswered(); + cti.callEnded(); + handleNavigateToScreen(ScreenNames.CallEnded); + }; + + const handleSaveCall = () => { + resetInputs(); + handleNavigateToScreen(ScreenNames.Keypad); + }; + + const screenComponent = useMemo(() => { + const Component = screens[screenIndex]; + if (!Component) { + return <>; + } + return ( + + ); + }, [screenIndex, dialNumber, notes, callDurationString]); + + return ( + +
{screenComponent}
+
+ ); +} + +export default App; diff --git a/demo-v1/src/components/CallDurationTimer.ts b/demo-v1/src/components/CallDurationTimer.ts new file mode 100644 index 00000000..72b0e9e1 --- /dev/null +++ b/demo-v1/src/components/CallDurationTimer.ts @@ -0,0 +1,25 @@ +import { useCallback, useEffect, useState } from "react"; +import { millisecondsToFormattedDuration } from "../utils/millisecondsToFormattedDuration"; + +export const CallDurationString = ({ + callStartTime, +}: { + callStartTime: number; +}) => { + const [callDurationString, setCallDurationString] = useState( + millisecondsToFormattedDuration(0) + ); + const tick = useCallback(() => { + setCallDurationString( + millisecondsToFormattedDuration(Date.now() - callStartTime) + ); + }, [callStartTime]); + + useEffect(() => { + const timerId = setInterval(tick, 1000); + return () => { + clearInterval(timerId); + }; + }, [tick]); + return callDurationString; +}; diff --git a/demo-v1/src/components/Components.tsx b/demo-v1/src/components/Components.tsx new file mode 100644 index 00000000..8000d14c --- /dev/null +++ b/demo-v1/src/components/Components.tsx @@ -0,0 +1,84 @@ +import styled from "styled-components"; +import VizExButton from "../visitor-ui-component-library/button/VizExButton"; +// @ts-expect-error module not typed +import VizExInput from "../visitor-ui-component-library/input/VizExInput"; +import VizExLink from "../visitor-ui-component-library/link/VizExLink"; +// @ts-expect-error module not typed +import VizExTooltip from "../visitor-ui-component-library/tooltip/VizExTooltip"; +import { setPrimaryColor } from "../visitor-ui-component-library/theme/defaultThemeOperators"; +import { DEFAULT_INPUT_BORDER_COLOR } from "../visitor-ui-component-library/theme/ColorConstants"; +import { createTheme } from "../visitor-ui-component-library/theme/createTheme"; + +/** + * This file has a dependency on visitor-ui-component-library. Do not directly edit files in the library! + */ + +export const TextArea = styled.textarea` + border: 1px solid ${DEFAULT_INPUT_BORDER_COLOR}; +`; + +export const Wrapper = styled.div` + margin: 10px 40px; +`; + +export const Input = styled(VizExInput).attrs({ + backgroundColor: "white", +})``; + +export const KeypadInput = styled(VizExInput).attrs({ + containerStyles: { width: "225px" }, +})``; + +export const RoundedInput = styled(VizExInput).attrs({ + containerStyles: { borderRadius: "25px", marginBottom: "10px" }, +})``; + +export const Button = styled(VizExButton).attrs((props) => ({ + disabled: props.disabled, +}))``; + +export const RoundedButton = styled(Button).attrs((props) => ({ + disabled: props.disabled, +}))` + border-radius: 25px; + min-width: 150px; +`; + +export const EndCallButton = styled(RoundedButton).attrs({ + theme: createTheme(setPrimaryColor("#d94c53")), +})``; + +export const Row = styled.div` + display: flex; + justify-content: space-evenly; +`; + +export const Link = styled(VizExLink)``; + +export const Key = styled(VizExButton).attrs({ + use: "transparent-on-primary", + theme: createTheme(setPrimaryColor("#516f90")), +})` + width: 65px; + height: 65px; + text-align: center; + font-size: 24px; + margin: 0 0 10px 0; + border: none; +`; + +export const CallActionButton = styled(VizExButton)` + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + border-radius: 50%; +`; + +export const Timer = styled.div` + margin-bottom: 20px; +`; + +export const Tooltip = styled(VizExTooltip).attrs({ + placement: "bottom right", +})``; diff --git a/demo-v1/src/components/Keypad.tsx b/demo-v1/src/components/Keypad.tsx new file mode 100644 index 00000000..b00d96a5 --- /dev/null +++ b/demo-v1/src/components/Keypad.tsx @@ -0,0 +1,55 @@ +import { Key, Row } from "./Components"; + +export function Keypad({ addToDialNumber }: { addToDialNumber: Function }) { + return ( +
+ + addToDialNumber("1")}>1 + addToDialNumber("2")}>2 + addToDialNumber("3")}>3 + + + addToDialNumber("4")}>4 + addToDialNumber("5")}>5 + addToDialNumber("6")}>6 + + + addToDialNumber("7")}>7 + addToDialNumber("8")}>8 + addToDialNumber("9")}>9 + + + addToDialNumber("*")}>* + addToDialNumber("0")}>0 + addToDialNumber("#")}># + +
+ ); +} + +export function KeypadPopover() { + return ( +
+ + 1 + 2 + 3 + + + 4 + 5 + 6 + + + 7 + 8 + 9 + + + * + 0 + # + +
+ ); +} diff --git a/demo-v1/src/components/screens/CallEndedScreen.tsx b/demo-v1/src/components/screens/CallEndedScreen.tsx new file mode 100644 index 00000000..d66f8a06 --- /dev/null +++ b/demo-v1/src/components/screens/CallEndedScreen.tsx @@ -0,0 +1,40 @@ +import { ChangeEvent } from "react"; +import { ScreenProps } from "../App"; +import { RoundedButton, Row, Timer, TextArea } from "../Components"; + +function CallEndedScreen({ + handleSaveCall, + dialNumber, + notes, + setNotes, + callDurationString, +}: ScreenProps) { + const handleNotes = (event: ChangeEvent) => { + setNotes(event.target.value); + }; + + return ( + <> +
+

Call with {dialNumber} ended

+ {callDurationString} +
+ Notes + + + + + + Save Call + + + + ); +} + +export default CallEndedScreen; diff --git a/demo-v1/src/components/screens/CallingScreen.tsx b/demo-v1/src/components/screens/CallingScreen.tsx new file mode 100644 index 00000000..6b42c542 --- /dev/null +++ b/demo-v1/src/components/screens/CallingScreen.tsx @@ -0,0 +1,156 @@ +import { useState, ChangeEvent } from "react"; +import styled from "styled-components"; +import { ScreenProps } from "../App"; +import { + CallActionButton, + EndCallButton, + Row, + Timer, + Tooltip, + TextArea, +} from "../Components"; +import { KeypadPopover } from "../Keypad"; + +const Label = styled.label` + font-size: 11px; + color: #444; + line-height: 40px; + margin-left: 10px; +`; + +const content = ; + +function CallingScreen({ + dialNumber, + notes, + setNotes, + callDurationString, + handleEndCall, +}: ScreenProps) { + const [toggleRecord, setToggleRecord] = useState(false); + const [toggleMute, setToggleMute] = useState(false); + const [toggleKeypad, setToggleKeypad] = useState(false); + + const handleToggleRecord = () => { + setToggleRecord(!toggleRecord); + }; + const handleToggleMute = () => { + setToggleMute(!toggleMute); + }; + const handleToggleKeypad = () => { + setToggleKeypad(!toggleKeypad); + }; + + const handleNotes = (event: ChangeEvent) => { + setNotes(event.target.value); + }; + + return ( + <> +
+

Call with {dialNumber} ...

+ {callDurationString} +
+ +
+ {toggleRecord ? ( + <> + + X + + + + ) : ( + <> + + X + + + + )} +
+
+ {toggleMute ? ( + <> + + Y + + + + ) : ( + <> + + Y + + + + )} +
+
+ {toggleKeypad ? ( + + <> + + Z + + + + + ) : ( + + <> + + Z + + + + + )} +
+
+ + + End Call + + +
+
+
+ Notes + + + + + ); +} + +export default CallingScreen; diff --git a/demo-v1/src/components/screens/DialingScreen.tsx b/demo-v1/src/components/screens/DialingScreen.tsx new file mode 100644 index 00000000..c95f9f51 --- /dev/null +++ b/demo-v1/src/components/screens/DialingScreen.tsx @@ -0,0 +1,33 @@ +import { useEffect } from "react"; +import { EndCallButton, Row, Timer } from "../Components"; +import { ScreenProps } from "../App"; + +function DialingScreen({ + handleNextScreen, + dialNumber, + callDurationString, + handleEndCall, +}: ScreenProps) { + useEffect(() => { + const timer = setTimeout(() => { + handleNextScreen(); + }, 3000); + return () => clearTimeout(timer); + }, []); + + return ( + <> +
+

Dialing {dialNumber} ...

+ {callDurationString} +
+ + + End Call + + + + ); +} + +export default DialingScreen; diff --git a/demo-v1/src/components/screens/KeypadScreen.tsx b/demo-v1/src/components/screens/KeypadScreen.tsx new file mode 100644 index 00000000..6534fa9e --- /dev/null +++ b/demo-v1/src/components/screens/KeypadScreen.tsx @@ -0,0 +1,113 @@ +import { useState, ChangeEvent, useCallback } from "react"; +import { useAutoFocus } from "../../hooks/useAutoFocus"; +import { ScreenNames, ScreenProps } from "../App"; +import { + Wrapper, + RoundedButton, + Link, + KeypadInput, + Row, + Button, +} from "../Components"; +import { Keypad } from "../Keypad"; + +function KeypadScreen({ + handleNextScreen, + cti, + dialNumber, + setDialNumber, + handleNavigateToScreen, + startTimer, +}: ScreenProps) { + const dialNumberInput = useAutoFocus(); + const [cursorStart, setCursorStart] = useState(0); + const [cursorEnd, setCursorEnd] = useState(0); + const [isDialNumberValid, setIsDialNumberValid] = useState(false); + + const validatePhoneNumber = (value: string) => { + return value.length > 2; + }; + + const handleLogout = () => { + cti.userLoggedOut(); + handleNavigateToScreen(ScreenNames.Login); + }; + + const handleCursor = ({ + target: { selectionStart, selectionEnd }, + }: ChangeEvent) => { + setCursorStart(selectionStart || 0); + setCursorEnd(selectionEnd || 0); + }; + + const handleSetDialNumber = useCallback((value: string) => { + setDialNumber(value); + if (validatePhoneNumber(value)) { + setIsDialNumberValid(true); + return; + } + setIsDialNumberValid(false); + }, []); + + const handleDialNumber = ({ + target: { value }, + }: ChangeEvent) => { + handleSetDialNumber(value); + }; + + const addToDialNumber = (value: string) => { + handleSetDialNumber(dialNumber + value); + dialNumberInput.current?.focus(); + }; + + const handleStartCall = useCallback(() => { + cti.outgoingCall({ + createEngagement: "true", + phoneNumber: dialNumber, + }); + startTimer(Date.now()); + handleNextScreen(); + }, [cti]); + + const handleBackspace = useCallback(() => { + let updatedDialNumber = + dialNumber.substring(0, cursorStart) + dialNumber.substring(cursorEnd); + if (cursorStart === cursorEnd) { + updatedDialNumber = + dialNumber.substring(0, cursorStart - 1) + + dialNumber.substring(cursorEnd); + } + + handleSetDialNumber(updatedDialNumber); + dialNumberInput.current!.value = updatedDialNumber; + dialNumberInput.current!.setSelectionRange(cursorStart, cursorStart); + dialNumberInput.current!.focus(); + }, [cursorEnd, cursorStart, dialNumber]); + + return ( + + Logout +
+ + +
+ + + + Call + + +
+ ); +} + +export default KeypadScreen; diff --git a/demo-v1/src/components/screens/LoginScreen.tsx b/demo-v1/src/components/screens/LoginScreen.tsx new file mode 100644 index 00000000..b2c12a72 --- /dev/null +++ b/demo-v1/src/components/screens/LoginScreen.tsx @@ -0,0 +1,49 @@ +import { useState, ChangeEvent } from "react"; +import { useAutoFocus } from "../../hooks/useAutoFocus"; +import { Wrapper, RoundedInput, RoundedButton, Row, Link } from "../Components"; +import { ScreenProps } from "../App"; + +function LoginScreen({ cti, handleNextScreen }: ScreenProps) { + const usernameInput = useAutoFocus(); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + + const handleLogin = () => { + cti.userLoggedIn(); + handleNextScreen(); + }; + + const handleUsername = ({ + target: { value }, + }: ChangeEvent) => setUsername(value); + const handlePassword = ({ + target: { value }, + }: ChangeEvent) => setPassword(value); + + return ( + +

Log into your calling account

+
User Name
+ +
Password
+ + + + Log in + + +
+ + + Sign in with SSO + + +
+ ); +} + +export default LoginScreen; diff --git a/demo-v1/src/hooks/useAutoFocus.ts b/demo-v1/src/hooks/useAutoFocus.ts new file mode 100644 index 00000000..d304f71c --- /dev/null +++ b/demo-v1/src/hooks/useAutoFocus.ts @@ -0,0 +1,11 @@ +import { useRef, useEffect } from "react"; + +export const useAutoFocus = () => { + const inputRef = useRef(null); + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }, []); + return inputRef; +}; diff --git a/demo-v1/src/hooks/useCti.ts b/demo-v1/src/hooks/useCti.ts new file mode 100644 index 00000000..3a367dfb --- /dev/null +++ b/demo-v1/src/hooks/useCti.ts @@ -0,0 +1,51 @@ +import { useMemo, useState } from "react"; + +// @ts-expect-error module not typed +// import CallingExtensions from "@hubspot/calling-extensions-sdk"; +import CallingExtensions from "../../../src/CallingExtensions"; + +const handleMessage = (event: any) => { + console.log("Incoming Message: ", event.type, event); +}; +export const useCti = () => { + const defaultSize = { width: 400, height: 600 }; + const [phoneNumber, setPhoneNumber] = useState(""); + const [engagementId, setEngagementId] = useState(""); + const cti = useMemo(() => { + return new CallingExtensions({ + debugMode: true, + eventHandlers: { + onReady: () => { + cti.initialized({ isLoggedIn: true, sizeInfo: defaultSize }); + }, + onDialNumber: (data: any, rawEvent: any) => { + handleMessage(rawEvent); + const { phoneNumber } = data; + setPhoneNumber(phoneNumber); + window.setTimeout( + () => + cti.outgoingCall({ + createEngagement: true, + phoneNumber, + }), + 500 + ); + }, + onEngagementCreated: (data: any, rawEvent: any) => { + const { engagementId } = data; + setEngagementId(engagementId); + handleMessage(rawEvent); + }, + onEndCall: (data: any, rawEvent: any) => { + window.setTimeout(() => { + cti.callEnded(); + }, 500); + }, + onVisibilityChanged: (data: any, rawEvent: any) => { + handleMessage(rawEvent); + }, + }, + }); + }, []); + return { phoneNumber, engagementId, cti }; +}; diff --git a/demo-v1/src/hooks/useTimer.ts b/demo-v1/src/hooks/useTimer.ts new file mode 100644 index 00000000..cc206ea6 --- /dev/null +++ b/demo-v1/src/hooks/useTimer.ts @@ -0,0 +1,24 @@ +import { useRef, useState } from "react"; +import { millisecondsToFormattedDuration } from "../utils/millisecondsToFormattedDuration"; + +export const useCallDurationTimer = () => { + let timerId = useRef(); + const [callDurationString, setCallDurationString] = useState( + millisecondsToFormattedDuration(0) + ); + + const startTimer = (callStartTime: number) => { + const tick = () => { + setCallDurationString( + millisecondsToFormattedDuration(Date.now() - callStartTime) + ); + }; + timerId.current = setInterval(tick, 1000); + }; + + const stopTimer = () => { + clearInterval(timerId.current); + }; + + return { callDurationString, startTimer, stopTimer }; +}; diff --git a/demo-v1/src/index.tsx b/demo-v1/src/index.tsx new file mode 100644 index 00000000..5d7893b4 --- /dev/null +++ b/demo-v1/src/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import App from "./components/App"; + +const rootNode = document.getElementById("app"); +if (!rootNode) { + throw new Error("The element #app wasn't found"); +} +const root = createRoot(rootNode); +root.render(React.createElement(App)); diff --git a/demo-v1/src/utils/millisecondsToFormattedDuration.ts b/demo-v1/src/utils/millisecondsToFormattedDuration.ts new file mode 100644 index 00000000..4c48c782 --- /dev/null +++ b/demo-v1/src/utils/millisecondsToFormattedDuration.ts @@ -0,0 +1,22 @@ +export const millisecondsToFormattedDuration = (milliseconds: number) => { + const seconds = milliseconds / 1000; + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + let minutesString = `${Math.floor(minutes % 60)}`; + let secondsString = `${Math.floor(seconds % 60)}`; + + if (secondsString.length === 1) { + secondsString = 0 + secondsString; + } + if (hours > 0 && minutesString.length === 1) { + minutesString = 0 + minutesString; + } + + const duration = [minutesString, secondsString]; + if (hours > 0) { + duration.unshift(hours.toString()); + } + + return duration.join(":"); +}; diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExButton.stories.tsx b/demo-v1/src/visitor-ui-component-library/button/VizExButton.stories.tsx new file mode 100644 index 00000000..bb09bbfd --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExButton.stories.tsx @@ -0,0 +1,83 @@ +import VizExButton, { VizExButtonProps } from './VizExButton'; +// TODO: update when platform makes these available from '@storybook/react' +import { StoryFn, Meta } from '../../storybook/types'; + +export default { + title: 'VizExButton', + component: VizExButton, +} as Meta; + +export const DefaultWithControls: StoryFn = args => ( + {'Button'} +); +DefaultWithControls.argTypes = { + use: { + options: ['primary', 'secondary', 'transparent-on-primary'], + control: { type: 'radio' }, + }, + size: { + options: ['xs', 'sm', 'md'], + control: { type: 'radio' }, + }, +}; +DefaultWithControls.args = { + use: 'secondary', + size: 'md', + disabled: false, + focused: false, + hovered: false, + pressed: false, +}; + +export const Primary: StoryFn = () => ( + <> + {'Inactive'} + + {'Hovered'} + + + {'Focused'} + + + {'Pressed'} + + + {'Disabled'} + + +); + +export const Secondary: StoryFn = () => ( + <> + {'Inactive'} + + {'Hovered'} + + + {'Focused'} + + + {'Pressed'} + + + {'Disabled'} + + +); + +export const Sizes: StoryFn = () => ( + <> + + {'size="md"'} + + + {'size="sm"'} + + + {'size="xs"'} + + {'size="md"'} + {'size="sm"'} + {'size="xs"'} + +); diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExButton.tsx b/demo-v1/src/visitor-ui-component-library/button/VizExButton.tsx new file mode 100644 index 00000000..12fe46d0 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExButton.tsx @@ -0,0 +1,56 @@ +import PropTypes from 'prop-types'; +import { ReactNode, MouseEventHandler, ButtonHTMLAttributes } from 'react'; +import styled, { DefaultTheme } from 'styled-components'; +import { MEDIUM } from '../constants/sizes'; +import themePropType from '../utils/themePropType'; +import { interactionPropTypes, InteractionProps } from '../utils/types'; +import { BUTTON_SIZES } from './constants/ButtonSizes'; +import * as ButtonUses from './constants/ButtonUses'; + +const defaultProps = { + use: ButtonUses.SECONDARY, + size: MEDIUM, +}; + +export type VizExButtonProps = { + children?: ReactNode; + onClick?: MouseEventHandler; + size: keyof typeof BUTTON_SIZES; + theme?: DefaultTheme; + use: 'primary' | 'secondary' | 'transparent-on-primary'; +} & InteractionProps & + typeof defaultProps & + ButtonHTMLAttributes; + +const AbstractVizExButton = styled.button` + ${({ theme }) => theme.components.Button.style} +`; + +const NoSelect = styled.div` + user-select: none; +`; + +const VizExButton = (props: VizExButtonProps) => { + const { children, ...rest } = props; + + return ( + + {children} + + ); +}; + +VizExButton.displayName = 'VizExButton'; + +VizExButton.propTypes = { + children: PropTypes.node, + onClick: PropTypes.func, + size: PropTypes.oneOf(Object.keys(BUTTON_SIZES)), + theme: themePropType, + use: PropTypes.oneOf(Object.values(ButtonUses)), + ...interactionPropTypes, +}; + +VizExButton.defaultProps = defaultProps; + +export default VizExButton; diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExCloseButton.js b/demo-v1/src/visitor-ui-component-library/button/VizExCloseButton.js new file mode 100644 index 00000000..ee5b4c1d --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExCloseButton.js @@ -0,0 +1,73 @@ +'use es6'; + +import PropTypes from 'prop-types'; +import SVGClose from 'visitor-ui-component-library-icons/icons/SVGClose'; +import VizExIconButton from './VizExIconButton'; +import VizExIcon from '../icon/VizExIcon'; +import styled, { css, ThemeConsumer } from 'styled-components'; +import themePropType from '../utils/themePropType'; +import { TRANSPARENT_ON_BACKGROUND } from './constants/IconButtonUses'; +import { CIRCLE } from './constants/IconButtonShapes'; +import { EXTRA_SMALL, MEDIUM, SMALL } from '../constants/sizes'; +import { setTransparentOnBackgroundIconButton } from './theme/iconButtonThemeOperators'; +import { getCloseButtonColor } from './theme/closeButtonThemeOperators'; +import { ICON_BUTTON_SIZE_TO_ICON_SIZE } from './constants/IconButtonSizeToIconSize'; + +const getMarginStyles = ({ size }) => { + switch (size) { + case EXTRA_SMALL: + case SMALL: + return css` + margin-top: 8px; + margin-right: 8px; + `; + case MEDIUM: + default: + return css` + margin-top: 12px; + margin-right: 12px; + `; + } +}; +export const ButtonContainer = styled(VizExIconButton)` + right: 0; + position: absolute; + top: 0; + ${getMarginStyles} +`; + +const VizExCloseButton = props => { + const { onClick, theme, size, ...rest } = props; + return ( + + {contextTheme => ( + + } + size={ICON_BUTTON_SIZE_TO_ICON_SIZE[size]} + /> + + )} + + ); +}; + +VizExCloseButton.displayName = 'VizExCloseButton'; + +VizExCloseButton.propTypes = { + onClick: PropTypes.func, + size: PropTypes.oneOf([EXTRA_SMALL, SMALL, MEDIUM]), + theme: themePropType, +}; + +export default VizExCloseButton; diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExFileButton.js b/demo-v1/src/visitor-ui-component-library/button/VizExFileButton.js new file mode 100644 index 00000000..530d5fc8 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExFileButton.js @@ -0,0 +1,45 @@ +'use es6'; + +import { useRef, Fragment } from 'react'; +import PropTypes from 'prop-types'; +import { callIfValid } from '../utils/callIfValid'; +import styled from 'styled-components'; + +const FilePickerInput = styled.input` + display: none; +`; + +const VizExFileButton = props => { + const { children, multiple, accept, onChange, onClick, ...rest } = props; + const fileInputRef = useRef(); + const handleClick = evt => { + fileInputRef.current.click(); + callIfValid(onClick, evt); + }; + return ( + + {children({ onClick: handleClick })} + + + ); +}; +VizExFileButton.displayName = 'VizExFileButton'; +VizExFileButton.defaultProps = { + accept: [], +}; +VizExFileButton.propTypes = { + accept: PropTypes.arrayOf(PropTypes.string), + children: PropTypes.func.isRequired, + multiple: PropTypes.bool, + onChange: PropTypes.func, + onClick: PropTypes.func, +}; + +export default VizExFileButton; diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExIconButton.tsx b/demo-v1/src/visitor-ui-component-library/button/VizExIconButton.tsx new file mode 100644 index 00000000..f96fd24c --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExIconButton.tsx @@ -0,0 +1,49 @@ +import PropTypes from 'prop-types'; +import styled, { DefaultTheme } from 'styled-components'; +import themePropType from '../utils/themePropType'; +import { interactionPropTypes, InteractionProps } from '../utils/types'; +import * as IconButtonUses from './constants/IconButtonUses'; +import { CIRCLE, DEFAULT } from './constants/IconButtonShapes'; +import { MEDIUM, EXTRA_SMALL, SMALL } from '../constants/sizes'; +import { BUTTON_SIZES } from './constants/ButtonSizes'; + +const defaultProps = { + use: IconButtonUses.PRIMARY, + shape: DEFAULT, + size: MEDIUM, +}; + +export type VizExIconButtonProps = { + children?: React.ReactNode; + onClick?: React.MouseEventHandler; + shape: 'circle' | 'default'; + size: keyof typeof BUTTON_SIZES; + theme: DefaultTheme; + use: 'primary' | 'transparent-on-background' | 'transparent-on-primary'; +} & InteractionProps & + typeof defaultProps & + React.ButtonHTMLAttributes; + +const AbstractVizExIconButton = styled.button` + ${({ theme }) => theme.components.IconButton.style} +`; + +const VizExIconButton = (props: VizExIconButtonProps) => { + return ; +}; + +VizExIconButton.displayName = 'VizExIconButton'; + +VizExIconButton.propTypes = { + children: PropTypes.node, + onClick: PropTypes.func, + shape: PropTypes.oneOf([CIRCLE, DEFAULT]), + size: PropTypes.oneOf([EXTRA_SMALL, SMALL, MEDIUM]), + theme: themePropType, + use: PropTypes.oneOf(Object.values(IconButtonUses)), + ...interactionPropTypes, +}; + +VizExIconButton.defaultProps = defaultProps; + +export default VizExIconButton; diff --git a/demo-v1/src/visitor-ui-component-library/button/VizExLoadingButton.js b/demo-v1/src/visitor-ui-component-library/button/VizExLoadingButton.js new file mode 100644 index 00000000..a26c844a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/VizExLoadingButton.js @@ -0,0 +1,86 @@ +'use es6'; + +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import VizExLoadingSpinner from '../loading/VizExLoadingSpinner'; +import LoadingButtonUses, { + buttonUse, + spinnerUse, +} from './constants/LoadingButtonUses'; +import themePropType from '../utils/themePropType'; + +const Spinner = styled(VizExLoadingSpinner)` + height: 0; + position: absolute; + top: 50%; + right: 0; + transition: opacity 0.2s; + opacity: ${({ show }) => (show ? 1 : 0)}; +`; + +const ReadyWrapper = styled.div` + transition: opacity 0.2s; + opacity: ${({ show }) => (show ? 1 : 0)}; +`; + +const VizExLoadingButton = props => { + const { + children, + Button, + result, + use, + theme, + currentState, + onClick, + ...rest + } = props; + + const isReady = currentState === 'ready'; + const isSubmitting = currentState === 'submitting'; + const isDone = currentState === 'done'; + + return ( + + ); +}; + +VizExLoadingButton.propTypes = { + Button: PropTypes.node.isRequired, + children: PropTypes.node.isRequired, + currentState: PropTypes.oneOf(['ready', 'submitting', 'done']), + onClick: PropTypes.func, + result: PropTypes.node, + theme: themePropType, + use: PropTypes.oneOf(Object.values(LoadingButtonUses)), +}; + +VizExLoadingButton.defaultProps = { + 'data-test-id': 'loading-button', + use: LoadingButtonUses.PRIMARY, + onClick: () => {}, +}; + +VizExLoadingButton.displayName = 'VizExLoadingButton'; + +export default VizExLoadingButton; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/ButtonSizes.ts b/demo-v1/src/visitor-ui-component-library/button/constants/ButtonSizes.ts new file mode 100644 index 00000000..f9b403d9 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/ButtonSizes.ts @@ -0,0 +1,19 @@ +import { EXTRA_SMALL, MEDIUM, SMALL } from '../../constants/sizes'; + +export const BUTTON_SIZES = { + [EXTRA_SMALL]: 18, + [SMALL]: 28, + [MEDIUM]: 40, +}; + +export const BUTTON_PADDINGS = { + [EXTRA_SMALL]: '4px 8px', + [SMALL]: '8px 16px', + [MEDIUM]: '11px 24px', +}; + +export const BUTTON_FONT_SIZES = { + [EXTRA_SMALL]: '10px', + [SMALL]: '12px', + [MEDIUM]: '14px', +}; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/ButtonUses.ts b/demo-v1/src/visitor-ui-component-library/button/constants/ButtonUses.ts new file mode 100644 index 00000000..4201f089 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/ButtonUses.ts @@ -0,0 +1,3 @@ +export const PRIMARY = 'primary'; +export const SECONDARY = 'secondary'; +export const TRANSPARENT_ON_PRIMARY = 'transparent-on-primary'; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonShapes.ts b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonShapes.ts new file mode 100644 index 00000000..1b7520bb --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonShapes.ts @@ -0,0 +1,2 @@ +export const CIRCLE = 'circle'; +export const DEFAULT = 'default'; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonSizeToIconSize.ts b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonSizeToIconSize.ts new file mode 100644 index 00000000..f7925a54 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonSizeToIconSize.ts @@ -0,0 +1,12 @@ +import { + EXTRA_SMALL, + EXTRA_EXTRA_SMALL, + SMALL, + MEDIUM, +} from '../../constants/sizes'; + +export const ICON_BUTTON_SIZE_TO_ICON_SIZE = { + [EXTRA_SMALL]: EXTRA_EXTRA_SMALL, + [SMALL]: EXTRA_SMALL, + [MEDIUM]: SMALL, +}; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonUses.ts b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonUses.ts new file mode 100644 index 00000000..193c4130 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/IconButtonUses.ts @@ -0,0 +1,3 @@ +export const PRIMARY = 'primary'; +export const TRANSPARENT_ON_BACKGROUND = 'transparent-on-background'; +export const TRANSPARENT_ON_PRIMARY = 'transparent-on-primary'; diff --git a/demo-v1/src/visitor-ui-component-library/button/constants/LoadingButtonUses.ts b/demo-v1/src/visitor-ui-component-library/button/constants/LoadingButtonUses.ts new file mode 100644 index 00000000..1a630577 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/constants/LoadingButtonUses.ts @@ -0,0 +1,26 @@ +import * as ButtonUses from './ButtonUses'; +import * as SpinnerUses from '../../loading/constants/SpinnerUses'; + +export const PRIMARY = 'primary'; +export const SECONDARY = 'secondary'; + +type LoadingButtonUses = typeof PRIMARY | typeof SECONDARY; +const LoadingButtonUses = { PRIMARY, SECONDARY }; + +const loadingButtonToButtonMap = { + [PRIMARY]: ButtonUses.PRIMARY, + [SECONDARY]: ButtonUses.SECONDARY, +}; + +export const buttonUse = (loadingButtonUse: LoadingButtonUses) => + loadingButtonToButtonMap[loadingButtonUse]; + +const loadingButtonToSpinnerMap = { + [PRIMARY]: SpinnerUses.SECONDARY, + [SECONDARY]: SpinnerUses.PRIMARY, +}; + +export const spinnerUse = (loadingButtonUse: LoadingButtonUses) => + loadingButtonToSpinnerMap[loadingButtonUse]; + +export default LoadingButtonUses; diff --git a/demo-v1/src/visitor-ui-component-library/button/theme/buttonTheme.ts b/demo-v1/src/visitor-ui-component-library/button/theme/buttonTheme.ts new file mode 100644 index 00000000..cf1f08cb --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/theme/buttonTheme.ts @@ -0,0 +1,59 @@ +import { css } from 'styled-components'; +import { ThemeConfig } from '../../theme/styled'; +import { focusRing } from '../../utils/mixins'; +import { adjustLuminance } from '../../utils/adjustLuminance'; +import { VizExButtonProps } from '../VizExButton'; +import { BUTTON_PADDINGS, BUTTON_FONT_SIZES } from '../constants/ButtonSizes'; + +export const buttonTheme = { + baseStyle: css` + padding: ${({ size }) => BUTTON_PADDINGS[size]}; + font-size: ${({ size }) => BUTTON_FONT_SIZES[size]}; + flex-shrink: 0; + border-radius: 3px; + line-height: 16px; + outline: none; + transition: background-color 150ms ease-out; + border-style: solid; + border-width: 1px; + cursor: pointer; + text-align: center; + word-break: normal; + overflow-wrap: break-word; + background-color: transparent; + ${({ theme, use }) => + use === 'primary' + ? ` + background-color: ${theme.primary}; + border: none; + color: ${theme.textOnPrimary}; + ` + : ` + background-color: transparent; + border-color: ${theme.primary}; + color: ${theme.primary}; + `} + `, + _disabled: css` + background-color: ${({ theme }) => theme.disabledBackground}; + border: none; + color: ${({ theme }) => theme.disabledText}; + cursor: not-allowed; + user-select: none; + `, + _focused: focusRing, + _hovered: css` + ${({ theme, use }) => + `background-color: ${adjustLuminance( + theme.primary, + use === 'primary' ? 20 : 95 + )};`} + `, + _pressed: css` + ${({ theme, use }) => + `background-color: ${adjustLuminance( + theme.primary, + use === 'primary' ? -10 : 90 + )};`} + `, +} as ThemeConfig['components']['Button']; diff --git a/demo-v1/src/visitor-ui-component-library/button/theme/closeButtonThemeOperators.js b/demo-v1/src/visitor-ui-component-library/button/theme/closeButtonThemeOperators.js new file mode 100644 index 00000000..f63c8fab --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/theme/closeButtonThemeOperators.js @@ -0,0 +1,11 @@ +'use es6'; + +import { + getTextColor, + setThemeProperty, +} from '../../theme/defaultThemeOperators'; +import { get } from '../../utils/get'; + +export const getCloseButtonColor = theme => + get('closeButton', theme) || getTextColor(theme); +export const setCloseButtonColor = setThemeProperty('closeButton'); diff --git a/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonTheme.ts b/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonTheme.ts new file mode 100644 index 00000000..d151fa11 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonTheme.ts @@ -0,0 +1,84 @@ +import { css } from 'styled-components'; +import { ThemeConfig } from '../../theme/styled'; +import { focusRing } from '../../utils/mixins'; +import { CIRCLE } from '../constants/IconButtonShapes'; +import { BUTTON_SIZES } from '../constants/ButtonSizes'; +import { VizExIconButtonProps } from '../VizExIconButton'; +import { adjustLuminance } from '../../utils/adjustLuminance'; +import { hexToRgba } from '../../utils/hexToRgba'; +import { + TRANSPARENT_ON_PRIMARY, + TRANSPARENT_ON_BACKGROUND, +} from '../constants/IconButtonUses'; + +export const iconButtonTheme = { + baseStyle: css` + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: ${({ shape }) => (shape === CIRCLE ? '50%' : '3px')}; + width: ${({ size }) => BUTTON_SIZES[size] || 40}px; + height: ${({ size }) => BUTTON_SIZES[size] || 40}px; + vertical-align: middle; + padding: 0; + text-align: center; + text-overflow: clip; + font-size: 18px; + line-height: 18px; + outline: none; + transition: background-color 150ms ease-out; + border: none; + ${({ use, theme }) => + use === TRANSPARENT_ON_BACKGROUND || use === TRANSPARENT_ON_PRIMARY + ? `background-color: transparent;` + : `background-color: ${theme.primary};`} + ${({ use, theme }) => + use === TRANSPARENT_ON_BACKGROUND + ? `color: ${theme.transparentOnBackgroundIconButton || theme.primary};` + : `color: ${theme.textOnPrimary};`} + > * { + user-select: none; + } + `, + _disabled: css` + ${({ theme, use }) => ` + background-color: ${ + use === TRANSPARENT_ON_BACKGROUND || use === TRANSPARENT_ON_PRIMARY + ? 'transparent' + : theme.disabledBackground + }; + `} + color: ${({ theme }) => theme.disabledText}; + cursor: not-allowed; + `, + _focused: focusRing, + _hovered: css` + ${({ theme, use }) => { + if (use === TRANSPARENT_ON_BACKGROUND) { + return `background-color: ${hexToRgba( + theme.transparentOnBackgroundIconButton || theme.primary, + 0.1 + )};`; + } + if (use === TRANSPARENT_ON_PRIMARY) { + return `background-color: ${hexToRgba(theme.textOnPrimary, 0.1)};`; + } + return `background-color: ${adjustLuminance(theme.primary, 20)};`; + }} + `, + _pressed: css` + ${({ theme, use }) => { + if (use === TRANSPARENT_ON_BACKGROUND) { + return `background-color: ${hexToRgba( + theme.transparentOnBackgroundIconButton || theme.primary, + 0.4 + )};`; + } + if (use === TRANSPARENT_ON_PRIMARY) { + return `background-color: ${hexToRgba(theme.textOnPrimary, 0.4)};`; + } + return `background-color: ${adjustLuminance(theme.primary, -10)};`; + }} + `, +} as ThemeConfig['components']['IconButton']; diff --git a/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonThemeOperators.ts b/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonThemeOperators.ts new file mode 100644 index 00000000..45643990 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/button/theme/iconButtonThemeOperators.ts @@ -0,0 +1,30 @@ +import { + getPrimaryColor, + getDisabledTextColor, + getDisabledBackgroundColor, + getTextOnPrimaryColor, + setThemeProperty, +} from '../../theme/defaultThemeOperators'; +import { get } from '../../utils/get'; +import { DefaultTheme } from 'styled-components'; + +export const getIconButtonBackgroundColor = getPrimaryColor; +export const getIconButtonTextColor = getTextOnPrimaryColor; + +export const getTransparentOnPrimaryIconButtonBackgroundColor = getTextOnPrimaryColor; +export const getTransparentOnPrimaryIconButtonTextColor = getTextOnPrimaryColor; + +export const getTransparentOnBackgroundIconButtonBackgroundColor = ( + theme: DefaultTheme +) => get('transparentOnBackgroundIconButton', theme) || getPrimaryColor(theme); + +export const getTransparentOnBackgroundIconButtonTextColor = ( + theme: DefaultTheme +) => get('transparentOnBackgroundIconButton', theme) || getPrimaryColor(theme); + +export const setTransparentOnBackgroundIconButton = setThemeProperty( + 'transparentOnBackgroundIconButton' +); + +export const getDisabledIconButtonTextColor = getDisabledTextColor; +export const getDisabledIconButtonBackgroundColor = getDisabledBackgroundColor; diff --git a/demo-v1/src/visitor-ui-component-library/card/VizExCard.js b/demo-v1/src/visitor-ui-component-library/card/VizExCard.js new file mode 100644 index 00000000..19b1f88a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/card/VizExCard.js @@ -0,0 +1,17 @@ +'use es6'; + +import styled from 'styled-components'; + +const VizExCard = styled.div` + position: relative; + display: flex; + flex-direction: column; + margin-bottom: 16px; + width: 100%; + padding: 0; + background-color: white; + box-shadow: 0 1px 5px 0 rgba(45, 62, 80, 0.12); + border-radius: 3px; +`; + +export default VizExCard; diff --git a/demo-v1/src/visitor-ui-component-library/constants/keyCodes.ts b/demo-v1/src/visitor-ui-component-library/constants/keyCodes.ts new file mode 100644 index 00000000..ffb94cbd --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/constants/keyCodes.ts @@ -0,0 +1,4 @@ +export const UP_ARROW = 38; +export const DOWN_ARROW = 40; +export const ENTER = 13; +export const SPACE_BAR = 32; diff --git a/demo-v1/src/visitor-ui-component-library/constants/sizes.ts b/demo-v1/src/visitor-ui-component-library/constants/sizes.ts new file mode 100644 index 00000000..02fe526f --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/constants/sizes.ts @@ -0,0 +1,6 @@ +export const MEDIUM = "md"; +export const EXTRA_SMALL = "xs"; +export const SMALL = "sm"; +export const EXTRA_EXTRA_SMALL = "xxs"; +export const LARGE = "lg"; +export const EXTRA_LARGE = "xl"; diff --git a/demo-v1/src/visitor-ui-component-library/input/VizExCheckbox.js b/demo-v1/src/visitor-ui-component-library/input/VizExCheckbox.js new file mode 100644 index 00000000..54783cd1 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/VizExCheckbox.js @@ -0,0 +1,129 @@ +"use es6"; + +import { useRef } from "react"; +import styled, { css } from "styled-components"; +import PropTypes from "prop-types"; +import themePropType from "../utils/themePropType"; +import { + getCheckboxUncheckedColor, + getCheckboxCheckedColor, + getCheckboxHoverBackground, +} from "./theme/checkboxThemeOperators"; +import { adjustLuminance } from "../utils/adjustLuminance"; + +const getFocusStyles = ({ theme }) => css` + box-shadow: 0 0 0 1px ${adjustLuminance(getCheckboxCheckedColor(theme), 40)}; +`; + +const getHoverStyles = ({ checked, theme }) => css` + background-color: ${getCheckboxHoverBackground(theme)}; + color: ${!checked && adjustLuminance(getCheckboxCheckedColor(theme), 40)}; +`; + +const CheckboxBox = styled.div` + flex-shrink: 0; + height: 16px; + width: 16px; + transition: color 0.15s ease-out, background-color 0.15s ease-out; + color: ${({ checked, theme }) => + checked + ? getCheckboxCheckedColor(theme) + : getCheckboxUncheckedColor(theme)}; + border-color: currentColor; + border: 2px solid; + border-radius: 3px; + position: relative; + ${({ hover, theme, checked }) => hover && getHoverStyles({ theme, checked })}; + ${({ focus, theme }) => focus && getFocusStyles({ theme })}; +`; + +const CheckboxWrapper = styled.label` + position: relative; + display: inline-flex; + flex-direction: row; + align-items: center; + font-size: 16px; + cursor: pointer; + + :hover ${CheckboxBox} { + ${getHoverStyles} + } + + input:focus + ${CheckboxBox} { + ${getFocusStyles} + } +`; + +const CheckboxInput = styled.input` + position: absolute; + top: 0; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +`; + +const Indicator = styled.svg` + height: 100%; + width: 100%; + top: 0; + left: 0; + position: absolute; + pointer-events: none; +`; + +const ContentWrapper = styled.div` + padding-left: 8px; + user-select: none; + cursor: pointer; +`; + +const VizExCheckbox = (props) => { + const { onChange, theme, children, checked, focus, hover, ...rest } = props; + + const inputRef = useRef(null); + return ( + { + inputRef.current.focus(); + }} + data-testid="VizExCheckbox" + checked={checked} + theme={theme} + > + + + {checked && ( + + + + )} + + {children && {children}} + + ); +}; + +VizExCheckbox.displayName = "VizExCheckbox"; +VizExCheckbox.propTypes = { + checked: PropTypes.bool, + children: PropTypes.node, + focus: PropTypes.bool, + hover: PropTypes.bool, + onChange: PropTypes.func, + theme: themePropType, +}; + +export default VizExCheckbox; diff --git a/demo-v1/src/visitor-ui-component-library/input/VizExExpandingInput.js b/demo-v1/src/visitor-ui-component-library/input/VizExExpandingInput.js new file mode 100644 index 00000000..92ed49ad --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/VizExExpandingInput.js @@ -0,0 +1,221 @@ +/* hs-eslint ignored failing-rules */ +/* eslint-disable react-hooks/rules-of-hooks */ + +"use es6"; + +import { forwardRef, useEffect, useRef, useLayoutEffect } from "react"; +import PropTypes from "prop-types"; +import styled, { css } from "styled-components"; +import { callIfValid } from "../utils/callIfValid"; +import { + getExpandingInputBorderColor, + getExpandingInputErrorBorderColor, + getExpandingInputDisabledTextColor, + getExpandingInputDisabledBackgroundColor, + getExpandingInputPlaceholderColor, + getExpandingInputBackgroundColor, +} from "./theme/expandingInputThemeOperators"; +import themePropType from "../utils/themePropType"; +import { UNSTYLED, DEFAULT } from "./constants/ExpandingInputVariations"; +import { stripHTML } from "../utils/stripHTML"; +import { isIE11 } from "../utils/browserTest"; + +const isHTMLEmpty = (html) => + html.trim() === "" || + html.trim() === "
" || + html.trim() === "
" || + html.trim() === "
"; + +const getFocusStyles = () => css` + outline: none; +`; + +const getVariationStyles = ({ use, theme }) => { + switch (use) { + case UNSTYLED: + return css` + border: none; + background-color: transparent; + `; + case DEFAULT: + default: + return css` + border: 2px solid; + border-color: ${getExpandingInputBorderColor(theme)}; + background-color: ${getExpandingInputBackgroundColor(theme)}; + `; + } +}; + +const getDisabledStyles = ({ theme }) => css` + cursor: not-allowed; + background-color: ${getExpandingInputDisabledBackgroundColor(theme)}; + color: ${getExpandingInputDisabledTextColor(theme)}; + + &[contenteditable][placeholder]:empty::after { + color: ${getExpandingInputDisabledTextColor(theme)}; + cursor: not-allowed; + } +`; + +const getErrorStyles = ({ theme }) => css` + border: 2px solid; + border-color: ${getExpandingInputErrorBorderColor(theme)}; +`; + +const StyledInput = styled.div` + border-radius: 3px; + font-size: 16px; + line-height: 22px; + min-height: 40px; + max-height: ${({ maxHeight }) => + typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight || "150px"}; + overflow-x: hidden; + overflow-y: auto; + padding: 8px; + position: relative; + width: 100%; + flex-basis: 100%; + word-break: break-word; + cursor: text; + ${({ focus }) => focus && getFocusStyles()}; + ${getVariationStyles}; + + /* CSS specific to iOS devices */ + @supports (-webkit-touch-callout: none) { + /* fix for safari mobile bug, see https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile */ + cursor: pointer; + } + + &[contenteditable][placeholder]:empty { + overflow-y: hidden; + } + + &[contenteditable][placeholder]:empty::after { + display: block; + content: attr(placeholder); + position: relative; + color: ${({ theme }) => getExpandingInputPlaceholderColor(theme)}; + background-color: transparent; + cursor: text; + user-select: none; + font-size: 16px; + line-height: 22px; + height: 22px; + } + + /* This is for specifically ie 11. This media query will only resolve in versions of ie and be ignored in edge, chrome, safari, and firefox. */ + @media all and (-ms-high-contrast: none) { + &[contenteditable][placeholder]:empty::after { + position: absolute; + top: 50%; + transform: translateY(-50%); + } + } + + :focus { + ${getFocusStyles}; + } + + ${(props) => props.disabled && getDisabledStyles(props)}; + ${(props) => props.error && getErrorStyles(props)}; +`; + +const VizExExpandingInput = forwardRef((props, ref) => { + const inputRef = ref || useRef(); + + const { + onInput, + placeholder, + onChange, + value, + maxHeight, + disabled, + shouldAutofocus, + onPaste, + ...rest + } = props; + + const handleInput = (event, ...eventRest) => { + event.persist(); + if (inputRef.current.innerHTML && isHTMLEmpty(inputRef.current.innerHTML)) { + // this is to make sure the placeholder shows back up when all text is deleted from the input. + inputRef.current.innerHTML = ""; + event.target.innerText = ""; + } + + event.target.value = event.target.innerText; + callIfValid(onChange, event, ...eventRest); + callIfValid(onInput, event, ...eventRest); + }; + const handlePaste = (event) => { + event.preventDefault(); + + callIfValid(onPaste, event); + + if (!event.clipboardData.files || !event.clipboardData.files[0]) { + let text; + try { + text = event.clipboardData.getData("text/plain"); + } catch (e) { + // ie 11 + text = stripHTML(event.clipboardData.getData("text")); + } + if (document.queryCommandSupported("insertText")) { + document.execCommand("insertText", false, text); + } else { + document.execCommand("paste", false, text); + } + } + }; + useLayoutEffect(() => { + if ( + value !== null && + typeof value !== "undefined" && + value !== inputRef.current.innerText + ) { + inputRef.current.innerText = value; + } + }, [inputRef, value]); + + useEffect(() => { + if (shouldAutofocus && inputRef && inputRef.current) { + inputRef.current.focus(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const isIE = isIE11(); + const event = isIE ? { onKeyUp: handleInput } : { onInput: handleInput }; + + return ( + + ); +}); + +VizExExpandingInput.displayName = "VizExExpandingInput"; +VizExExpandingInput.propTypes = { + disabled: PropTypes.bool, + error: PropTypes.bool, + maxHeight: PropTypes.number, + onChange: PropTypes.func, + onInput: PropTypes.func, + onPaste: PropTypes.func, + placeholder: PropTypes.string, + shouldAutofocus: PropTypes.bool, + theme: themePropType, + use: PropTypes.oneOf([UNSTYLED, DEFAULT]), + value: PropTypes.string, +}; +export default VizExExpandingInput; diff --git a/demo-v1/src/visitor-ui-component-library/input/VizExInput.js b/demo-v1/src/visitor-ui-component-library/input/VizExInput.js new file mode 100644 index 00000000..2689ed16 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/VizExInput.js @@ -0,0 +1,148 @@ +"use es6"; + +import PropTypes from "prop-types"; +import styled, { css } from "styled-components"; +import themePropType from "../utils/themePropType"; +import { ON_DARK, DEFAULT } from "./constants/InputVariations"; +import { getBodyTypographyStyles } from "../typography/utils/getBodyTypographyStyles"; +import { + getInputOnDarkBackgroundColor, + getInputDisabledBackgroundColor, + getInputDisabledTextColor, + getInputPlaceholderColor, + getInputFocusColor, +} from "./theme/inputThemeOperators"; +import { + getInputBorderColor, + getInputBackgroundColor, +} from "../theme/defaultThemeOperators"; +import { forwardRef } from "react"; + +const getContainerVariationStyles = ({ theme, use }) => { + switch (use) { + case ON_DARK: + return css` + background-color: ${getInputOnDarkBackgroundColor(theme)}; + `; + case DEFAULT: + default: + return null; + } +}; + +const getContainerDisabledStyles = ({ theme }) => css` + cursor: not-allowed; + background-color: ${getInputDisabledBackgroundColor(theme)}; +`; + +const getInputDisabledStyles = ({ theme }) => css` + color: ${getInputDisabledTextColor(theme)}; + cursor: not-allowed; + &::after { + color: ${getInputDisabledTextColor(theme)}; + } +`; + +const StyledTextInput = styled.input` + ${getBodyTypographyStyles}; + height: 100%; + width: 100%; + line-height: 22px; + font-size: 16px; + padding-left: 10px; + padding-right: 10px; + border: none; + border-radius: 3px; + background: transparent; + ${(props) => props.disabled && getInputDisabledStyles(props)}; + + :focus { + outline: none; + } + + ::placeholder { + color: ${({ theme }) => getInputPlaceholderColor(theme)}; + } +`; + +const InputContainer = styled.div` + height: 42px; + line-height: 22px; + font-size: 16px; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border: 1px solid; + border-color: ${({ theme, focus }) => + focus ? getInputFocusColor(theme) : getInputBorderColor(theme)}; + background-color: ${({ theme }) => getInputBackgroundColor(theme)}; + + :focus-within { + border-color: ${({ theme }) => getInputFocusColor(theme)}; + } + + border-radius: 3px; + ${getContainerVariationStyles} + ${(props) => props.disabled && getContainerDisabledStyles(props)}; +`; + +const VizExInput = forwardRef((props, ref) => { + const { + suffix, + prefix, + disabled, + placeholder, + value, + onChange, + containerStyles, + theme, + use, + focus, + ...rest + } = props; + return ( + + {prefix} + + {suffix} + + ); +}); + +VizExInput.displayName = "VizExInput"; +VizExInput.defaultProps = { + placeholder: "", +}; +VizExInput.propTypes = { + containerStyles: PropTypes.object, + disabled: PropTypes.bool, + focus: PropTypes.bool, + onChange: PropTypes.func, + onInput: PropTypes.func, + placeholder: PropTypes.string, + prefix: PropTypes.node, + suffix: PropTypes.node, + theme: themePropType, + use: PropTypes.oneOfType([DEFAULT, ON_DARK]), + value: PropTypes.string, +}; +export default VizExInput; diff --git a/demo-v1/src/visitor-ui-component-library/input/constants/ExpandingInputVariations.ts b/demo-v1/src/visitor-ui-component-library/input/constants/ExpandingInputVariations.ts new file mode 100644 index 00000000..ea1c6177 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/constants/ExpandingInputVariations.ts @@ -0,0 +1,2 @@ +export const UNSTYLED = "unstyled"; +export const DEFAULT = "default"; diff --git a/demo-v1/src/visitor-ui-component-library/input/constants/InputVariations.ts b/demo-v1/src/visitor-ui-component-library/input/constants/InputVariations.ts new file mode 100644 index 00000000..2a186ba2 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/constants/InputVariations.ts @@ -0,0 +1,2 @@ +export const DEFAULT = "default"; +export const ON_DARK = "on-dark"; diff --git a/demo-v1/src/visitor-ui-component-library/input/theme/checkboxThemeOperators.js b/demo-v1/src/visitor-ui-component-library/input/theme/checkboxThemeOperators.js new file mode 100644 index 00000000..24db38df --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/theme/checkboxThemeOperators.js @@ -0,0 +1,11 @@ +"use es6"; + +import { + getDisabledBackgroundColor, + getInputBorderColor, + getPrimaryColor, +} from "../../theme/defaultThemeOperators"; + +export const getCheckboxHoverBackground = getDisabledBackgroundColor; +export const getCheckboxUncheckedColor = getInputBorderColor; +export const getCheckboxCheckedColor = getPrimaryColor; diff --git a/demo-v1/src/visitor-ui-component-library/input/theme/expandingInputThemeOperators.js b/demo-v1/src/visitor-ui-component-library/input/theme/expandingInputThemeOperators.js new file mode 100644 index 00000000..08395a20 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/theme/expandingInputThemeOperators.js @@ -0,0 +1,19 @@ +"use es6"; + +import { + getErrorTextColor, + getDisabledBackgroundColor, + getDisabledTextColor, + getPlaceholderTextColor, + getInputBorderColor, + getInputBackgroundColor, +} from "../../theme/defaultThemeOperators"; + +export const getExpandingInputBorderColor = getInputBorderColor; +export const getExpandingInputBackgroundColor = getInputBackgroundColor; + +export const getExpandingInputErrorBorderColor = getErrorTextColor; +export const getExpandingInputDisabledBackgroundColor = + getDisabledBackgroundColor; +export const getExpandingInputDisabledTextColor = getDisabledTextColor; +export const getExpandingInputPlaceholderColor = getPlaceholderTextColor; diff --git a/demo-v1/src/visitor-ui-component-library/input/theme/inputThemeOperators.js b/demo-v1/src/visitor-ui-component-library/input/theme/inputThemeOperators.js new file mode 100644 index 00000000..eac002d3 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/input/theme/inputThemeOperators.js @@ -0,0 +1,16 @@ +"use es6"; + +import { + getDisabledBackgroundColor, + getDisabledTextColor, + getPlaceholderTextColor, + getPrimaryColor, +} from "../../theme/defaultThemeOperators"; +import { WHITE } from "../../theme/ColorConstants"; + +export const getInputDisabledBackgroundColor = getDisabledBackgroundColor; +export const getInputDisabledTextColor = getDisabledTextColor; +export const getInputPlaceholderColor = getPlaceholderTextColor; +export const getInputFocusColor = getPrimaryColor; + +export const getInputOnDarkBackgroundColor = () => WHITE; diff --git a/demo-v1/src/visitor-ui-component-library/link/VizExExternalLink.tsx b/demo-v1/src/visitor-ui-component-library/link/VizExExternalLink.tsx new file mode 100644 index 00000000..5b77f356 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/link/VizExExternalLink.tsx @@ -0,0 +1,43 @@ +import PropTypes from 'prop-types'; +import themePropType from '../utils/themePropType'; +import { DEFAULT } from './constants/LinkVariations'; +import { getExternalLinkIconColor } from './theme/linkThemeOperators'; +import SVGExternalLink from 'visitor-ui-component-library-icons/icons/SVGExternalLink'; +// @ts-expect-error not typed yet +import VizExIcon from '../icon/VizExIcon'; +import { createTheme } from '../theme/createTheme'; +import { setIconColor } from '../icon/theme/iconThemeOperators'; +import VizExLink, { VizExLinkProps } from './VizExLink'; + +const VizExExternalLink = (props: VizExLinkProps) => { + const { children, theme, ...rest } = props; + + return ( + + {children} + } + size="1em" + style={{ marginLeft: '4px' }} + /> + + ); +}; + +VizExExternalLink.displayName = 'VizExExternalLink'; +VizExExternalLink.propTypes = { + children: PropTypes.node, + theme: themePropType, +}; +VizExExternalLink.defaultProps = { + use: DEFAULT, +}; + +export default VizExExternalLink; diff --git a/demo-v1/src/visitor-ui-component-library/link/VizExLink.tsx b/demo-v1/src/visitor-ui-component-library/link/VizExLink.tsx new file mode 100644 index 00000000..9d3b9c7f --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/link/VizExLink.tsx @@ -0,0 +1,42 @@ +import PropTypes from 'prop-types'; +import styled, { DefaultTheme } from 'styled-components'; +import themePropType from '../utils/themePropType'; +import { interactionPropTypes, InteractionProps } from '../utils/types'; +import { ON_BRIGHT, DEFAULT, ERROR } from './constants/LinkVariations'; + +const defaultProps = { + use: DEFAULT, +}; + +export type VizExLinkProps = { + children?: React.ReactNode; + external?: boolean; + href?: string; + onClick?: React.MouseEventHandler; + theme: DefaultTheme; + use: typeof ON_BRIGHT | typeof DEFAULT | typeof ERROR; +} & InteractionProps & + typeof defaultProps & + React.AnchorHTMLAttributes; + +const StyledATag = styled.a` + ${({ theme }) => theme.components.Link.style} +`; + +const VizExLink = (props: VizExLinkProps) => { + return ; +}; + +VizExLink.displayName = 'VizExLink'; +VizExLink.propTypes = { + children: PropTypes.node, + external: PropTypes.bool, + href: PropTypes.string, + onClick: PropTypes.func, + theme: themePropType, + use: PropTypes.oneOf([ON_BRIGHT, DEFAULT, ERROR]), + ...interactionPropTypes, +}; +VizExLink.defaultProps = defaultProps; + +export default VizExLink; diff --git a/demo-v1/src/visitor-ui-component-library/link/constants/LinkVariations.ts b/demo-v1/src/visitor-ui-component-library/link/constants/LinkVariations.ts new file mode 100644 index 00000000..524be2d2 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/link/constants/LinkVariations.ts @@ -0,0 +1,3 @@ +export const ON_BRIGHT = 'on-bright'; +export const DEFAULT = 'default'; +export const ERROR = 'error'; diff --git a/demo-v1/src/visitor-ui-component-library/link/theme/linkTheme.ts b/demo-v1/src/visitor-ui-component-library/link/theme/linkTheme.ts new file mode 100644 index 00000000..9227852a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/link/theme/linkTheme.ts @@ -0,0 +1,34 @@ +import { css } from 'styled-components'; +import { ThemeConfig } from '../../theme/styled'; +import { focusRing } from '../../utils/mixins'; +import { adjustLuminance } from '../../utils/adjustLuminance'; +import { VizExLinkProps } from '../VizExLink'; +import { ON_BRIGHT, ERROR } from '../constants/LinkVariations'; + +const getLinkColor = ({ use, theme }: VizExLinkProps) => { + if (use === ON_BRIGHT) return theme.text; + if (use === ERROR) return theme.errorText; + return theme.linkText || theme.primary; +}; + +export const linkTheme = { + baseStyle: css` + cursor: pointer; + text-decoration: none; + transition: all 0.15s ease-out; + font-weight: 400; + color: ${getLinkColor}; + ${({ use }) => use === ON_BRIGHT && `text-decoration: underline;`} + ${({ use }) => use === ERROR && `font-weight: bold;`} + `, + _hovered: css` + color: ${({ use, theme }) => + adjustLuminance(getLinkColor({ use, theme }), -30)}; + text-decoration: underline; + `, + _focused: focusRing, + _pressed: css` + color: ${({ use, theme }) => + adjustLuminance(getLinkColor({ use, theme }), 30)}; + `, +} as ThemeConfig['components']['Link']; diff --git a/demo-v1/src/visitor-ui-component-library/link/theme/linkThemeOperators.ts b/demo-v1/src/visitor-ui-component-library/link/theme/linkThemeOperators.ts new file mode 100644 index 00000000..341d5fbc --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/link/theme/linkThemeOperators.ts @@ -0,0 +1,18 @@ +import { DefaultTheme } from 'styled-components'; +import { + getPrimaryColor, + getTextColor, + setThemeProperty, +} from '../../theme/defaultThemeOperators'; +import { get } from '../../utils/get'; +import { + DEFAULT_HELP_TEXT_COLOR, + DEFAULT_ERROR_TEXT_COLOR, +} from '../../theme/ColorConstants'; + +export const getLinkTextColor = (theme: DefaultTheme) => + get('linkText', theme) || getPrimaryColor(theme); +export const setLinkTextColor = setThemeProperty('linkText'); +export const getExternalLinkIconColor = () => DEFAULT_HELP_TEXT_COLOR; +export const getOnBrightLinkTextColor = getTextColor; +export const getErrorTextColor = () => DEFAULT_ERROR_TEXT_COLOR; diff --git a/demo-v1/src/visitor-ui-component-library/list/VizExList.stories.tsx b/demo-v1/src/visitor-ui-component-library/list/VizExList.stories.tsx new file mode 100644 index 00000000..9a9b2e1e --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/list/VizExList.stories.tsx @@ -0,0 +1,49 @@ +import VizExList, { VizExListProps } from './VizExList'; +// TODO: update when platform makes these available from '@storybook/react' +import { StoryFn, Meta } from '../../storybook/types'; +import VizExListItemButton from './VizExListItemButton'; + +export default { + title: 'VizExList', + component: VizExList, +} as Meta; + +export const DefaultWithControls: StoryFn = args => ( + +
  • {'first item'}
  • +
  • {'second item'}
  • +
  • {'third item'}
  • +
    +); + +DefaultWithControls.args = { + listStyled: true, +}; + +export const StyledList: StoryFn = () => ( + +
  • {'first item'}
  • +
  • {'second item'}
  • +
  • {'third item'}
  • +
    +); + +export const OrderedList: StoryFn = () => ( + +
  • {'first item'}
  • +
  • {'second item'}
  • +
  • {'third item'}
  • +
    +); + +export const InteractiveList: StoryFn = () => ( + + + {'as a button'} + + {'as an anchor link'} + + {'as a button'} + + +); diff --git a/demo-v1/src/visitor-ui-component-library/list/VizExList.tsx b/demo-v1/src/visitor-ui-component-library/list/VizExList.tsx new file mode 100644 index 00000000..6ce68ccf --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/list/VizExList.tsx @@ -0,0 +1,13 @@ +import styled from 'styled-components'; + +export interface VizExListProps { + /** If true, styles with browser ul/ol default bullet points or numbers */ + listStyled?: boolean; +} + +const VizExList = styled.ul` + ${({ listStyled }) => (listStyled ? '' : 'list-style: none;')} + ${({ theme }) => theme.components.List.style} +`; + +export default VizExList; diff --git a/demo-v1/src/visitor-ui-component-library/list/VizExListItemButton.tsx b/demo-v1/src/visitor-ui-component-library/list/VizExListItemButton.tsx new file mode 100644 index 00000000..b9c16e91 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/list/VizExListItemButton.tsx @@ -0,0 +1,49 @@ +import PropTypes from 'prop-types'; +import { forwardRef, ComponentProps } from 'react'; +import styled, { DefaultTheme, StyledComponent } from 'styled-components'; +import themePropType from '../utils/themePropType'; +import { + interactionPropTypes, + InteractionProps, + PolymorphicRef, +} from '../utils/types'; + +type Props = { + children?: React.ReactNode; + theme: DefaultTheme; + alignItems?: 'flex-start' | 'center'; + disablePadding: boolean; + disableGutters: boolean; +} & InteractionProps; + +export type VizExListItemButtonProps = Omit< + ComponentProps>, + 'theme' +>; + +const Container = styled.button` + ${({ theme }) => theme.components.ListItemButton.style} +`; + +const VizExListItemButton = forwardRef( + ( + props: VizExListItemButtonProps, + ref: PolymorphicRef + ) => { + return ; + } +); + +VizExListItemButton.displayName = 'VizExListItemButton'; +VizExListItemButton.propTypes = { + alignItems: PropTypes.oneOf(['center', 'flex-start']), + autoFocus: PropTypes.bool, + children: PropTypes.node, + disableGutters: PropTypes.bool, + disablePadding: PropTypes.bool, + ordered: PropTypes.bool, + theme: themePropType, + ...interactionPropTypes, +}; + +export default VizExListItemButton; diff --git a/demo-v1/src/visitor-ui-component-library/list/theme/listItemButtonTheme.ts b/demo-v1/src/visitor-ui-component-library/list/theme/listItemButtonTheme.ts new file mode 100644 index 00000000..fa81519c --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/list/theme/listItemButtonTheme.ts @@ -0,0 +1,36 @@ +import { css } from 'styled-components'; + +import { VizExListItemButtonProps } from '../VizExListItemButton'; +import { ThemeConfig } from '../../theme/styled'; +import { focusRing } from '../../utils/mixins'; + +export const listItemButtonTheme = { + baseStyle: css` + display: block; + width: 100%; + font-size: 14px; + text-align: left; + text-decoration: none; + background-color: transparent; + transition: background-color 150ms ease-out; + border: none; + min-height: 40px; + color: ${({ theme }) => theme.text}; + ${({ alignItems }) => alignItems && `align-items: ${alignItems};`} + padding: 0; + ${({ disablePadding }) => + !disablePadding && `padding-left: 10px; padding-right: 10px;`} + ${({ disableGutters }) => + !disableGutters && `padding-top: 10px; padding-bottom: 10px;`} + `, + _hovered: css` + background-color: rgba(0, 0, 0, 0.08); + `, + _focused: css` + ${focusRing} + outline-offset: -2px; + `, + _pressed: css` + background-color: rgba(0, 0, 0, 0.16); + `, +} as ThemeConfig['components']['ListItemButton']; diff --git a/demo-v1/src/visitor-ui-component-library/list/theme/listTheme.ts b/demo-v1/src/visitor-ui-component-library/list/theme/listTheme.ts new file mode 100644 index 00000000..8028af0a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/list/theme/listTheme.ts @@ -0,0 +1,12 @@ +import { css } from 'styled-components'; + +import { VizExListProps } from '../VizExList'; +import { ThemeConfig } from '../../theme/styled'; + +export const listTheme = { + baseStyle: css` + margin: 0; + padding: 0; + position: relative; + `, +} as ThemeConfig['components']['List']; diff --git a/demo-v1/src/visitor-ui-component-library/ratings/VizExCsatRating.js b/demo-v1/src/visitor-ui-component-library/ratings/VizExCsatRating.js new file mode 100644 index 00000000..e3b01e5b --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/ratings/VizExCsatRating.js @@ -0,0 +1,111 @@ +"use es6"; + +import PropTypes from "prop-types"; +import { useState } from "react"; +import styled from "styled-components"; +import SVGCsatSad from "visitor-ui-component-library-icons/icons/SVGCsatSad"; +import SVGCsatNeutral from "visitor-ui-component-library-icons/icons/SVGCsatNeutral"; +import SVGCsatHappy from "visitor-ui-component-library-icons/icons/SVGCsatHappy"; +import { + BORDER_RATIO_RATING, + RATING_ICON_SIZES, +} from "./constants/RatingSizes"; +import themePropType from "../utils/themePropType"; +import { + getSadColor, + getNeutralColor, + getHappyColor, +} from "./theme/VizExCsatRatingThemeOperator"; +import { MEDIUM } from "../constants/sizes"; + +const RatingComponents = [SVGCsatSad, SVGCsatNeutral, SVGCsatHappy]; + +const getIconColor = (index, theme) => { + if (index === 0) { + return getSadColor(theme); + } else if (index === 1) { + return getNeutralColor(theme); + } + return getHappyColor(theme); +}; + +const getWrapperStyle = ({ index, svgSize, theme }) => { + const bSize = Math.ceil(BORDER_RATIO_RATING * svgSize); + return ` + border-color: ${getIconColor(index, theme)}; + border-width: ${bSize}px; + padding: ${bSize}px; + `; +}; + +const Wrapper = styled.span` + cursor: pointer; + display: inline-block; + border-radius: 50%; + border-style: solid; + ${getWrapperStyle} + transition: border-color linear 0.2s; + margin: 0 4px; + + &:not(:hover):not(.selected) { + border-color: transparent; + } + + svg { + fill: ${({ index, theme }) => getIconColor(index, theme)}; + } +`; + +const RatingsContainer = styled.div` + display: inline-flex; +`; + +const VizExCsatRating = ({ iconSize = MEDIUM, onChange, theme }) => { + const ratingSize = RATING_ICON_SIZES[iconSize]; + const [selectedValue, setSelectedValue] = useState(); + const handleSelect = (rating) => () => { + setSelectedValue(rating); + if (onChange) { + onChange(rating); + } + }; + + return ( + + {RatingComponents.map((RatingComponent, index) => { + const selected = selectedValue === index; + const svgSize = ratingSize - ratingSize * BORDER_RATIO_RATING; + return ( +
    + + + +
    + ); + })} +
    + ); +}; + +VizExCsatRating.propTypes = { + iconSize: PropTypes.oneOf(Object.keys(RATING_ICON_SIZES)), + onChange: PropTypes.func, + theme: themePropType, +}; + +VizExCsatRating.displayName = "VizExCsatRating"; + +export default VizExCsatRating; diff --git a/demo-v1/src/visitor-ui-component-library/ratings/constants/RatingSizes.ts b/demo-v1/src/visitor-ui-component-library/ratings/constants/RatingSizes.ts new file mode 100644 index 00000000..da5b1069 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/ratings/constants/RatingSizes.ts @@ -0,0 +1,8 @@ +import { SMALL, MEDIUM, LARGE, EXTRA_LARGE } from "../../constants/sizes"; +export const BORDER_RATIO_RATING = 0.09; +export const RATING_ICON_SIZES = { + [SMALL]: 32, + [MEDIUM]: 48, + [LARGE]: 72, + [EXTRA_LARGE]: 108, +}; diff --git a/demo-v1/src/visitor-ui-component-library/ratings/theme/VizExCsatRatingThemeOperator.ts b/demo-v1/src/visitor-ui-component-library/ratings/theme/VizExCsatRatingThemeOperator.ts new file mode 100644 index 00000000..63099670 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/ratings/theme/VizExCsatRatingThemeOperator.ts @@ -0,0 +1,10 @@ +import { + setThemeProperty, + getThemeProperty, +} from "../../theme/defaultThemeOperators"; +export const getSadColor = getThemeProperty("sadColor"); +export const getNeutralColor = getThemeProperty("neutralColor"); +export const getHappyColor = getThemeProperty("happyColor"); +export const setSadColor = setThemeProperty("sadColor"); +export const setNeutralColor = setThemeProperty("neutralColor"); +export const setHappyColor = setThemeProperty("happyColor"); diff --git a/demo-v1/src/visitor-ui-component-library/theme/ColorConstants.ts b/demo-v1/src/visitor-ui-component-library/theme/ColorConstants.ts new file mode 100644 index 00000000..8a0799f0 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/ColorConstants.ts @@ -0,0 +1,22 @@ +export const WHITE = '#fff'; +export const GREEN = '#00bda5'; +export const GREY = '#cbd6e2'; + +export const DEFAULT_PRIMARY_COLOR = '#f15f79'; +export const DEFAULT_TEXT_COLOR = '#33475b'; +export const DEFAULT_ERROR_TEXT_COLOR = '#f2545b'; +export const DISABLED_BACKGROUND_COLOR = '#eaf0f6'; +export const DISABLED_TEXT_COLOR = '#b0c1d4'; + +export const DEFAULT_HELP_TEXT_COLOR = '#425b76'; +export const DEFAULT_PLACEHOLDER_TEXT_COLOR = '#7b98b6'; + +export const DEFAULT_INPUT_BORDER_COLOR = '#cbd6e2'; +export const DEFAULT_INPUT_BACKGROUND_COLOR = '#f5f8fa'; + +export const DEFAULT_HAPPY_COLOR = '#a2d28f'; +export const DEFAULT_NEUTRAL_COLOR = '#fea58e'; +export const DEFAULT_SAD_COLOR = '#ea90b1'; + +export const DEFAULT_TOOLTIP_BACKGROUND_COLOR = '#425b76'; +export const DEFAULT_TOOLTIP_TEXT_COLOR = WHITE; diff --git a/demo-v1/src/visitor-ui-component-library/theme/VizExThemeProvider.tsx b/demo-v1/src/visitor-ui-component-library/theme/VizExThemeProvider.tsx new file mode 100644 index 00000000..8870fe07 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/VizExThemeProvider.tsx @@ -0,0 +1,25 @@ +import PropTypes from 'prop-types'; +import { DefaultTheme, ThemeProvider } from 'styled-components'; +import VizExGlobalStyle from '../global/VizExGlobalStyle'; +import themePropType from '../utils/themePropType'; +import { ReactNode } from 'react'; + +export type VizExThemeProviderProps = { + theme: DefaultTheme; + children: ReactNode; +}; + +const VizExThemeProvider = ({ theme, children }: VizExThemeProviderProps) => ( + + {children} + + +); + +VizExThemeProvider.displayName = 'VizExThemeProvider'; +VizExThemeProvider.propTypes = { + children: PropTypes.node, + theme: themePropType, +}; + +export default VizExThemeProvider; diff --git a/demo-v1/src/visitor-ui-component-library/theme/createTheme.ts b/demo-v1/src/visitor-ui-component-library/theme/createTheme.ts new file mode 100644 index 00000000..c9dc0707 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/createTheme.ts @@ -0,0 +1,64 @@ +import { pipe } from '../utils/pipe'; +import { + DEFAULT_PRIMARY_COLOR, + DEFAULT_TEXT_COLOR, + DEFAULT_ERROR_TEXT_COLOR, + DISABLED_BACKGROUND_COLOR, + DISABLED_TEXT_COLOR, + WHITE, + DEFAULT_PLACEHOLDER_TEXT_COLOR, + DEFAULT_INPUT_BACKGROUND_COLOR, + DEFAULT_INPUT_BORDER_COLOR, + DEFAULT_HELP_TEXT_COLOR, + DEFAULT_SAD_COLOR, + DEFAULT_NEUTRAL_COLOR, + DEFAULT_HAPPY_COLOR, + DEFAULT_TOOLTIP_BACKGROUND_COLOR, + DEFAULT_TOOLTIP_TEXT_COLOR, +} from './ColorConstants'; +import { + setPrimaryColor, + setTextColor, + setErrorTextColor, + setDisabledBackgroundColor, + setDisabledTextColor, + setTextOnPrimaryColor, + setPlaceholderTextColor, + setInputBackgroundColor, + setInputBorderColor, + setHelpTextColor, +} from './defaultThemeOperators'; +import { + setNeutralColor, + setSadColor, + setHappyColor, +} from '../ratings/theme/VizExCsatRatingThemeOperator'; +import { + setTooltipBackgroundColor, + setTooltipTextColor, +} from '../tooltip/theme/tooltipThemeOperators'; +import { DefaultTheme } from 'styled-components'; +import { components as defaultComponents } from './defaultTheme'; +import { computeComponentStyles } from './createThemeV2'; + +export const createTheme = (...themeOperatorOverrides: any[]) => + pipe( + setPrimaryColor(DEFAULT_PRIMARY_COLOR), + setTextColor(DEFAULT_TEXT_COLOR), + setErrorTextColor(DEFAULT_ERROR_TEXT_COLOR), + setDisabledBackgroundColor(DISABLED_BACKGROUND_COLOR), + setDisabledTextColor(DISABLED_TEXT_COLOR), + setTextOnPrimaryColor(WHITE), + setPlaceholderTextColor(DEFAULT_PLACEHOLDER_TEXT_COLOR), + setInputBackgroundColor(DEFAULT_INPUT_BACKGROUND_COLOR), + setInputBorderColor(DEFAULT_INPUT_BORDER_COLOR), + setHelpTextColor(DEFAULT_HELP_TEXT_COLOR), + setSadColor(DEFAULT_SAD_COLOR), + setNeutralColor(DEFAULT_NEUTRAL_COLOR), + setHappyColor(DEFAULT_HAPPY_COLOR), + setTooltipBackgroundColor(DEFAULT_TOOLTIP_BACKGROUND_COLOR), + setTooltipTextColor(DEFAULT_TOOLTIP_TEXT_COLOR), + ...themeOperatorOverrides + )({ + components: computeComponentStyles(defaultComponents), + }) as DefaultTheme; diff --git a/demo-v1/src/visitor-ui-component-library/theme/createThemeV2.ts b/demo-v1/src/visitor-ui-component-library/theme/createThemeV2.ts new file mode 100644 index 00000000..6f59abbe --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/createThemeV2.ts @@ -0,0 +1,78 @@ +import { ThemeConfig, ThemeFactoryConfig } from './styled'; +import { + colors as defaultColors, + components as defaultComponents, +} from './defaultTheme'; +import { mergeDeep } from '../utils/mergeDeep'; +import { css, DefaultTheme } from 'styled-components'; + +export type CSS = ReturnType; +export type InteractionStyles = { + _disabled: CSS; + _focused: CSS; + _hovered: CSS; + _pressed: CSS; +}; + +export const wrapWithSelector = (selector: string, style: CSS) => + css` + ${selector} { + ${style} + } + `; +export function getComponentStyles>({ + baseStyle, + _disabled, + _focused, + _hovered, + _pressed, +}: Partial & { baseStyle?: CSS }) { + return css` + ${baseStyle} + ${({ disabled }) => (disabled ? _disabled : '')} + ${({ focused }) => (focused ? _focused : '')} + ${({ hovered }) => (hovered ? _hovered : '')} + ${({ pressed }) => (pressed ? _pressed : '')} + ${_disabled && wrapWithSelector('&:disabled', _disabled)} + ${_focused && wrapWithSelector('&:focus-visible', _focused)} + ${_hovered && + wrapWithSelector(_disabled ? '&:hover:enabled' : '&:hover', _hovered)} + ${_pressed && + wrapWithSelector(_disabled ? '&:active:enabled' : '&:active', _pressed)} + `; +} +export const computeComponentStyles = (components: ThemeConfig['components']) => + Object.entries(components || {}).reduce((acc, [component, styleProps]) => { + return { + ...acc, + [component]: { + style: css>` + ${getComponentStyles(styleProps)} + `, + }, + }; + }, {}) as DefaultTheme['components']; + +/** + * Creates the theme object to customize the components based on the passed overrides. + * + * @param overrides A theme configuration object to merge/override the default values. + * @returns The theme object used internally by the component library. + */ +export const createThemeV2 = ( + overrides: ThemeFactoryConfig = {} +): DefaultTheme => { + const mergedColors = overrides.colors + ? mergeDeep(defaultColors, overrides.colors) + : defaultColors; + + return { + ...mergedColors, + colors: mergedColors, + components: computeComponentStyles( + overrides.components + ? mergeDeep(defaultComponents, overrides.components) + : defaultComponents + ), + }; +}; diff --git a/demo-v1/src/visitor-ui-component-library/theme/defaultTheme.ts b/demo-v1/src/visitor-ui-component-library/theme/defaultTheme.ts new file mode 100644 index 00000000..a77f0cf5 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/defaultTheme.ts @@ -0,0 +1,51 @@ +import { + DEFAULT_PRIMARY_COLOR, + DEFAULT_TEXT_COLOR, + DEFAULT_ERROR_TEXT_COLOR, + DISABLED_BACKGROUND_COLOR, + DISABLED_TEXT_COLOR, + WHITE, + DEFAULT_PLACEHOLDER_TEXT_COLOR, + DEFAULT_INPUT_BACKGROUND_COLOR, + DEFAULT_INPUT_BORDER_COLOR, + DEFAULT_HELP_TEXT_COLOR, + DEFAULT_SAD_COLOR, + DEFAULT_NEUTRAL_COLOR, + DEFAULT_HAPPY_COLOR, +} from './ColorConstants'; +import { ThemeConfig } from './styled'; +import { buttonTheme } from '../button/theme/buttonTheme'; +import { iconButtonTheme } from '../button/theme/iconButtonTheme'; +import { linkTheme } from '../link/theme/linkTheme'; +import { listItemButtonTheme } from '../list/theme/listItemButtonTheme'; +import { listTheme } from '../list/theme/listTheme'; + +export const colors = { + primary: DEFAULT_PRIMARY_COLOR, + text: DEFAULT_TEXT_COLOR, + textOnPrimary: WHITE, + errorText: DEFAULT_ERROR_TEXT_COLOR, + disabledBackground: DISABLED_BACKGROUND_COLOR, + disabledText: DISABLED_TEXT_COLOR, + placeholderText: DEFAULT_PLACEHOLDER_TEXT_COLOR, + inputBorder: DEFAULT_INPUT_BORDER_COLOR, + inputBackground: DEFAULT_INPUT_BACKGROUND_COLOR, + helpText: DEFAULT_HELP_TEXT_COLOR, + happyColor: DEFAULT_HAPPY_COLOR, + neutralColor: DEFAULT_NEUTRAL_COLOR, + sadColor: DEFAULT_SAD_COLOR, +}; + +export const components = { + Button: buttonTheme, + IconButton: iconButtonTheme, + Link: linkTheme, + List: listTheme, + ListItemButton: listItemButtonTheme, +}; + +export const defaultTheme = { + ...colors, // will refactor out colors from here to the new colors key in the future + colors, + components, +} as ThemeConfig; diff --git a/demo-v1/src/visitor-ui-component-library/theme/defaultThemeOperators.ts b/demo-v1/src/visitor-ui-component-library/theme/defaultThemeOperators.ts new file mode 100644 index 00000000..eaffc2e6 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/defaultThemeOperators.ts @@ -0,0 +1,57 @@ +import { DefaultTheme } from 'styled-components'; +import { curryable } from '../utils/curryable'; + +export const getThemeProperty = curryable( + (key: keyof DefaultTheme, theme: DefaultTheme) => { + if (typeof theme !== 'object' || theme === null) { + throw new Error( + `Error getting '${key}': the theme for VizExComponents has not been defined. Please provide a theme through the component props or styled-components ThemeProvider.` + ); + } + if (!theme[key]) { + throw new Error( + `Error getting '${key}': the property was not defined on theme.` + ); + } + return theme[key]; + } +); + +export const setThemeProperty = curryable( + (key: keyof DefaultTheme, value: any, theme: DefaultTheme) => ({ + ...theme, + [key]: value, + }) +); + +export const getPrimaryColor = getThemeProperty('primary'); +export const setPrimaryColor = setThemeProperty('primary'); + +export const getTextColor = getThemeProperty('text'); +export const setTextColor = setThemeProperty('text'); + +export const getTextOnPrimaryColor = getThemeProperty('textOnPrimary'); +export const setTextOnPrimaryColor = setThemeProperty('textOnPrimary'); + +export const getErrorTextColor = getThemeProperty('errorText'); +export const setErrorTextColor = setThemeProperty('errorText'); + +export const getDisabledBackgroundColor = + getThemeProperty('disabledBackground'); +export const setDisabledBackgroundColor = + setThemeProperty('disabledBackground'); + +export const getDisabledTextColor = getThemeProperty('disabledText'); +export const setDisabledTextColor = setThemeProperty('disabledText'); + +export const setPlaceholderTextColor = setThemeProperty('placeholderText'); +export const getPlaceholderTextColor = getThemeProperty('placeholderText'); + +export const getInputBorderColor = getThemeProperty('inputBorder'); +export const setInputBorderColor = setThemeProperty('inputBorder'); + +export const getInputBackgroundColor = getThemeProperty('inputBackground'); +export const setInputBackgroundColor = setThemeProperty('inputBackground'); + +export const setHelpTextColor = setThemeProperty('helpText'); +export const getHelpTextColor = getThemeProperty('helpText'); diff --git a/demo-v1/src/visitor-ui-component-library/theme/styled.d.ts b/demo-v1/src/visitor-ui-component-library/theme/styled.d.ts new file mode 100644 index 00000000..6404b359 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/theme/styled.d.ts @@ -0,0 +1,61 @@ +// Necessary to have a d.ts file so we can override the DefaultTheme type from styled-components +/* eslint-disable hubspot-dev/no-declarations */ +import 'styled-components'; +// eslint-disable-next-line no-duplicate-imports +import { css } from 'styled-components'; + +type Colors = { + primary: string; + text: string; + textOnPrimary: string; + errorText: string; + disabledBackground: string; + disabledText: string; + placeholderText: string; + inputBorder: string; + inputBackground: string; + helpText: string; + happyColor: string; + neutralColor: string; + sadColor: string; + transparentOnBackgroundIconButton?: string; + linkText?: string; +}; + +export type CSS = ReturnType; + +export type ThemedStyles = { + baseStyle: CSS; + _disabled: CSS; + _focused: CSS; + _hovered: CSS; + _pressed: CSS; +}; + +type ComponentTheme = { + style?: CSS; +} & Partial; + +export type ThemedComponents = + | 'Button' + | 'IconButton' + | 'Link' + | 'List' + | 'ListItemButton'; + +export type ThemeConfig = { + colors: Partial; + components: Record; +}; +export type ThemeFactoryConfig = { + colors?: Partial; + components?: Partial>; +}; +export type ThemeFinal = { + colors: Colors; + components: Record; +}; + +declare module 'styled-components' { + export interface DefaultTheme extends Colors, ThemeFinal {} +} diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltip.js b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltip.js new file mode 100644 index 00000000..f0c2d33a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltip.js @@ -0,0 +1,124 @@ +'use es6'; + +import { cloneElement, Children } from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import { PLACEMENTS } from './constants/PlacementConstants'; +import VizExTooltipArrow from './VizExTooltipArrow'; +import VizExTooltipBody from './VizExTooltipBody'; +import themePropType from '../utils/themePropType'; +import { callIfValid } from '../utils/callIfValid'; +import { useTooltipTriggerState } from '@react-stately/tooltip'; +import { useTooltipTrigger } from '@react-aria/tooltip'; + +const Popover = styled.div` + transition-property: ${({ transitioning }) => + transitioning ? 'opacity ease-out, transform ease-out' : 'none'}; + transition-duration: ${({ duration }) => duration}ms; + opacity: ${({ open }) => (open ? '1' : '0')}; + transform: ${({ open, transitioning }) => { + if (open && !transitioning) return 'none'; /* IE bugfix: #5368 */ + return open ? 'scale(1)' : 'scale(.75)'; + }}; + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; +`; + +const PopoverWrapper = styled.div` + display: inline-block; + position: relative; +`; + +const VizExTooltip = props => { + const { + content, + backgroundColor, + textColor, + placement, + children, + theme, + onOpenChange, + open, + delay = 0, + ...rest + } = props; + const hasValidOpenProp = typeof open === 'boolean'; + const tooltipTriggerProps = { + delay, + ...(hasValidOpenProp && { + isOpen: open, + }), + }; + const state = useTooltipTriggerState(tooltipTriggerProps); + const { triggerProps, tooltipProps } = useTooltipTrigger( + tooltipTriggerProps, + state, + null + ); + + if (!content) return children; + + const handleMouseEnter = () => { + if (!hasValidOpenProp) { + callIfValid(onOpenChange, true); + state.open(true); + } + }; + const handleMouseLeave = () => { + if (!hasValidOpenProp) { + callIfValid(onOpenChange, false); + state.close(true); + } + }; + + return ( + + + + {content} + + + + {cloneElement(Children.only(children), { + ...triggerProps, + onClick: children.props.onClick, + })} + + ); +}; + +VizExTooltip.propTypes = { + backgroundColor: PropTypes.string, + children: PropTypes.node, + content: PropTypes.node, + delay: PropTypes.number, + onOpenChange: PropTypes.func, + open: PropTypes.bool, + placement: PropTypes.oneOf(PLACEMENTS), + textColor: PropTypes.string, + theme: themePropType, +}; +VizExTooltip.displayName = 'VizExTooltip'; +VizExTooltip.defaultProps = { + placement: 'top right', +}; + +export default VizExTooltip; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipArrow.js b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipArrow.js new file mode 100644 index 00000000..d1d11f91 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipArrow.js @@ -0,0 +1,25 @@ +'use es6'; + +import styled from 'styled-components'; +import { getArrowSpacing } from './utils/getArrowSpacing'; +import { getTooltipBackgroundColor } from './theme/tooltipThemeOperators'; + +const VizExTooltipArrow = styled.div` + position: absolute; + pointer-events: none; + border: none; + clip-path: polygon(100% 100%, 0 100%, 100% 0); + + border-top-left-radius: 100%; + border-radius: 3px; + border-top-color: transparent !important; + border-left-color: transparent !important; + border-bottom-right-radius: 3px; + + width: 16px; + height: 16px; + background-color: ${({ theme }) => getTooltipBackgroundColor(theme)}; + ${getArrowSpacing} +`; + +export default VizExTooltipArrow; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipBody.js b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipBody.js new file mode 100644 index 00000000..7bf9c5be --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/VizExTooltipBody.js @@ -0,0 +1,29 @@ +'use es6'; + +import styled from 'styled-components'; +import { getBodySpacing } from './utils/getBodySpacing'; +import { + getTooltipBackgroundColor, + getTooltipTextColor, +} from './theme/tooltipThemeOperators'; + +const VizExTooltipBody = styled.div` + border-radius: 3px; + font-size: 13px; + max-width: 232px; + display: block; + position: absolute; + visibility: visible; + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); + line-height: 1.5; + padding: 10px 16px; + text-decoration: none; + word-wrap: break-word; + ${getBodySpacing}; + white-space: nowrap; + background-color: ${({ theme }) => getTooltipBackgroundColor(theme)}; + color: ${({ theme }) => getTooltipTextColor(theme)}; + pointer-events: ${({ open }) => (open ? 'all' : 'none')}; +`; + +export default VizExTooltipBody; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/constants/PlacementConstants.ts b/demo-v1/src/visitor-ui-component-library/tooltip/constants/PlacementConstants.ts new file mode 100644 index 00000000..ad987e1d --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/constants/PlacementConstants.ts @@ -0,0 +1,28 @@ +export const PLACEMENTS_HORIZ = ['left', 'right']; +export const PLACEMENTS_VERT = ['top', 'bottom']; + +export const PLACEMENTS_SIDES = PLACEMENTS_HORIZ.concat(PLACEMENTS_VERT); + +export const PLACEMENTS = PLACEMENTS_SIDES.concat([ + 'left top', + 'left bottom', + 'right top', + 'right bottom', + 'top left', + 'top right', + 'bottom left', + 'bottom right', + 'top center', + 'bottom center', + 'left middle', + 'right middle', +]); + +export const OPPOSITE_DIRECTIONS = { + top: 'bottom', + bottom: 'top', + left: 'right', + right: 'left', + middle: 'middle', + center: 'center', +}; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/theme/tooltipThemeOperators.ts b/demo-v1/src/visitor-ui-component-library/tooltip/theme/tooltipThemeOperators.ts new file mode 100644 index 00000000..33a12c67 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/theme/tooltipThemeOperators.ts @@ -0,0 +1,19 @@ +'use es6'; + +import { + DEFAULT_TOOLTIP_BACKGROUND_COLOR, + DEFAULT_TOOLTIP_TEXT_COLOR, +} from '../../theme/ColorConstants'; +import { + getThemeProperty, + setThemeProperty, +} from '../../theme/defaultThemeOperators'; + +// Override +export const getTooltipBackgroundColor = + getThemeProperty('tooltipBackground') || DEFAULT_TOOLTIP_BACKGROUND_COLOR; +export const setTooltipBackgroundColor = setThemeProperty('tooltipBackground'); + +export const getTooltipTextColor = + getThemeProperty('tooltipText') || DEFAULT_TOOLTIP_TEXT_COLOR; +export const setTooltipTextColor = setThemeProperty('tooltipText'); diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/utils/getArrowSpacing.js b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getArrowSpacing.js new file mode 100644 index 00000000..d6eef0eb --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getArrowSpacing.js @@ -0,0 +1,79 @@ +'use es6'; + +import { getSide, getEdge } from './getPlacement'; +import { css } from 'styled-components'; + +const ARROW_SIZE = 16; +const INSET = 8; + +const getSideStyles = ({ placement }) => { + switch (getSide(placement)) { + case 'top': + // Arrow points down + return css` + transform: rotate(45deg); + top: -${ARROW_SIZE + 5}px; + `; + case 'right': + // Arrow points left + return css` + transform: rotate(135deg); + right: -${ARROW_SIZE + 5}px; + `; + case 'bottom': + // Arrow points up + return css` + transform: rotate(-135deg); + bottom: -${ARROW_SIZE + 5}px; + `; + case 'left': + // Arrow points right + return css` + transform: rotate(-45deg); + left: -${ARROW_SIZE + 5}px; + `; + default: + return ''; + } +}; + +const getEdgeStyles = ({ placement }) => { + switch (getEdge(placement)) { + case 'top': + // Arrow is near the bottom of the left or right side + return css` + top: ${INSET}px; + `; + case 'middle': + return css` + top: calc(50% - ${ARROW_SIZE / 2}px); + `; + case 'bottom': + // Arrow is near the top of the left or right side + return css` + bottom: ${INSET}px; + `; + case 'left': + // Arrow is near the right of the top or bottom side + return css` + left: ${INSET}px; + `; + case 'center': + return css` + left: calc(50% - ${ARROW_SIZE / 2}px); + `; + case 'right': + // Arrow is near the left of the top or bottom side + return css` + right: ${INSET}px; + `; + + default: + return ''; + } +}; + +export const getArrowSpacing = ({ placement }) => css` + ${getSideStyles({ placement })}; + ${getEdgeStyles({ placement })}; +`; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/utils/getBodySpacing.js b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getBodySpacing.js new file mode 100644 index 00000000..5e35049c --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getBodySpacing.js @@ -0,0 +1,98 @@ +'use es6'; + +import { getSide, getEdge } from './getPlacement'; +import { css } from 'styled-components'; + +const ARROW_SIZE = 16; + +const getEdgeStyles = ({ placement }) => { + switch (getEdge(placement)) { + case 'top': + return css` + top: 0; + `; + case 'bottom': + return css` + bottom: 0; + `; + case 'left': + return css` + left: 0; + `; + case 'right': + return css` + right: 0; + `; + + default: + return ''; + } +}; + +const getSideStyles = ({ placement }) => { + switch (getSide(placement)) { + case 'top': + return css` + transform: translateY(-100%); + top: -${ARROW_SIZE - 5}px; + `; + case 'right': + return css` + transform: translateX(100%); + right: -${ARROW_SIZE - 5}px; + `; + case 'bottom': + return css` + transform: translateY(100%); + bottom: -${ARROW_SIZE - 5}px; + `; + case 'left': + return css` + transform: translateX(-100%); + left: -${ARROW_SIZE - 5}px; + `; + default: + return ''; + } +}; + +const getMiddleStyles = ({ placement }) => { + switch (placement) { + case 'top center': + case 'top middle': + return css` + transform: translate(-50%, -100%); + left: 50%; + `; + + case 'bottom middle': + case 'bottom center': + return css` + transform: translate(-50%, 100%); + left: 50%; + `; + + case 'left center': + case 'left middle': + return css` + transform: translate(-100%, -50%); + top: 50%; + `; + + case 'right center': + case 'right middle': + return css` + transform: translate(100%, -50%); + top: 50%; + `; + + default: + return ''; + } +}; + +export const getBodySpacing = ({ placement }) => css` + ${getSideStyles({ placement })}; + ${getEdgeStyles({ placement })}; + ${getMiddleStyles({ placement })} +`; diff --git a/demo-v1/src/visitor-ui-component-library/tooltip/utils/getPlacement.js b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getPlacement.js new file mode 100644 index 00000000..d24afbc4 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/tooltip/utils/getPlacement.js @@ -0,0 +1,20 @@ +'use es6'; + +import { PLACEMENTS_HORIZ } from '../constants/PlacementConstants'; + +export function getSide(placement) { + return placement.split(' ')[0]; +} + +export function isHoriz(direction) { + return PLACEMENTS_HORIZ.includes(direction); +} + +export function getEdge(placement) { + const specifiedEdge = placement.split(' ')[1]; + if (specifiedEdge) { + return specifiedEdge; + } + + return isHoriz(getSide(placement)) ? 'middle' : 'center'; +} diff --git a/demo-v1/src/visitor-ui-component-library/typography/VizExSmall.js b/demo-v1/src/visitor-ui-component-library/typography/VizExSmall.js new file mode 100644 index 00000000..dc378d1a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/typography/VizExSmall.js @@ -0,0 +1,33 @@ +"use es6"; + +import styled, { css } from "styled-components"; +import { + getErrorTextColor, + getHelpTextColor, +} from "../theme/defaultThemeOperators"; +import { ERROR, HELP, DEFAULT } from "./constants/SmallVariations"; +import { getSmallStyles } from "./utils/getSmallStyles"; + +const getVariationStyles = ({ use, theme }) => { + switch (use) { + case ERROR: + return css` + color: ${getErrorTextColor(theme)}; + `; + case HELP: + return css` + color: ${getHelpTextColor(theme)}; + `; + case DEFAULT: + default: + return null; + } +}; + +const VizExSmall = styled.small` + display: block; + ${getSmallStyles}; + ${getVariationStyles}; +`; + +export default VizExSmall; diff --git a/demo-v1/src/visitor-ui-component-library/typography/constants/SmallVariations.ts b/demo-v1/src/visitor-ui-component-library/typography/constants/SmallVariations.ts new file mode 100644 index 00000000..c0381b9f --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/typography/constants/SmallVariations.ts @@ -0,0 +1,3 @@ +export const HELP = "help"; +export const DEFAULT = "default"; +export const ERROR = "error"; diff --git a/demo-v1/src/visitor-ui-component-library/typography/utils/getBodyTypographyStyles.js b/demo-v1/src/visitor-ui-component-library/typography/utils/getBodyTypographyStyles.js new file mode 100644 index 00000000..f993d86d --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/typography/utils/getBodyTypographyStyles.js @@ -0,0 +1,12 @@ +"use es6"; + +import { css } from "styled-components"; +import { getTextColor } from "../../theme/defaultThemeOperators"; + +export const getBodyTypographyStyles = ({ theme }) => css` + font-family: Helvetica, Arial, sans-serif; + font-weight: 400; + font-size: 14px; + color: ${getTextColor(theme)}; + line-height: 24px; +`; diff --git a/demo-v1/src/visitor-ui-component-library/typography/utils/getHeadingStyles.js b/demo-v1/src/visitor-ui-component-library/typography/utils/getHeadingStyles.js new file mode 100644 index 00000000..8e37fbef --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/typography/utils/getHeadingStyles.js @@ -0,0 +1,72 @@ +"use es6"; + +import { css } from "styled-components"; + +const getH1Styles = css` + font-weight: 700; + font-size: 32px; + line-height: 44px; + margin-top: 0; + margin-bottom: 16px; +`; + +const getH2Styles = css` + font-weight: 400; + font-size: 24px; + line-height: 30px; + margin-top: 0; + margin-bottom: 16px; +`; + +const getH3Styles = css` + font-weight: 700; + font-size: 22px; + line-height: 30px; + margin-top: 0; + margin-bottom: 16px; +`; + +const getH4Styles = css` + font-weight: 700; + font-size: 18px; + line-height: 26px; + margin-top: 0; + margin-bottom: 16px; +`; + +const getH5Styles = css` + font-weight: 400; + font-size: 16px; + line-height: 26px; + margin-top: 0; + margin-bottom: 16px; +`; + +const getH6Styles = css` + font-weight: 400; + font-size: 14px; + line-height: 24px; + margin-top: 0; + margin-bottom: 16px; +`; + +export const getGlobalHeadingStyles = css` + h1 { + ${getH1Styles}; + } + h2 { + ${getH2Styles}; + } + h3 { + ${getH3Styles}; + } + h4 { + ${getH4Styles}; + } + h5 { + ${getH5Styles}; + } + h6 { + ${getH6Styles}; + } +`; diff --git a/demo-v1/src/visitor-ui-component-library/typography/utils/getSmallStyles.js b/demo-v1/src/visitor-ui-component-library/typography/utils/getSmallStyles.js new file mode 100644 index 00000000..2d55e5bf --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/typography/utils/getSmallStyles.js @@ -0,0 +1,14 @@ +"use es6"; + +import { css } from "styled-components"; + +export const getSmallStyles = css` + font-size: 12px; + line-height: 18px; +`; + +export const getGlobalSmallStyles = css` + small { + ${getSmallStyles} + } +`; diff --git a/demo-v1/src/visitor-ui-component-library/utils/SyntheticEvent.ts b/demo-v1/src/visitor-ui-component-library/utils/SyntheticEvent.ts new file mode 100644 index 00000000..7b5e46ae --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/SyntheticEvent.ts @@ -0,0 +1,37 @@ +import { ChangeEvent } from 'react'; + +type Value = { text: string; value: string }; + +class SyntheticEventClass { + target: { value: Value }; + currentTarget: { value: Value }; + source: ChangeEvent; + constructor(value: Value, evt: ChangeEvent) { + const target = { + value, + }; + this.target = target; + this.currentTarget = target; + this.source = evt; + } + + preventDefault() { + if (this.source) { + this.source.preventDefault(); + } + } + + stopPropagation() { + if (this.source) { + this.source.stopPropagation(); + } + } +} + +function SyntheticEvent(value: Value, evt: ChangeEvent) { + return new SyntheticEventClass(value, evt); +} + +SyntheticEvent.constructor = SyntheticEventClass; + +export default SyntheticEvent; diff --git a/demo-v1/src/visitor-ui-component-library/utils/adjustLuminance.ts b/demo-v1/src/visitor-ui-component-library/utils/adjustLuminance.ts new file mode 100644 index 00000000..7fc4f2ef --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/adjustLuminance.ts @@ -0,0 +1,25 @@ +/* hs-eslint ignored failing-rules */ +/* eslint-disable no-bitwise */ + +import { hexToRGB } from './hexToRGB'; + +export const adjustLuminance = ( + colorHex: string, + luminanceShiftPercentage: number +) => { + const { r, g, b } = hexToRGB(colorHex); + + const newRedColor = + 0 | ((1 << 8) + r + ((256 - r) * luminanceShiftPercentage) / 100); + const redHex = `0${newRedColor.toString(16).substr(1)}`.substr(-2); + + const newGreenColor = + 0 | ((1 << 8) + g + ((256 - g) * luminanceShiftPercentage) / 100); + const greenHex = `0${newGreenColor.toString(16).substr(1)}`.substr(-2); + + const newBlueColor = + 0 | ((1 << 8) + b + ((256 - b) * luminanceShiftPercentage) / 100); + const blueHex = `0${newBlueColor.toString(16).substr(1)}`.substr(-2); + + return `#${redHex}${greenHex}${blueHex}`; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveAnnouncer.ts b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveAnnouncer.ts new file mode 100644 index 00000000..caa8f271 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveAnnouncer.ts @@ -0,0 +1,137 @@ +// Taken from react-aria: https://github.com/adobe/react-spectrum/tree/main/packages/%40react-aria/live-announcer +// TODO: ask for availability from our prerelease react-aria version + +type Assertiveness = 'assertive' | 'polite'; + +/* Inspired by https://github.com/AlmeroSteyn/react-aria-live */ +const LIVEREGION_TIMEOUT_DELAY = 7000; + +// LiveAnnouncer is implemented using vanilla DOM, not React. That's because as of React 18 +// ReactDOM.render is deprecated, and the replacement, ReactDOM.createRoot is moved into a +// subpath import `react-dom/client`. That makes it hard for us to support multiple React versions. +// As a global API, we can't use portals without introducing a breaking API change. LiveAnnouncer +// is simple enough to implement without React, so that's what we do here. +// See this discussion for more details: https://github.com/reactwg/react-18/discussions/125#discussioncomment-2382638 +class LiveAnnouncer { + node: HTMLElement | null; + assertiveLog: HTMLElement; + politeLog: HTMLElement; + + constructor() { + this.node = document.createElement('div'); + this.node.dataset.liveAnnouncer = 'true'; + // copied from VisuallyHidden + Object.assign(this.node.style, { + border: 0, + clip: 'rect(0 0 0 0)', + clipPath: 'inset(50%)', + height: 1, + margin: '0 -1px -1px 0', + overflow: 'hidden', + padding: 0, + position: 'absolute', + width: 1, + whiteSpace: 'nowrap', + }); + + this.assertiveLog = this.createLog('assertive'); + this.node.appendChild(this.assertiveLog); + + this.politeLog = this.createLog('polite'); + this.node.appendChild(this.politeLog); + + document.body.prepend(this.node); + } + + createLog(ariaLive: string) { + const node = document.createElement('div'); + node.setAttribute('role', 'log'); + node.setAttribute('aria-live', ariaLive); + node.setAttribute('aria-relevant', 'additions'); + return node; + } + + destroy() { + if (!this.node) { + return; + } + + document.body.removeChild(this.node); + this.node = null; + } + + announce( + message: string, + assertiveness = 'assertive', + timeout = LIVEREGION_TIMEOUT_DELAY + ) { + if (!this.node) { + return; + } + + const node = document.createElement('div'); + node.textContent = message; + + if (assertiveness === 'assertive') { + this.assertiveLog.appendChild(node); + } else { + this.politeLog.appendChild(node); + } + + if (message !== '') { + setTimeout(() => { + node.remove(); + }, timeout); + } + } + + clear(assertiveness: Assertiveness) { + if (!this.node) { + return; + } + + if (!assertiveness || assertiveness === 'assertive') { + this.assertiveLog.innerHTML = ''; + } + + if (!assertiveness || assertiveness === 'polite') { + this.politeLog.innerHTML = ''; + } + } +} + +let liveAnnouncer: LiveAnnouncer | null = null; + +/** + * Announces the message using screen reader technology. + */ +export function announce( + message: string, + assertiveness: Assertiveness = 'assertive', + timeout = LIVEREGION_TIMEOUT_DELAY +) { + if (!liveAnnouncer) { + liveAnnouncer = new LiveAnnouncer(); + } + + liveAnnouncer.announce(message, assertiveness, timeout); +} + +/** + * Stops all queued announcements. + */ +export function clearAnnouncer(assertiveness: Assertiveness) { + if (liveAnnouncer) { + liveAnnouncer.clear(assertiveness); + } +} + +/** + * Removes the announcer from the DOM. + */ +export function destroyAnnouncer() { + if (liveAnnouncer) { + liveAnnouncer.destroy(); + liveAnnouncer = null; + } +} diff --git a/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.stories.tsx b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.stories.tsx new file mode 100644 index 00000000..00e07fd7 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.stories.tsx @@ -0,0 +1,79 @@ +import { useEffect, useState } from 'react'; +import { + AriaLiveContextProvider, + AriaLiveContextProviderProps, + useAriaLiveContext, + Message, + Assertiveness, +} from './AriaLiveContext'; +// TODO: update when platform makes these available from '@storybook/react' +import { StoryFn, Meta } from '../../../storybook/types'; + +export default { + title: 'AriaLiveContextProvider', + component: AriaLiveContextProvider, +} as Meta; + +const TextToAnnounce = ({ + message = { id: '1', text: 'Some text' }, + assertiveness, +}: { + message?: Message; + assertiveness?: Assertiveness; +}) => { + const { announce } = useAriaLiveContext(); + + useEffect(() => announce(message, assertiveness), [ + announce, + assertiveness, + message, + ]); + + return

    {message.text}

    ; +}; + +export const UsageDemo: StoryFn = () => { + const { clearAnnouncedMessages } = useAriaLiveContext(); + const [shouldRenderText, setShouldRenderText] = useState(false); + + return ( + + +

    + { + '(Polite text will be announced twice due to VO polite text bug where text is repeated when in an iframe)' + } +

    + {shouldRenderText && ( + <> + + + + + + )} +
    + ); +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.tsx b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.tsx new file mode 100644 index 00000000..dadec2c2 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/aria-live/AriaLiveContext.tsx @@ -0,0 +1,113 @@ +import { createContext, useContext, useEffect } from 'react'; +import { announce, clearAnnouncer } from './AriaLiveAnnouncer'; + +export type Message = { id: string; text: string }; +export type Assertiveness = 'assertive' | 'polite'; + +const announcedMessages = new Map(); +const clearAnnouncedMessages = () => announcedMessages.clear(); + +const defaultValue = { + announce: ( + message: Message, + assertiveness: Assertiveness = 'assertive', + timeout?: number + ) => { + if (announcedMessages.has(message.id)) return; + announce(message.text, assertiveness, timeout); + announcedMessages.set(message.id, message.text); + }, + clearAnnouncer, + clearAnnouncedMessages, +}; + +export const AriaLiveContext = createContext(defaultValue); + +export type AriaLiveContextProviderProps = { + children: React.ReactNode; + clearOnUnmount?: boolean; +}; + +/** + * Provides a context in which unique messages are announced using aria-live only once and clears unique message store when unmounted or programmatically (using the consuming hook methods). + * + * **NOTE:** There's a bug in VoiceOver that makes aria-live "polite" message repeat once for each iframe they may be nested within on a parent document. So we default to "assertive", which doesn't have this issue, but "polite" should be favored in general if not used in an iframe. + * + * Usage Demo + * + * ```tsx + * const DemoUsageWithinATextComp = ({ + message = { id: '1', text: 'Some text' }, + assertiveness, + }: { + message: { id: string, text: string }; + assertiveness?: 'polite' | 'assertive'; + }) => { + const { announce } = useAriaLiveContext(); + + useEffect(() => announce(message, assertiveness), []); + + return

    {message.text}

    ; + }; + + const UsageDemo = () => { + const { clearAnnouncedMessages } = useAriaLiveContext(); + const [shouldRenderText, setShouldRenderText] = useState(false); + + return ( + + + {shouldRenderText && ( + <> + + + + + + )} + + ); +}; +``` + */ +export const AriaLiveContextProvider = ({ + children, + clearOnUnmount = true, +}: AriaLiveContextProviderProps) => { + useEffect( + () => () => { + if (clearOnUnmount) { + clearAnnouncer('assertive'); + clearAnnouncer('polite'); + clearAnnouncedMessages(); + } + }, + [clearOnUnmount] + ); + + return ( + + {children} + + ); +}; +AriaLiveContextProvider.displayName = 'AriaLiveContextProvider'; + +export const useAriaLiveContext = () => useContext(AriaLiveContext); diff --git a/demo-v1/src/visitor-ui-component-library/utils/browserTest.js b/demo-v1/src/visitor-ui-component-library/utils/browserTest.js new file mode 100644 index 00000000..38ccced3 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/browserTest.js @@ -0,0 +1,7 @@ +'use es6'; + +const lowercasedUserAgent = window.navigator + ? navigator.userAgent.toLowerCase() + : ''; + +export const isIE11 = () => lowercasedUserAgent.includes('trident/'); diff --git a/demo-v1/src/visitor-ui-component-library/utils/callIfValid.ts b/demo-v1/src/visitor-ui-component-library/utils/callIfValid.ts new file mode 100644 index 00000000..76873a6a --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/callIfValid.ts @@ -0,0 +1,3 @@ +export const callIfValid = (func: Function, ...args: any[]) => { + if (typeof func === 'function') func(...args); +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/curryable.ts b/demo-v1/src/visitor-ui-component-library/utils/curryable.ts new file mode 100644 index 00000000..6cf6c2ad --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/curryable.ts @@ -0,0 +1,8 @@ +export const curryable = (func: Function) => { + const curry: Function = (...args: any[]) => { + return args.length >= func.length + ? func.apply(null, args) + : curry.bind(null, ...args); + }; + return curry; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/get.ts b/demo-v1/src/visitor-ui-component-library/utils/get.ts new file mode 100644 index 00000000..33917604 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/get.ts @@ -0,0 +1,6 @@ +import { curryable } from './curryable'; + +type dataObject = { + [key: string]: string; +}; +export const get = curryable((key: string, data: dataObject) => data[key]); diff --git a/demo-v1/src/visitor-ui-component-library/utils/getContrastRatio.ts b/demo-v1/src/visitor-ui-component-library/utils/getContrastRatio.ts new file mode 100644 index 00000000..7e8671bc --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/getContrastRatio.ts @@ -0,0 +1,33 @@ +//Derived from https://www.w3.org/TR/WCAG20-TECHS/G17.html +import { hexToRGB } from './hexToRGB'; +export const getBrightness = (hexColor: string): number => { + const map = new Map(Object.entries(hexToRGB(hexColor))); + map.forEach((value, key) => { + RGBToLinear(value, key, map); + }); + return +( + 0.2126 * (map.get('r') || 0) + + 0.7152 * (map.get('g') || 0) + + 0.0722 * (map.get('b') || 0) + ).toFixed(2); +}; + +function RGBToLinear(val: number, key: string, map: Map) { + const normalizedVal = val / 255; + if (normalizedVal <= 0.03928) { + map.set(key, normalizedVal / 12.92); + } else { + map.set(key, Math.pow((normalizedVal + 0.055) / 1.055, 2.4)); + } +} + +export const getContrastRatio = ( + textColor: string, + backgroundColor: string +): number => { + const luminanceA = getBrightness(textColor); + const luminanceB = getBrightness(backgroundColor); + const darker = luminanceA > luminanceB ? luminanceA : luminanceB; + const lighter = luminanceA === darker ? luminanceB : luminanceA; + return (darker + 0.05) / (lighter + 0.05); +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/getTextColorFromBgColor.ts b/demo-v1/src/visitor-ui-component-library/utils/getTextColorFromBgColor.ts new file mode 100644 index 00000000..709eb61d --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/getTextColorFromBgColor.ts @@ -0,0 +1,28 @@ +import { DefaultTheme } from 'styled-components'; +import { getContrastRatio } from './getContrastRatio'; + +//This ratio should be set to 4.5 once the theme is finalized +const MINIMUM_CONTRAST_RATIO = 3; + +// Select accessible text from available text color options +export const getTextColorFromBgColor = ( + backgroundColor: string, + theme: DefaultTheme +): string => { + const accessibleText = + getContrastRatio(backgroundColor, theme.primary) >= MINIMUM_CONTRAST_RATIO + ? theme.primary + : theme.textOnPrimary; + const currentContrastRatio = getContrastRatio( + backgroundColor, + accessibleText + ); + if (currentContrastRatio < MINIMUM_CONTRAST_RATIO) { + // eslint-disable-next-line no-console + console.error( + `The current contrast ratio of ${currentContrastRatio}:1 does not meet the minimum contrast standards specified by the WCAG 2.0 (https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast).` + ); + } + + return accessibleText; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/hexToRGB.ts b/demo-v1/src/visitor-ui-component-library/utils/hexToRGB.ts new file mode 100644 index 00000000..4de82a21 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/hexToRGB.ts @@ -0,0 +1,16 @@ +export const hexToRGB = (hexColorValue: string) => { + let colorValue = hexColorValue.slice(1); + + if (colorValue.length === 3) { + colorValue = colorValue.replace(/(.)/g, '$1$1'); + } + + const r = parseInt(colorValue.substr(0, 2), 16); + const g = parseInt(colorValue.substr(2, 2), 16); + const b = parseInt(colorValue.substr(4, 2), 16); + return { + r, + g, + b, + }; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/hexToRgba.ts b/demo-v1/src/visitor-ui-component-library/utils/hexToRgba.ts new file mode 100644 index 00000000..82226337 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/hexToRgba.ts @@ -0,0 +1,5 @@ +import { hexToRGB } from './hexToRGB'; +export const hexToRgba = (hexColor: string, opacity = 1) => { + const { r, g, b } = hexToRGB(hexColor); + return `rgba(${r}, ${g}, ${b}, ${opacity})`; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/isUnsafeUrl.ts b/demo-v1/src/visitor-ui-component-library/utils/isUnsafeUrl.ts new file mode 100644 index 00000000..0b18b800 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/isUnsafeUrl.ts @@ -0,0 +1,25 @@ +// eslint-disable-next-line no-script-url +const NOOP_HREF = 'javascript:void(0)'; + +// Match the protocol part of an absolute URL, e.g. "http:" +const PROTOCOL_REGEX = /^([^:]+):/; + +// Whitespace and control characters are ignored, so we must strip them out +// eslint-disable-next-line no-control-regex +const IGNORED_PROTOCOL_CHARS_REGEX = /[\s\x00-\x1f]/g; + +export const isUnsafeUrl = (href: string) => { + if (href && typeof href === 'string') { + const protocolMatch = href.match(PROTOCOL_REGEX); + if (!protocolMatch || href === NOOP_HREF) return false; + if ( + protocolMatch[0] + .replace(IGNORED_PROTOCOL_CHARS_REGEX, '') + // eslint-disable-next-line no-script-url + .toLowerCase() === 'javascript:' + ) { + return true; + } + } + return false; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/mergeDeep.ts b/demo-v1/src/visitor-ui-component-library/utils/mergeDeep.ts new file mode 100644 index 00000000..bc37b432 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/mergeDeep.ts @@ -0,0 +1,33 @@ +/** + * Performs a deep merge of two objects and returns new object. Does not modify + * objects (immutable) and merges arrays via concatenation. + * @param targetObj The object to act as the target to be merged onto. + * @param sourceObj The object to source properties that override the target's. + * @returns A single merged object. + */ +export function mergeDeep< + Target = Record, + Source = Record +>(targetObj: Target, sourceObj: Source) { + const isObject = (obj: any) => obj && typeof obj === 'object'; + + return ([targetObj, sourceObj] as Record[]).reduce( + (target, source) => { + Object.keys(source).forEach(key => { + const targetVal = target[key]; + const sourceVal = source[key]; + + if (Array.isArray(targetVal) && Array.isArray(sourceVal)) { + target[key] = targetVal.concat(...sourceVal); + } else if (isObject(targetVal) && isObject(sourceVal)) { + target[key] = mergeDeep(targetVal, sourceVal); + } else { + target[key] = sourceVal; + } + }); + + return target; + }, + {} + ) as Target & Source; +} diff --git a/demo-v1/src/visitor-ui-component-library/utils/mixins.ts b/demo-v1/src/visitor-ui-component-library/utils/mixins.ts new file mode 100644 index 00000000..dae71e2d --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/mixins.ts @@ -0,0 +1,6 @@ +import { css } from 'styled-components'; + +export const focusRing = css` + outline-offset: 1px; + outline: 2px solid #00a4bd; +`; diff --git a/demo-v1/src/visitor-ui-component-library/utils/pipe.ts b/demo-v1/src/visitor-ui-component-library/utils/pipe.ts new file mode 100644 index 00000000..a95efe44 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/pipe.ts @@ -0,0 +1,3 @@ +export function pipe(...functions: Array<(arg: T) => T>) { + return (data: T) => functions.reduce((acc, func) => func(acc), data); +} diff --git a/demo-v1/src/visitor-ui-component-library/utils/stripHTML.js b/demo-v1/src/visitor-ui-component-library/utils/stripHTML.js new file mode 100644 index 00000000..bcdb0151 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/stripHTML.js @@ -0,0 +1,6 @@ +'use es6'; + +export const stripHTML = html => { + const doc = new DOMParser().parseFromString(html, 'text/html'); + return doc.body.textContent || ''; +}; diff --git a/demo-v1/src/visitor-ui-component-library/utils/themePropType.ts b/demo-v1/src/visitor-ui-component-library/utils/themePropType.ts new file mode 100644 index 00000000..50f11cfe --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/themePropType.ts @@ -0,0 +1,5 @@ +import PropTypes from 'prop-types'; + +const themePropType = PropTypes.object; + +export default themePropType; diff --git a/demo-v1/src/visitor-ui-component-library/utils/types.ts b/demo-v1/src/visitor-ui-component-library/utils/types.ts new file mode 100644 index 00000000..bfd50ba0 --- /dev/null +++ b/demo-v1/src/visitor-ui-component-library/utils/types.ts @@ -0,0 +1,19 @@ +import PropTypes from 'prop-types'; + +export type InteractionProps = { + disabled?: boolean; + focused?: boolean; + hovered?: boolean; + pressed?: boolean; +}; + +export const interactionPropTypes = { + disabled: PropTypes.bool, + focused: PropTypes.bool, + hovered: PropTypes.bool, + pressed: PropTypes.bool, +}; + +export type PolymorphicRef< + C extends React.ElementType +> = React.ComponentPropsWithRef['ref']; diff --git a/demo-v1/tsconfig.json b/demo-v1/tsconfig.json new file mode 100644 index 00000000..ce92b138 --- /dev/null +++ b/demo-v1/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "noEmit": true, + "jsx": "react-jsx", + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "target": "esnext", + "isolatedModules": true, + "noErrorTruncation": true + } +} diff --git a/demo-v1/webpack.config.js b/demo-v1/webpack.config.js new file mode 100644 index 00000000..a78c5891 --- /dev/null +++ b/demo-v1/webpack.config.js @@ -0,0 +1,35 @@ +const path = require("path"); + +module.exports = { + entry: "./src/index.tsx", + mode: "development", + resolve: { + extensions: [".tsx", ".ts", ".js"], + }, + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + }, + module: { + rules: [ + { + test: /\.(ts|tsx|js)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env"], + }, + }, + }, + ], + }, + devServer: { + https: true, + port: 9025, + static: { + directory: path.join(__dirname, "dist"), + }, + open: false, + }, +}; diff --git a/demo-v1/yarn.lock b/demo-v1/yarn.lock new file mode 100644 index 00000000..951b1bd8 --- /dev/null +++ b/demo-v1/yarn.lock @@ -0,0 +1,4616 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.20.12", "@babel/core@^7.4.0-0": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + 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.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz" + integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz" + integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz" + integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.12" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime@^7.8.4": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@emotion/is-prop-valid@^1.1.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@formatjs/ecma402-abstract@1.14.3": + version "1.14.3" + resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz" + integrity sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg== + dependencies: + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + +"@formatjs/fast-memoize@1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.8.tgz" + integrity sha512-PemNUObyoIZcqdQ1ixTPugzAzhEj7j6AHIyrq/qR6x5BFTvOQeXHYsVZUqBEFduAIscUaDfou+U+xTqOiunJ3Q== + dependencies: + tslib "^2.4.0" + +"@formatjs/icu-messageformat-parser@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.2.0.tgz" + integrity sha512-NT/jKI9nvqNIsosTm+Cxv3BHutB1RIDFa4rAa2b664Od4sBnXtK7afXvAqNa3XDFxljKTij9Cp+kRMJbXozUww== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/icu-skeleton-parser" "1.3.18" + tslib "^2.4.0" + +"@formatjs/icu-skeleton-parser@1.3.18": + version "1.3.18" + resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz" + integrity sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.2.32": + version "0.2.32" + resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz" + integrity sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ== + dependencies: + tslib "^2.4.0" + +"@hubspot/calling-extensions-sdk@^0.0.10": + version "0.0.10" + resolved "https://registry.npmjs.org/@hubspot/calling-extensions-sdk/-/calling-extensions-sdk-0.0.10.tgz" + integrity sha512-uHpkgz/Yb9t2sCZuo6uSPELF3dOL4y2IFLGtj9F1Kh0ZG2aDK7545sOa+ft+N7BbMeyukoPj3ymlhdSlb6ecSg== + +"@internationalized/date@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.0.2.tgz" + integrity sha512-9V1IxesP6ASZj/hYyOXOC4yPJvidbbStyWQKLCQSqhhKACMOXoo+BddXZJy47ju9mqOMpWdrJ2rTx4yTxK9oag== + dependencies: + "@swc/helpers" "^0.4.14" + +"@internationalized/message@^3.0.10": + version "3.0.10" + resolved "https://registry.npmjs.org/@internationalized/message/-/message-3.0.10.tgz" + integrity sha512-vfLqEop/NH68IgqMcXJNSDqZ5Leg3EEgCxhuuSefU7vvdbptD3pwpUWXaK9igYPa+aZfUU0eqv86yqm76obtsw== + dependencies: + "@swc/helpers" "^0.4.14" + intl-messageformat "^10.1.0" + +"@internationalized/number@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.1.2.tgz" + integrity sha512-Mbys8SGsn0ApXz3hJLNU+d95B8luoUbwnmCpBwl7d63UmYAlcT6TRDyvaS/vwdbElXLcsQJjQCu0gox2cv/Tig== + dependencies: + "@swc/helpers" "^0.4.14" + +"@internationalized/string@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.0.1.tgz" + integrity sha512-2+rHfXZ56YgsC6i3fKvBue/xatnSm0Jv+C/x4+n3wg5xAcLh4LPW3GvZ/9ifxNAz9+IWplgZHa1FRIbSuUvNWg== + dependencies: + "@swc/helpers" "^0.4.14" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@react-aria/breadcrumbs@^3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.4.1.tgz" + integrity sha512-3dotDXcXX5IbES9tS9gK5m/2inlZH1ZESi61aBUoD/kQbUcf4CJ3TniVqzBKjNqQN8yIBH/LjwkAoGmuvtPVRQ== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/link" "^3.3.6" + "@react-aria/utils" "^3.14.2" + "@react-types/breadcrumbs" "^3.4.6" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/button@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.6.4.tgz" + integrity sha512-OEs5fNGiuZzyC5y0cNl96+6pRf/3ZhI1i2m6LlRYhJLsWXPhHt21UHEnlSchE/XGtgKojJEeTsXottoBFTBi5w== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/toggle" "^3.4.4" + "@react-types/button" "^3.7.0" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/calendar@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.0.5.tgz" + integrity sha512-RIOwGYIwMizN/MAF5RkTb2ic9OJ0rJyR2VqqgtV3c7ADHNejzyLYMQmaalEFDUHS+AbvaXM1LCXdFBhSB8nf5w== + dependencies: + "@internationalized/date" "^3.0.2" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/utils" "^3.14.2" + "@react-stately/calendar" "^3.0.5" + "@react-types/button" "^3.7.0" + "@react-types/calendar" "^3.0.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/checkbox@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.7.1.tgz" + integrity sha512-3KRg/KrTRwQdw5Yg7gpbIKWWVt57PbGSEXAS/diQvRf9pTXbOuChTES8uVlcwF8q+3mKXc4ppzE3gsNQ5jOMqg== + dependencies: + "@react-aria/label" "^3.4.4" + "@react-aria/toggle" "^3.4.2" + "@react-aria/utils" "^3.14.2" + "@react-stately/checkbox" "^3.3.2" + "@react-stately/toggle" "^3.4.4" + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/combobox@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.4.4.tgz" + integrity sha512-aviSDt4JkYZC1Ww83gvrNB4cHetXu73n5NuEfMNBC3B6fiL0MP5Av5+lMgf8FzpQks39QkZNxBtQ/h4I3D7SBA== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/listbox" "^3.7.2" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/menu" "^3.7.1" + "@react-aria/overlays" "^3.12.1" + "@react-aria/selection" "^3.12.1" + "@react-aria/textfield" "^3.8.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/collections" "^3.5.1" + "@react-stately/combobox" "^3.3.1" + "@react-stately/layout" "^3.10.0" + "@react-types/button" "^3.7.0" + "@react-types/combobox" "^3.5.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/datepicker@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.2.1.tgz" + integrity sha512-NnW9VgX/YjxkgjcIaxmOhzpfiQmTQpCXjpPJ1+3nPhKzPKpcjtPxIYTDMkm/R+6i5FRukEGtjhg3QY9amLK6hQ== + dependencies: + "@internationalized/date" "^3.0.2" + "@internationalized/number" "^3.1.2" + "@internationalized/string" "^3.0.1" + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/spinbutton" "^3.2.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/datepicker" "^3.2.1" + "@react-types/button" "^3.7.0" + "@react-types/calendar" "^3.0.5" + "@react-types/datepicker" "^3.1.4" + "@react-types/dialog" "^3.4.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/dialog@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.4.2.tgz" + integrity sha512-Z6YZYXtwwmC5ZHjJldF3zuTjHnli7fXe/sM1ts3bw6jvU2L0kzhV/DRbPXYg8h695Oj9t+OIi4qxjEyKVH7SEA== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/overlays" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/overlays" "^3.4.4" + "@react-types/dialog" "^3.4.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/dnd@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.0.1.tgz" + integrity sha512-z/T59Jc+6mj3OMcLjfA6MYd0zD6K3DYw+kB2CZ0EPte7BRN8wtU4+q/bx1iX+If97X6bTcHjMGX6nrQJ5vX/fw== + dependencies: + "@internationalized/string" "^3.0.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/overlays" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-aria/visually-hidden" "^3.6.1" + "@react-stately/dnd" "^3.0.1" + "@react-types/button" "^3.7.0" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/focus@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.10.1.tgz" + integrity sha512-HjgFUC1CznuYC7CxtBIFML6bOBxW3M3cSNtvmXU9QWlrPSwwOLkXCnfY6+UkjCc5huP4v7co4PoRDX8Vbe/cVQ== + dependencies: + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + clsx "^1.1.1" + +"@react-aria/grid@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.5.2.tgz" + integrity sha512-+cDtTvTT0YF4jgy1pv0omcweub6z1N+GdkpHC6L6/jtH2gFRVns3IC6pf5ihLDIpLloylthaMMR8C3lus7035g== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/grid" "^3.4.2" + "@react-stately/selection" "^3.11.2" + "@react-stately/virtualizer" "^3.4.1" + "@react-types/checkbox" "^3.4.1" + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/gridlist@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.1.2.tgz" + integrity sha512-3HI/e8HzyBRWdEbDH+3Hvj9U5fD/1TYaqA0f4XnBdSEDd7LHPOzZyNzbZMdlMmaq2W0Dmm1YRCMELacFVUehUA== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/grid" "^3.5.2" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/list" "^3.6.1" + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/i18n@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.6.3.tgz" + integrity sha512-cDWl8FXJIXsw/raWcThywBueCJ5ncoogq81wYVS6hfZVmSyncONIB3bwUL12cojmjX1VEP31sN0ujT/83QP95Q== + dependencies: + "@internationalized/date" "^3.0.2" + "@internationalized/message" "^3.0.10" + "@internationalized/number" "^3.1.2" + "@internationalized/string" "^3.0.1" + "@react-aria/ssr" "^3.4.1" + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/interactions@^3.13.1": + version "3.13.1" + resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.13.1.tgz" + integrity sha512-WCvfZOi1hhussVTHxVq76OR48ry13Zvp9U5hmuQufyxIUlf4hOvDk4/cbK4o4JiCs8X7C7SRzcwFM34M4NHzmg== + dependencies: + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/label@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.4.4.tgz" + integrity sha512-1fuYf2UctNhBy31uYN7OhdcrwzlB5GS0+C49gDkwWzccB7yr+CoOJ5UQUoVB7WBmzrc+CuzwWxSDd4OupSYIZQ== + dependencies: + "@react-aria/utils" "^3.14.2" + "@react-types/label" "^3.7.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/link@^3.3.6": + version "3.3.6" + resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.3.6.tgz" + integrity sha512-UjbdBJ8EB+jCC3mPZD6cYykHqZKTy6/VvI5RGJoKtF8cg9639tRy6g102pd4ncFTdD4DfU5PPWtthC24nQRCyQ== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-types/link" "^3.3.6" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/listbox@^3.7.2": + version "3.7.2" + resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.7.2.tgz" + integrity sha512-e3O/u2T3TccinmfS/UvHywxLbASmh28U4020WTpZnIrsaoriVCkGZvG1AYNNPDIESz2WO0oRF6vDrmGunglJ2A== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/collections" "^3.5.1" + "@react-stately/list" "^3.6.1" + "@react-types/listbox" "^3.3.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/live-announcer@^3.1.2": + version "3.1.2" + resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.1.2.tgz" + integrity sha512-BqtVLPWU10sZssoOJF1lJiRvZe5zqZ5BM39PsFyO7dWhVkR/9O9bZviqvKXnC1oXCnypfa+85gUshbK9unFcWA== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-aria/menu@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.7.1.tgz" + integrity sha512-5KIUTs3xYSmERB8qzofFghznMVLcG3RWDnJcQjpRtrrYjm6Oc39TJeodDH874fiEr6o3i5WwMrEYVp7NSxz/TQ== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/overlays" "^3.12.1" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/collections" "^3.5.1" + "@react-stately/menu" "^3.4.4" + "@react-stately/tree" "^3.4.1" + "@react-types/button" "^3.7.0" + "@react-types/menu" "^3.7.3" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/meter@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-aria/meter/-/meter-3.3.4.tgz" + integrity sha512-RdVd5vlb6//HI8G1hhH4G+E0Y387GYFKjmewSUKK0Lzp9PFLili26s+xLvgigUX9ald7HiPmfPdAlXzotvo54Q== + dependencies: + "@react-aria/progress" "^3.3.4" + "@react-types/meter" "^3.2.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/numberfield@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.3.4.tgz" + integrity sha512-yoYeYaEW5v84Ff0x+oSN0h3uzqrSOBEgjtv8ZMaFVsZfm9yMjsVLu+QWGBYCEOPcASMkNZpNR3o91nBPK3XTDw== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/spinbutton" "^3.2.1" + "@react-aria/textfield" "^3.8.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/numberfield" "^3.3.1" + "@react-types/button" "^3.7.0" + "@react-types/numberfield" "^3.3.5" + "@react-types/shared" "^3.16.0" + "@react-types/textfield" "^3.6.2" + "@swc/helpers" "^0.4.14" + +"@react-aria/overlays@^3.12.1": + version "3.12.1" + resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.12.1.tgz" + integrity sha512-OSgSopk2uQI5unvC3+fUyngbRFFe4GnF0iopCmrsI7qSQEusJUd4M2SuPVXUBBwWFt5TsiH7TnxmIPWeh5LSoA== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/ssr" "^3.4.1" + "@react-aria/utils" "^3.14.2" + "@react-aria/visually-hidden" "^3.6.1" + "@react-stately/overlays" "^3.4.4" + "@react-types/button" "^3.7.0" + "@react-types/overlays" "^3.6.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/progress@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.3.4.tgz" + integrity sha512-MVlWdH7L2e0u1SvkVk+C6/onS8opex9rIKUKHM08s++y80Xe3BIAh8jd5tgdlutDtcZ1kKgfb4bet9dvjymo4A== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/label" "^3.4.4" + "@react-aria/utils" "^3.14.2" + "@react-types/progress" "^3.2.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/radio@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.4.2.tgz" + integrity sha512-PpEsQjwkYOkSfKfnqXpBzf0FM/V2GSC0g/NG2ZAI5atDIACeic+kHCcs8fm2QzXtUDaRltNurvYdDJ+XzZ8g1g== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/utils" "^3.14.2" + "@react-stately/radio" "^3.6.2" + "@react-types/radio" "^3.3.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/searchfield@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.4.4.tgz" + integrity sha512-Z3nZI2FXrWLPNUeJ3QV2ruTKBR9eHhPoHi+Iiuq4n+e02ib5s0Jlbam29FFiOxmf6vUMhScNcEYP9p2BNANmQA== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/textfield" "^3.8.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/searchfield" "^3.3.4" + "@react-types/button" "^3.7.0" + "@react-types/searchfield" "^3.3.6" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/select@^3.8.4": + version "3.8.4" + resolved "https://registry.npmjs.org/@react-aria/select/-/select-3.8.4.tgz" + integrity sha512-d2JOe11lUoGLvsE32bZRMq32SzXuyLNczyTOLrWM0e9fsOr49A8p6L6bFm3symU/KpwjjnO+pf5IkvgEq+GoJg== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/listbox" "^3.7.2" + "@react-aria/menu" "^3.7.1" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-aria/visually-hidden" "^3.6.1" + "@react-stately/select" "^3.3.4" + "@react-types/button" "^3.7.0" + "@react-types/select" "^3.6.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/selection@^3.12.1": + version "3.12.1" + resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.12.1.tgz" + integrity sha512-UX1vSY+iUdHe0itFZIOizX1BCI8SAeFnEh5VIQ1bYRt93+kAxeC914fsxFPPgrodJyqWRCX1dblPyRUIWAzQiw== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/collections" "^3.5.1" + "@react-stately/selection" "^3.11.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/separator@^3.2.6": + version "3.2.6" + resolved "https://registry.npmjs.org/@react-aria/separator/-/separator-3.2.6.tgz" + integrity sha512-QhYqoLfu+4T3ASCs5Q8ZWfBbRKBUmqquVdREWvHyvVyOBk9kRN9nxsoIxlkss1RJlJJx59AYF9T9CwgL80/bvw== + dependencies: + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/slider@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.2.4.tgz" + integrity sha512-+BDPFaCgm0gtGewO33ZDNZz1b3Fc1p5Y/HSuwCcru+jHetODJXy23IIVpWsDri1vG3fHECRnWcDZAjLZgkVnAw== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/utils" "^3.14.2" + "@react-stately/radio" "^3.6.2" + "@react-stately/slider" "^3.2.4" + "@react-types/radio" "^3.3.1" + "@react-types/shared" "^3.16.0" + "@react-types/slider" "^3.3.1" + "@swc/helpers" "^0.4.14" + +"@react-aria/spinbutton@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.2.1.tgz" + integrity sha512-y9QZ0VzWL7qzbWSPOCsAdvZhVlQrnHLRGc8bkRa2jmWrnCqS0iua/TRuLGgazIf2Rb7GmdbKBJJuPSScytVDUw== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/utils" "^3.14.2" + "@react-types/button" "^3.7.0" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/ssr@^3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.4.1.tgz" + integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-aria/switch@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.3.1.tgz" + integrity sha512-o9MvXiSK9c7rUZjA6oQ0PNlVCnHEctue6v6W8Vn4HNbQMfhJiWqiSSff4RFcgRgs8WsPsEqbT+vHi2kXykQzdA== + dependencies: + "@react-aria/toggle" "^3.4.2" + "@react-stately/toggle" "^3.4.4" + "@react-types/switch" "^3.2.5" + "@swc/helpers" "^0.4.14" + +"@react-aria/table@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.7.0.tgz" + integrity sha512-1YqOeb8r8pxIYyfa5qNdCoM3fNQELM4d+9DanoNJhgnehoq9QDI9A1pGC2pvK2PN2y9IuTJM+U/ITjSpPBoGjQ== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/grid" "^3.5.2" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/live-announcer" "^3.1.2" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/table" "^3.7.0" + "@react-stately/virtualizer" "^3.4.1" + "@react-types/checkbox" "^3.4.1" + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + "@react-types/table" "^3.4.0" + "@swc/helpers" "^0.4.14" + +"@react-aria/tabs@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.3.4.tgz" + integrity sha512-SqlgfPvpRHlWelFk/lF9Ziu/8881NVErhKcpyyi+A9jASv5tvILWiwK8na82oI22UXXzyp0Y1EojLB25HnCB+w== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/selection" "^3.12.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/list" "^3.6.1" + "@react-stately/tabs" "^3.2.4" + "@react-types/shared" "^3.16.0" + "@react-types/tabs" "^3.1.5" + "@swc/helpers" "^0.4.14" + +"@react-aria/textfield@^3.8.1": + version "3.8.1" + resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.8.1.tgz" + integrity sha512-jgun/B9ecuRCfBSJLX2xDuNwfuj1lL0oibMWoSv6Y++W+CSS8a7LjR1f9Kll5TDVkQiRRUm9qHwI0og9xTJrNw== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/label" "^3.4.4" + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@react-types/textfield" "^3.6.2" + "@swc/helpers" "^0.4.14" + +"@react-aria/toggle@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.4.2.tgz" + integrity sha512-xokCGf0fn96mOMqQku5QW672iQoMsN9RMpFbKvvgg2seceh8ifblyAXElWf/6YmluOZSgUSZljDkFrbMMYlzVA== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/toggle" "^3.4.4" + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + "@react-types/switch" "^3.2.5" + "@swc/helpers" "^0.4.14" + +"@react-aria/tooltip@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.3.4.tgz" + integrity sha512-KPDkDu7fquuUOOnNh9S7KfhPMwB1w9K+yLIFrYaj4iYSOLk/HH5TDkyiUQ7j5+B963D1fWlQjYFEGQ9o2KwO/Q== + dependencies: + "@react-aria/focus" "^3.10.1" + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-stately/tooltip" "^3.2.4" + "@react-types/shared" "^3.16.0" + "@react-types/tooltip" "^3.2.5" + "@swc/helpers" "^0.4.14" + +"@react-aria/utils@^3.14.2": + version "3.14.2" + resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.14.2.tgz" + integrity sha512-3nr5gsAf/J/W+6Tu4NF3Q7m+1mXjfpXESh7TPa6UR6v3tVDTsJVMrITg2BkHN1jM8xELcl2ZxyUffOWqOXzWuA== + dependencies: + "@react-aria/ssr" "^3.4.1" + "@react-stately/utils" "^3.5.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + clsx "^1.1.1" + +"@react-aria/visually-hidden@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.6.1.tgz" + integrity sha512-7rUbiaIiR1nok9HAHPn/WcyQlvuldUqxnvh81V4dlI3NtXOgMw7/QaNc5Xo5FFWlsSVpbyK3UVJgzIui0Ns0Xg== + dependencies: + "@react-aria/interactions" "^3.13.1" + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + clsx "^1.1.1" + +"@react-stately/calendar@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.0.5.tgz" + integrity sha512-vu5hKsiA8edqNtsqBTGi8QR38qZ+uHDjuq3vp2m0f6TZSnp0kg8fkPNHEOuBTQ8ZXFFbGUZKhL/1B+ZWwLHwMQ== + dependencies: + "@internationalized/date" "^3.0.2" + "@react-stately/utils" "^3.5.2" + "@react-types/calendar" "^3.0.5" + "@react-types/datepicker" "^3.1.4" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/checkbox@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.3.2.tgz" + integrity sha512-eU3zvWgQrcqS8UK8ZVkb3fMP816PeuN9N0/dOJKuOXXhkoLPuxtuja1oEqKU3sFMa5+bx3czZhhNIRpr60NAdw== + dependencies: + "@react-stately/toggle" "^3.4.4" + "@react-stately/utils" "^3.5.2" + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/collections@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.5.1.tgz" + integrity sha512-egzVrZC5eFc5RJBpqUkzxd2aJOHZ2T1o7horEi8tAWZkg4YI+AmKrqela4ijVrrB9l1GO9z06qPT1UoPkFrC1w== + dependencies: + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/combobox@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.3.1.tgz" + integrity sha512-DgYn0MyfbDySf54o7ofXRd29TWznqtRRRbMG8TWgi/RaB0piDckT/TYWWSYOH3iMgnOEhReJhUUdMiQG4QLpIg== + dependencies: + "@react-stately/list" "^3.6.1" + "@react-stately/menu" "^3.4.4" + "@react-stately/select" "^3.3.4" + "@react-stately/utils" "^3.5.2" + "@react-types/combobox" "^3.5.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/datepicker@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.2.1.tgz" + integrity sha512-nd6thX2Z+rOLDHduB3EgMKA0n5U83lrwn3IUfjRGrcE21zFaFmhTPsHyvol5jHy3eSyjWSN9kGpKFzOxES+uoA== + dependencies: + "@internationalized/date" "^3.0.2" + "@internationalized/string" "^3.0.1" + "@react-stately/overlays" "^3.4.4" + "@react-stately/utils" "^3.5.2" + "@react-types/datepicker" "^3.1.4" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/dnd@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.0.1.tgz" + integrity sha512-pwtyY/TR6Rdk33lFdF6dztQTV9gPujFmTqJG31NSSs6ei1FfUW9ZMq+311Zb8OhZ0TFiwZqAutVmmaaUrtl5+A== + dependencies: + "@react-stately/selection" "^3.11.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/grid@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.4.2.tgz" + integrity sha512-NeIUykQeA7Hen+dV4771ARW5SRrHYNn5VTOsQwn3KBUd2Z2gZ01OwUl3gETl5u0e3/tzMUdJ1LUoSPhDMwcmKw== + dependencies: + "@react-stately/selection" "^3.11.2" + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/layout@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-stately/layout/-/layout-3.10.0.tgz" + integrity sha512-ThFgivQSD5ksLMX7tbu0HqIxbxac/E8a/0vA21wB9QF9IQnUKO796QAQqwfA5rwPvTT41LL2Xn00GkrwQ9g/zg== + dependencies: + "@react-stately/table" "^3.7.0" + "@react-stately/virtualizer" "^3.4.1" + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + "@react-types/table" "^3.4.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/list@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.6.1.tgz" + integrity sha512-+/fVkK3UO+N2NoUGpe57k9gcnfIsyEgWP8SD6CXZUkJho7BTp6mwrH0Wm8tcOclT3uBk+fZaQrk8mR3uWsPZGw== + dependencies: + "@react-stately/collections" "^3.5.1" + "@react-stately/selection" "^3.11.2" + "@react-stately/utils" "^3.5.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/menu@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.4.4.tgz" + integrity sha512-WKak1NSV9yDY0tDB4mzsbj0FboTtR06gekio0VmKb1+FmnrC07mef8eGKUn974F0WhTNUy5A1iI5eM0W2YNynA== + dependencies: + "@react-stately/overlays" "^3.4.4" + "@react-stately/utils" "^3.5.2" + "@react-types/menu" "^3.7.3" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/numberfield@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.3.1.tgz" + integrity sha512-GOu6wE2L2eal4AOL+rJQ4wQnFRgRkwiS9xdAFPu9B4qfP0DVfEIUC3XV4jws9nBhANxEf5LyilUv400nG881wg== + dependencies: + "@internationalized/number" "^3.1.2" + "@react-stately/utils" "^3.5.2" + "@react-types/numberfield" "^3.3.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/overlays@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.4.4.tgz" + integrity sha512-IIlx+VXtXS4snDXrocUOls8QZ5XBQ4SNonaz1ox8/5W7Nsvq4VtdKsIaXsUP4agOudswaimlpj3pTDO/KuF5tQ== + dependencies: + "@react-stately/utils" "^3.5.2" + "@react-types/overlays" "^3.6.5" + "@swc/helpers" "^0.4.14" + +"@react-stately/radio@^3.6.2": + version "3.6.2" + resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.6.2.tgz" + integrity sha512-qjbebR0YSkdEocLsPSzNnCsUYllWY938/5Z8mETxk4+74PJLxC3z0qjqVRq+aDO8hOgIfqSgrRRp3cJz9vIsBg== + dependencies: + "@react-stately/utils" "^3.5.2" + "@react-types/radio" "^3.3.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/searchfield@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.3.4.tgz" + integrity sha512-H/1evv7lsJl6PlD7/Sv7VgbCe0Yd2E2eKFihD6/tXPWO6L/ngYp5siqqhdwazjWTK2Hgw4TL0eviHGOGXKItzQ== + dependencies: + "@react-stately/utils" "^3.5.2" + "@react-types/searchfield" "^3.3.6" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/select@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.3.4.tgz" + integrity sha512-gD4JnF9/OIrQNdA4VqPIbifqpBC84BXHR5N7KmG7Ef06K9WGGVNB4FS538wno/znKg7lR6A45CPlaV53qfvWHg== + dependencies: + "@react-stately/collections" "^3.5.1" + "@react-stately/list" "^3.6.1" + "@react-stately/menu" "^3.4.4" + "@react-stately/selection" "^3.11.2" + "@react-stately/utils" "^3.5.2" + "@react-types/select" "^3.6.5" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/selection@^3.11.2": + version "3.11.2" + resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.11.2.tgz" + integrity sha512-g21Y36xhYkXO3yzz0BYSBqnD38olvEwsJUqBXGZfx//bshMC2FNmI5sRYMAi36stxWbwzBvB01OytxfLLxCXCA== + dependencies: + "@react-stately/collections" "^3.5.1" + "@react-stately/utils" "^3.5.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/slider@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.2.4.tgz" + integrity sha512-J97lTLqQKsrVSovYr4dTz7IJO/+j9OStT78N6bumDklnIKT7bsH3g857zITUFjs8yCcq0Jt3sfOvEU0ts6vyww== + dependencies: + "@react-aria/i18n" "^3.6.3" + "@react-aria/utils" "^3.14.2" + "@react-stately/utils" "^3.5.2" + "@react-types/shared" "^3.16.0" + "@react-types/slider" "^3.3.1" + "@swc/helpers" "^0.4.14" + +"@react-stately/table@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.7.0.tgz" + integrity sha512-oPvMEabRUD4LSJ/NZsal3TT2YjoRmpEK8t2pqG20+Vapxy5tC6QKEZQvrDxJwF4Z8fqQnX/GvnqmfypvqWDUSA== + dependencies: + "@react-stately/collections" "^3.5.1" + "@react-stately/grid" "^3.4.2" + "@react-stately/selection" "^3.11.2" + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + "@react-types/table" "^3.4.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/tabs@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.2.4.tgz" + integrity sha512-qSnkoxzbC21KXZYGtg6TEDaex34WSNmPN4sJzXc9Xe39L6+wXNCA2tqZxWCfpIcWQklFm+BmnnNNCO8/PDDrMA== + dependencies: + "@react-stately/list" "^3.6.1" + "@react-stately/utils" "^3.5.2" + "@react-types/tabs" "^3.1.5" + "@swc/helpers" "^0.4.14" + +"@react-stately/toggle@^3.4.4": + version "3.4.4" + resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.4.4.tgz" + integrity sha512-OwVJpd2M7P7fekTWpl3TUdD3Brq+Z/xElOCJYP5QuVytXCa5seKsk40YPld8JQnA5dRKojpbUxMDOJpb6hOOfw== + dependencies: + "@react-stately/utils" "^3.5.2" + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/tooltip@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.2.4.tgz" + integrity sha512-t7ksDRs9jKcOS25BVLM5cNCyzSCnzrin8OZ3AEmgeNxfiS58HhHbNxYk725hyGrbdpugQ03cRcJG70EZ6VgwDQ== + dependencies: + "@react-stately/overlays" "^3.4.4" + "@react-stately/utils" "^3.5.2" + "@react-types/tooltip" "^3.2.5" + "@swc/helpers" "^0.4.14" + +"@react-stately/tree@^3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.4.1.tgz" + integrity sha512-kIXeJOHgGGaUFnAD2wyRIiOwOw/+PN1OXo46n8+dPTFIYwR4+IWFNG8OMjVlIiSLPYWMCzzxZBE9a5grmbmNWQ== + dependencies: + "@react-stately/collections" "^3.5.1" + "@react-stately/selection" "^3.11.2" + "@react-stately/utils" "^3.5.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-stately/utils@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.5.2.tgz" + integrity sha512-639gSKqamPHIEPaApb9ahVJS0HgAqNdVF3tQRoh+Ky6759Mbk6i3HqG4zk4IGQ1tVlYSYZvCckwehF7b2zndMg== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-stately/virtualizer@^3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.4.1.tgz" + integrity sha512-2S7GARkZl41X7fN0Xa94TkN8ELAUbA89zn1xH59d02NOvAKLAFXHkCe69AivvVvbhXo8/nONzO8NXqqgBS/XQw== + dependencies: + "@react-aria/utils" "^3.14.2" + "@react-types/shared" "^3.16.0" + "@swc/helpers" "^0.4.14" + +"@react-types/breadcrumbs@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.4.6.tgz" + integrity sha512-hvGUI4mKHvOl3QyKFHk1qT/UkG+C4iJsRTlk6pbQgwk4lb7rplEm1CEa7fxzRdI8Gh4Id+C9+WyKCxZf9GNWUw== + dependencies: + "@react-types/link" "^3.3.6" + "@react-types/shared" "^3.16.0" + +"@react-types/button@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/button/-/button-3.7.0.tgz" + integrity sha512-81BQO3QxSgF9PTXsVozNdNCKxBOB1lpbCWocV99dN1ws9s8uaYw8pmJJZ0LJKLiOsIECQ/3QrhQjmWTDW/qTug== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/calendar@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.0.5.tgz" + integrity sha512-Kx00132hFEVvqay/Ub7q2oZEA1AzksirAuCsjakamn4LAXvitlo3PZxqBdEsyRc3nP5NR48KJj8yo276mXY8kQ== + dependencies: + "@internationalized/date" "^3.0.2" + "@react-types/shared" "^3.16.0" + +"@react-types/checkbox@^3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.1.tgz" + integrity sha512-kDMpy9SntjGQ7x00m5zmW8GENPouOtyiDgiEDKsPXUr2iYqHsNtricqVyG9S9+6hqpzuu8BzTcvZamc/xYjzlg== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/combobox@^3.5.5": + version "3.5.5" + resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.5.5.tgz" + integrity sha512-gpDo/NTQFd5IfCZoNnG16N4/JfvwXpZBNc15Kn7bF+NcpSDhDpI26BZN4mvK4lljKCheD4VrEl9/3PtImCg7cA== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/datepicker@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.1.4.tgz" + integrity sha512-NBCXBCe3YZqeA/JrVKy0IAvJ2XSnXaVpR9iAlUwKu7V8P81CtnXHsVCrd/0HSH8QZWsGdIV5E23z0TctvW8trA== + dependencies: + "@internationalized/date" "^3.0.2" + "@react-types/overlays" "^3.6.5" + "@react-types/shared" "^3.16.0" + +"@react-types/dialog@^3.4.5": + version "3.4.5" + resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.4.5.tgz" + integrity sha512-FkxZAYNRWkZVH5rjlw6qyQ/SpoGcYtNI/JQvn1H/xtZy/OJh2b2ERxGWv5x0RItGSeyATdSwFO1Qnf1Kl2K02A== + dependencies: + "@react-types/overlays" "^3.6.5" + "@react-types/shared" "^3.16.0" + +"@react-types/grid@^3.1.5": + version "3.1.5" + resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.5.tgz" + integrity sha512-KiEywsOJ+wdzLmJerAKEMADdvdItaLfhdo3bFfn1lgNUaKiNDJctDYWlhOYsRePf7MIrzoZuXEFnJj45jfpiOQ== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/label@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@react-types/label/-/label-3.7.1.tgz" + integrity sha512-wFpdtjSDBWO4xQQGF57V3PqvVVyE9TPj9ELWLs1yzL09fpXosycuEl5d79RywVlC9aF9dQYUfES09q/DZhRhMQ== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/link@^3.3.6": + version "3.3.6" + resolved "https://registry.npmjs.org/@react-types/link/-/link-3.3.6.tgz" + integrity sha512-HMFd94CW8WrHbwXeTtCP/WOZmGugrEkN8f16R0i7T9xlTumk5GxubDMjA41ND/ehH72Xq7lP9VX8qezHWCGSoQ== + dependencies: + "@react-aria/interactions" "^3.13.1" + "@react-types/shared" "^3.16.0" + +"@react-types/listbox@^3.3.5": + version "3.3.5" + resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.3.5.tgz" + integrity sha512-7SMRJWUi7ayzQ7SUPCXXwgI/Ua3vg0PPQOZFsmJ4/E8VG/xK82IV7BYSZiNjUQuGpVZJL0VPndt/RwIrQO4S3w== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/menu@^3.7.3": + version "3.7.3" + resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.7.3.tgz" + integrity sha512-3Pax24I/FyNKBjKyNR4ePD8eZs35Th57HzJAVjamQg2fHEDRomg9GQ7fdmfGj72Dv3x3JRCoPYqhJ3L5R3kbzg== + dependencies: + "@react-types/overlays" "^3.6.5" + "@react-types/shared" "^3.16.0" + +"@react-types/meter@^3.2.5": + version "3.2.5" + resolved "https://registry.npmjs.org/@react-types/meter/-/meter-3.2.5.tgz" + integrity sha512-pBrHoWRSwrfo3JtCCxoniSEd27Pokt20Fj4ZkJxjjDtLdcHOM4Z1JIKvOlcXMCV35iknrVu4veDHpmXolI+vAw== + dependencies: + "@react-types/progress" "^3.2.5" + "@react-types/shared" "^3.16.0" + +"@react-types/numberfield@^3.3.5": + version "3.3.5" + resolved "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.3.5.tgz" + integrity sha512-qBhUSkahiIeTW5IvKvyfLtVHgzyqwKfuDIOlJQiBwgrOPR96X8KDDsOib4r5SFv0lhibv0gQ5L5ucXbmwLyQ8A== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/overlays@^3.6.5": + version "3.6.5" + resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.6.5.tgz" + integrity sha512-IeWcF+YTucCYYHagNh8fZLH6R4YUONO1VHY57WJyIHwMy0qgEaKSQCwq72VO1fQJ0ySZgOgm31FniOyKkg6+eQ== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/progress@^3.2.5": + version "3.2.5" + resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.2.5.tgz" + integrity sha512-pFSqaj6rlSdPqGHVErJ8G3RkIyYigoJ3EVozvhR9bcKkLlhnzJiFgOZl+k5u/ZKJOA+YHivIHJwg+Kl1sG0J6A== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/radio@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.3.1.tgz" + integrity sha512-q/x0kMvBsu6mH4bIkp/Jjrm9ff5y/p3UR0V4CmQFI7604gQd2Dt1dZMU/2HV9x70r1JfWRrDeRrVjUHVfFL5Vg== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/searchfield@^3.3.6": + version "3.3.6" + resolved "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.3.6.tgz" + integrity sha512-DIv5eznnJVv0CM4f8SEEiptEZSzXUJWUyxRPkTzYNWt91pPPaCNbCQbmzZtyR9/R9KRJ9hlZN2bMkrtfVLvl1g== + dependencies: + "@react-types/shared" "^3.16.0" + "@react-types/textfield" "^3.6.2" + +"@react-types/select@^3.6.5": + version "3.6.5" + resolved "https://registry.npmjs.org/@react-types/select/-/select-3.6.5.tgz" + integrity sha512-FDeSA7TYMNnhsbXREnD4dWRSu21T5M4BLy+J/5VgwDpr3IN9pzbvngK8a3jc8Yg2S3igKYLMLYfmcsx+yk7ohA== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/shared@^3.16.0": + version "3.16.0" + resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.16.0.tgz" + integrity sha512-IQgU4oAEvMwylEvaTsr2XB1G/mAoMe1JFYLD6G78v++oAR9l8o9MQxZ0YSeANDkqTamb2gKezGoT1RxvSKjVxw== + +"@react-types/slider@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.3.1.tgz" + integrity sha512-CbEa1v1IcUJD7VrFhWyOOlT7VyQ5DHEf/pNMkvICOBLMAwnWxS+tnTiRFgA/EbvV/vp24ydeszHYtMvsyRONRw== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/switch@^3.2.5": + version "3.2.5" + resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.2.5.tgz" + integrity sha512-DlUL0Bz79SUTRje/i8m6qn4Ipn+q8QnyIkyJhkoHeH1R0YNude8xZrBPWbj3zfdddAGDFSF1NzP69q0xmNAcTQ== + dependencies: + "@react-types/checkbox" "^3.4.1" + "@react-types/shared" "^3.16.0" + +"@react-types/table@^3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@react-types/table/-/table-3.4.0.tgz" + integrity sha512-G2L5WtaBMeG3v/5Kj/ZXH4ywz95vyPUBj7qy9UZJOYNaAR7uJWZkbe+Ka4xD4H/AaOk4mqW8dSo8cj7gtD66GQ== + dependencies: + "@react-types/grid" "^3.1.5" + "@react-types/shared" "^3.16.0" + +"@react-types/tabs@^3.1.5": + version "3.1.5" + resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.1.5.tgz" + integrity sha512-YgWY8IajCDBZmBzR3eii0aW6+SjcAT/dmqDNmfIuVVnDN7sHQ3PFa0nbmByvb0SfjOkJYumt8TJwFUCugohS8A== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/textfield@^3.6.2": + version "3.6.2" + resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.6.2.tgz" + integrity sha512-QhFcpXvmSEW1/PwkWkvHJkcjsVezLW0OAvA0kMt/FMOChQNxnO36Pha+WjfcVbiFHXMhCBl6akbY2xG9NsHJrQ== + dependencies: + "@react-types/shared" "^3.16.0" + +"@react-types/tooltip@^3.2.5": + version "3.2.5" + resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.2.5.tgz" + integrity sha512-D4lN32JwQuA3JbCgcI26mgCkLHIj1WE8MTzf1McaasPkx7gVaqW+wfPyFwt99/Oo52TLvA/1oin78qePP67PSw== + dependencies: + "@react-types/overlays" "^3.6.5" + "@react-types/shared" "^3.16.0" + +"@swc/helpers@^0.4.14": + version "0.4.14" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.21.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz" + integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": + version "4.17.33" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.16" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz" + integrity sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.31" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hoist-non-react-statics@*": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*": + version "18.11.18" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.10": + version "18.0.10" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz" + integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.27": + version "18.0.27" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/styled-components@^5.1.26": + version "5.1.26" + resolved "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz" + integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw== + dependencies: + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + csstype "^3.0.2" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz" + integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== + +"@webpack-cli/info@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz" + integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== + +"@webpack-cli/serve@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz" + integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8, acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0, ajv@^8.8.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +babel-loader@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== + dependencies: + find-cache-dir "^3.3.2" + schema-utils "^4.0.0" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-plugin-styled-components@^2.0.7, "babel-plugin-styled-components@>= 1.12.0": + version "2.0.7" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz" + integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + picomatch "^2.3.0" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.0" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz" + integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +caniuse-lite@^1.0.30001449: + version "1.0.30001450" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz" + integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + 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== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.25.1: + version "3.27.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + dependencies: + browserslist "^4.21.4" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-to-react-native@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.1.0.tgz" + integrity sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +default-gateway@^6.0.3: + 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== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.284" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + 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" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + 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" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: + 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== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +intl-messageformat@^10.1.0: + version "10.3.0" + resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.3.0.tgz" + integrity sha512-FKeBZKH9T2Ue4RUXCuwY/hEaRHU8cgICevlGKog0qSBuz/amtRKNBLetBLmRxiHeEkF7JBBckC+56GIwshlRwA== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/fast-memoize" "1.2.8" + "@formatjs/icu-messageformat-parser" "2.2.0" + tslib "^2.4.0" + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash@^4.17.11: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.8: + version "2.0.9" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz" + integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postcss-value-parser@^4.0.2: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +prettier@2.8.4: + version "2.8.4" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-aria@^3.22.0: + version "3.22.0" + resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.22.0.tgz" + integrity sha512-GA+qwnVVTvSirdhB/PsYPwix24vFDlGeK5Lk3zUgB9Q5VHnTfMMJ4+tyu9G38UR0clLQ5SAG1ArNjgzmhexQYg== + dependencies: + "@react-aria/breadcrumbs" "^3.4.1" + "@react-aria/button" "^3.6.4" + "@react-aria/calendar" "^3.0.5" + "@react-aria/checkbox" "^3.7.1" + "@react-aria/combobox" "^3.4.4" + "@react-aria/datepicker" "^3.2.1" + "@react-aria/dialog" "^3.4.2" + "@react-aria/dnd" "^3.0.1" + "@react-aria/focus" "^3.10.1" + "@react-aria/gridlist" "^3.1.2" + "@react-aria/i18n" "^3.6.3" + "@react-aria/interactions" "^3.13.1" + "@react-aria/label" "^3.4.4" + "@react-aria/link" "^3.3.6" + "@react-aria/listbox" "^3.7.2" + "@react-aria/menu" "^3.7.1" + "@react-aria/meter" "^3.3.4" + "@react-aria/numberfield" "^3.3.4" + "@react-aria/overlays" "^3.12.1" + "@react-aria/progress" "^3.3.4" + "@react-aria/radio" "^3.4.2" + "@react-aria/searchfield" "^3.4.4" + "@react-aria/select" "^3.8.4" + "@react-aria/selection" "^3.12.1" + "@react-aria/separator" "^3.2.6" + "@react-aria/slider" "^3.2.4" + "@react-aria/ssr" "^3.4.1" + "@react-aria/switch" "^3.3.1" + "@react-aria/table" "^3.7.0" + "@react-aria/tabs" "^3.3.4" + "@react-aria/textfield" "^3.8.1" + "@react-aria/tooltip" "^3.3.4" + "@react-aria/utils" "^3.14.2" + "@react-aria/visually-hidden" "^3.6.1" + +"react-dom@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", react-dom@^18.2.0, "react-dom@>= 16.8.0": + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1, react-is@^16.7.0, "react-is@>= 16.8.0": + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0": + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + 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" + +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +styled-components@^5.3.6, "styled-components@>= 2": + version "5.3.6" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz" + integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.6" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.14.1: + version "5.16.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz" + integrity sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^5.0.1, webpack-cli@5.x.x: + version "5.0.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz" + integrity sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.0.1" + "@webpack-cli/info" "^2.0.1" + "@webpack-cli/serve" "^2.0.1" + colorette "^2.0.14" + commander "^9.4.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.11.1: + version "4.11.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.1.0, webpack@^5.75.0, webpack@>=5, webpack@5.x.x: + version "5.75.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.4.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/package.json b/package.json index ac65840b..fcec14e8 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,14 @@ "@babel/cli": "^7.4.4", "@babel/core": "^7.4.5", "@babel/preset-env": "^7.4.5", + "@typescript-eslint/parser": "^5.52.0", "babel-loader": "^8.0.6", "clean-webpack-plugin": "^1.0.0", "eslint": "^6.3.0", "eslint-config-airbnb": "^14.0.0", + "eslint-import-resolver-typescript": "^3.5.3", "eslint-loader": "1.5.0", - "eslint-plugin-import": "^2.2.0", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^3.0.2", "eslint-plugin-mocha": "^4.7.0", "eslint-plugin-react": "^6.9.0",