diff --git a/client/src/App.jsx b/client/src/App.jsx
index e3a91572c..e545b38d3 100644
--- a/client/src/App.jsx
+++ b/client/src/App.jsx
@@ -1,46 +1,19 @@
-import React, { lazy, Suspense, useCallback, useEffect } from 'react';
-import { Route, Routes, useLocation, useNavigate } from 'react-router-dom';
+import React, { Suspense, useCallback, useEffect } from 'react';
+import { QueryClient, QueryClientProvider } from 'react-query';
+import { BrowserRouter } from 'react-router-dom';
+import { ChakraProvider } from '@chakra-ui/react';
import ErrorBoundary from 'common/components/errorBoundary/ErrorBoundary';
-import withSocket from 'features/viewers/ViewWrapper';
-import { ALIASES } from './app/api/apiConstants';
-import { getAliases } from './app/api/ontimeApi';
-import { useFetch } from './app/hooks/useFetch';
+import { AppContextProvider } from './common/context/AppContext';
+import SocketProvider from './common/context/socketContext';
+import theme from './theme/theme';
+import AppRouter from './AppRouter';
-import './App.scss';
-
-const Editor = lazy(() => import('features/editors/ProtectedEditor'));
-const Table = lazy(() => import('features/table/ProtectedTable'));
-
-const TimerView = lazy(() => import('features/viewers/timer/Timer'));
-const MinimalTimerView = lazy(() => import('features/viewers/timer/MinimalTimer'));
-const Countdown = lazy(() => import('features/viewers/countdown/Countdown'));
-
-const StageManager = lazy(() => import('features/viewers/backstage/StageManager'));
-const Public = lazy(() => import('features/viewers/foh/Public'));
-const Lower = lazy(() => import('features/viewers/production/lower/LowerWrapper'));
-const Pip = lazy(() => import('features/viewers/production/Pip'));
-const StudioClock = lazy(() => import('features/viewers/studio/StudioClock'));
-
-const STimer = withSocket(TimerView);
-const SMinimalTimer = withSocket(MinimalTimerView);
-const SCountdown = withSocket(Countdown);
-const SStageManager = withSocket(StageManager);
-const SPublic = withSocket(Public);
-const SLowerThird = withSocket(Lower);
-const SPip = withSocket(Pip);
-const SStudio = withSocket(StudioClock);
-
-const FeatureWrapper = lazy(() => import('features/FeatureWrapper'));
-const EventList = lazy(() => import('features/editors/list/EventListExport'));
-const TimerControl = lazy(() => import('features/control/playback/TimerControlExport'));
-const MessageControl = lazy(() => import('features/control/message/MessageControlExport'));
-const Info = lazy(() => import('features/info/InfoExport'));
+// Load Open Sans typeface
+require('typeface-open-sans');
+const queryClient = new QueryClient();
function App() {
- const { data } = useFetch(ALIASES, getAliases);
- const location = useLocation();
- const navigate = useNavigate();
// Handle keyboard shortcuts
const handleKeyPress = useCallback((e) => {
@@ -68,88 +41,26 @@ function App() {
};
}, [handleKeyPress]);
- // navigate if is alias route
- useEffect(() => {
- if (data == null) return;
- for (const d of data) {
- if (`/${d.alias}` === location.pathname && d.enabled) {
- navigate(`/${d.pathAndParams}`);
- break;
- }
- }
- }, [data, location, navigate]);
+
return (
-
-
-
-
- } />
- } />
- } />
- } />
- } />
-
- } />
- } />
- } />
-
- } />
-
- } />
- } />
-
- } />
- } />
- } />
- {/*/!* Lower cannot have fallback *!/*/}
- } />
-
- {/*/!* Protected Routes *!/*/}
- } />
- } />
- } />
- } />
-
- {/*/!* Protected Routes - Elements *!/*/}
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
- {/* Send to default if nothing found */}
- } />
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/client/src/App.scss b/client/src/App.scss
deleted file mode 100644
index 2ee8de8bb..000000000
--- a/client/src/App.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-* {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- scrollbar-color: rgba(255, 255, 255, 0.15) rgba(255, 255, 255, 0.01);
- scrollbar-width: thin;
-}
-
-body,
-html,
-.App {
- margin: 0 auto;
- overflow: hidden;
- overflow: clip;
- height: 100vh;
- -webkit-user-select: none;
- user-select: none;
- -webkit-app-region: drag;
-}
-
-option {
- color: black;
-}
-
-/* width */
-::-webkit-scrollbar {
- width: 0.5rem;
- height: 0.5rem;
-}
-
-/* Track */
-::-webkit-scrollbar-track {
- background: rgba(255, 255, 255, 0.01);
- border-radius: 4px;
-}
-
-/* Handle */
-::-webkit-scrollbar-thumb {
- background: rgba(255, 255, 255, 0.15);
- border-radius: 4px;
-}
-
-/* Handle on hover */
-::-webkit-scrollbar-thumb:hover {
- background: rgba(255, 255, 255, 0.35);
-}
diff --git a/client/src/AppRouter.jsx b/client/src/AppRouter.jsx
new file mode 100644
index 000000000..ba0bebeb6
--- /dev/null
+++ b/client/src/AppRouter.jsx
@@ -0,0 +1,119 @@
+import React, { lazy, useEffect } from 'react';
+import { Route, Routes, useLocation, useNavigate } from 'react-router-dom';
+
+import { ALIASES } from './common/api/apiConstants';
+import { getAliases } from './common/api/ontimeApi';
+import { useFetch } from './common/hooks/useFetch';
+import withSocket from './features/viewers/ViewWrapper';
+
+const Editor = lazy(() => import('features/editors/ProtectedEditor'));
+const Table = lazy(() => import('features/table/ProtectedTable'));
+
+const TimerView = lazy(() => import('features/viewers/timer/Timer'));
+const MinimalTimerView = lazy(() => import('features/viewers/timer/MinimalTimer'));
+const Countdown = lazy(() => import('features/viewers/countdown/Countdown'));
+
+const StageManager = lazy(() => import('features/viewers/backstage/StageManager'));
+const Public = lazy(() => import('features/viewers/foh/Public'));
+const Lower = lazy(() => import('features/viewers/production/lower/LowerWrapper'));
+const Pip = lazy(() => import('features/viewers/production/Pip'));
+const StudioClock = lazy(() => import('features/viewers/studio/StudioClock'));
+
+const STimer = withSocket(TimerView);
+const SMinimalTimer = withSocket(MinimalTimerView);
+const SCountdown = withSocket(Countdown);
+const SStageManager = withSocket(StageManager);
+const SPublic = withSocket(Public);
+const SLowerThird = withSocket(Lower);
+const SPip = withSocket(Pip);
+const SStudio = withSocket(StudioClock);
+
+const FeatureWrapper = lazy(() => import('features/FeatureWrapper'));
+const EventList = lazy(() => import('features/editors/list/EventListExport'));
+const TimerControl = lazy(() => import('features/control/playback/TimerControlExport'));
+const MessageControl = lazy(() => import('features/control/message/MessageControlExport'));
+const Info = lazy(() => import('features/info/InfoExport'));
+
+export default function AppRouter() {
+ const { data } = useFetch(ALIASES, getAliases);
+ const location = useLocation();
+ const navigate = useNavigate();
+
+ // navigate if is alias route
+ useEffect(() => {
+ if (!data) return;
+ for (const d of data) {
+ if (`/${d.alias}` === location.pathname && d.enabled) {
+ navigate(`/${d.pathAndParams}`);
+ break;
+ }
+ }
+ }, [data, location, navigate]);
+
+ return(
+
+ } />
+ } />
+ } />
+ } />
+ } />
+
+ } />
+ } />
+ } />
+
+ } />
+
+ } />
+ } />
+
+ } />
+ } />
+ } />
+ {/*/!* Lower cannot have fallback *!/*/}
+ } />
+
+ {/*/!* Protected Routes *!/*/}
+ } />
+ } />
+ } />
+ } />
+
+ {/*/!* Protected Routes - Elements *!/*/}
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+ {/* Send to default if nothing found */}
+ } />
+
+ )
+}
diff --git a/client/src/app/appConstants.js b/client/src/appConstants.js
similarity index 100%
rename from client/src/app/appConstants.js
rename to client/src/appConstants.js
diff --git a/client/src/app/api/apiConstants.js b/client/src/common/api/apiConstants.js
similarity index 100%
rename from client/src/app/api/apiConstants.js
rename to client/src/common/api/apiConstants.js
diff --git a/client/src/app/api/eventApi.js b/client/src/common/api/eventApi.js
similarity index 100%
rename from client/src/app/api/eventApi.js
rename to client/src/common/api/eventApi.js
diff --git a/client/src/app/api/eventsApi.js b/client/src/common/api/eventsApi.js
similarity index 100%
rename from client/src/app/api/eventsApi.js
rename to client/src/common/api/eventsApi.js
diff --git a/client/src/app/api/ontimeApi.js b/client/src/common/api/ontimeApi.js
similarity index 100%
rename from client/src/app/api/ontimeApi.js
rename to client/src/common/api/ontimeApi.js
diff --git a/client/src/app/api/playbackApi.js b/client/src/common/api/playbackApi.js
similarity index 100%
rename from client/src/app/api/playbackApi.js
rename to client/src/common/api/playbackApi.js
diff --git a/client/src/common/components/buttons/QuitIconBtn.jsx b/client/src/common/components/buttons/QuitIconBtn.jsx
index 4e2865727..1f16781b6 100644
--- a/client/src/common/components/buttons/QuitIconBtn.jsx
+++ b/client/src/common/components/buttons/QuitIconBtn.jsx
@@ -12,7 +12,7 @@ import { Tooltip } from '@chakra-ui/tooltip';
import { FiPower } from '@react-icons/all-files/fi/FiPower';
import PropTypes from 'prop-types';
-import { LoggingContext } from '../../../app/context/LoggingContext';
+import { LoggingContext } from '../../context/LoggingContext';
export default function QuitIconBtn(props) {
const { clickHandler, size = 'lg', ...rest } = props;
diff --git a/client/src/common/components/collapseBar/CollapseBar.module.scss b/client/src/common/components/collapseBar/CollapseBar.module.scss
index dd10a1d72..8ff33fca1 100644
--- a/client/src/common/components/collapseBar/CollapseBar.module.scss
+++ b/client/src/common/components/collapseBar/CollapseBar.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.header,
.headerRoll {
diff --git a/client/src/common/components/countdown/TimerDisplay.module.scss b/client/src/common/components/countdown/TimerDisplay.module.scss
index 20c4ad66f..33889acfa 100644
--- a/client/src/common/components/countdown/TimerDisplay.module.scss
+++ b/client/src/common/components/countdown/TimerDisplay.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
/* Common */
.countdownClock,
diff --git a/client/src/common/components/errorBoundary/ErrorBoundary.jsx b/client/src/common/components/errorBoundary/ErrorBoundary.jsx
index e995dd943..1b015b8bd 100644
--- a/client/src/common/components/errorBoundary/ErrorBoundary.jsx
+++ b/client/src/common/components/errorBoundary/ErrorBoundary.jsx
@@ -1,7 +1,7 @@
/* eslint-disable react/destructuring-assignment */
import React from 'react';
-import { LoggingContext } from '../../../app/context/LoggingContext';
+import { LoggingContext } from '../../context/LoggingContext';
import style from './ErrorBoundary.module.scss';
const appVersion = require('../../../../package.json').version;
diff --git a/client/src/common/components/errorBoundary/ErrorBoundary.module.scss b/client/src/common/components/errorBoundary/ErrorBoundary.module.scss
index 453e11f60..afde83608 100644
--- a/client/src/common/components/errorBoundary/ErrorBoundary.module.scss
+++ b/client/src/common/components/errorBoundary/ErrorBoundary.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.errorContainer {
width: 100%;
diff --git a/client/src/common/components/eventTimes/EventTimes.jsx b/client/src/common/components/eventTimes/EventTimes.jsx
index 15e1d7dca..e05232dcf 100644
--- a/client/src/common/components/eventTimes/EventTimes.jsx
+++ b/client/src/common/components/eventTimes/EventTimes.jsx
@@ -1,9 +1,9 @@
import React, { useCallback, useContext } from 'react';
-import EditableTimer from 'common/input/EditableTimer';
+import EditableTimer from 'common/components/input/EditableTimer';
import PropTypes from 'prop-types';
-import { LoggingContext } from '../../../app/context/LoggingContext';
-import { validateTimes } from '../../../app/entryValidator';
+import { LoggingContext } from '../../context/LoggingContext';
+import { validateTimes } from '../../utils/entryValidator';
export default function EventTimes(props) {
const { actionHandler, delay, timeStart, timeEnd, previousEnd } = props;
diff --git a/client/src/common/components/eventTimes/EventTimesVertical.jsx b/client/src/common/components/eventTimes/EventTimesVertical.jsx
index d7ac6a55d..f63d73157 100644
--- a/client/src/common/components/eventTimes/EventTimesVertical.jsx
+++ b/client/src/common/components/eventTimes/EventTimesVertical.jsx
@@ -1,8 +1,8 @@
import React, { useCallback, useContext } from 'react';
import PropTypes from 'prop-types';
-import { LoggingContext } from '../../../app/context/LoggingContext';
-import { validateTimes } from '../../../app/entryValidator';
+import { LoggingContext } from '../../context/LoggingContext';
+import { validateTimes } from '../../utils/entryValidator';
import Times from './Times';
import TimesDelayed from './TimesDelayed';
diff --git a/client/src/common/components/eventTimes/Times.jsx b/client/src/common/components/eventTimes/Times.jsx
index b6d0199d8..de26d5b2e 100644
--- a/client/src/common/components/eventTimes/Times.jsx
+++ b/client/src/common/components/eventTimes/Times.jsx
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
-import EditableTimer from '../../input/EditableTimer';
+import EditableTimer from '../input/EditableTimer';
import style from './Times.module.scss'
diff --git a/client/src/common/components/eventTimes/Times.module.scss b/client/src/common/components/eventTimes/Times.module.scss
index 99594805d..156593f7e 100644
--- a/client/src/common/components/eventTimes/Times.module.scss
+++ b/client/src/common/components/eventTimes/Times.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.label {
font-size: 0.75em;
diff --git a/client/src/common/components/eventTimes/TimesDelayed.jsx b/client/src/common/components/eventTimes/TimesDelayed.jsx
index 8e717a9de..78801e5c5 100644
--- a/client/src/common/components/eventTimes/TimesDelayed.jsx
+++ b/client/src/common/components/eventTimes/TimesDelayed.jsx
@@ -1,8 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
-import EditableTimer from '../../input/EditableTimer';
import { stringFromMillis } from '../../utils/time';
+import EditableTimer from '../input/EditableTimer';
import style from './Times.module.scss'
diff --git a/client/src/common/input/AutoTextArea.jsx b/client/src/common/components/input/AutoTextArea.jsx
similarity index 100%
rename from client/src/common/input/AutoTextArea.jsx
rename to client/src/common/components/input/AutoTextArea.jsx
diff --git a/client/src/common/input/DelayInput.jsx b/client/src/common/components/input/DelayInput.jsx
similarity index 97%
rename from client/src/common/input/DelayInput.jsx
rename to client/src/common/components/input/DelayInput.jsx
index 73ed32def..1ede64b05 100644
--- a/client/src/common/input/DelayInput.jsx
+++ b/client/src/common/components/input/DelayInput.jsx
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react';
import { Editable, EditableInput, EditablePreview } from '@chakra-ui/react';
import PropTypes from 'prop-types';
-import { clamp } from '../../app/utils/math';
+import { clamp } from '../../utils/math';
import style from './TimeInput.module.css';
diff --git a/client/src/common/input/EditableText.jsx b/client/src/common/components/input/EditableText.jsx
similarity index 100%
rename from client/src/common/input/EditableText.jsx
rename to client/src/common/components/input/EditableText.jsx
diff --git a/client/src/common/input/EditableText.module.scss b/client/src/common/components/input/EditableText.module.scss
similarity index 92%
rename from client/src/common/input/EditableText.module.scss
rename to client/src/common/components/input/EditableText.module.scss
index 69e9e5775..f689a21e0 100644
--- a/client/src/common/input/EditableText.module.scss
+++ b/client/src/common/components/input/EditableText.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../../theme/main' as *;
.block {
overflow: hidden;
diff --git a/client/src/common/input/EditableTimer.jsx b/client/src/common/components/input/EditableTimer.jsx
similarity index 94%
rename from client/src/common/input/EditableTimer.jsx
rename to client/src/common/components/input/EditableTimer.jsx
index ec9264dbb..bcad1e456 100644
--- a/client/src/common/input/EditableTimer.jsx
+++ b/client/src/common/components/input/EditableTimer.jsx
@@ -2,9 +2,9 @@ import React, { useCallback, useContext, useEffect, useState } from 'react';
import { Editable, EditableInput, EditablePreview } from '@chakra-ui/editable';
import PropTypes from 'prop-types';
-import { LoggingContext } from '../../app/context/LoggingContext';
-import { forgivingStringToMillis } from '../utils/dateConfig';
-import { stringFromMillis } from '../utils/time';
+import { LoggingContext } from '../../context/LoggingContext';
+import { forgivingStringToMillis } from '../../utils/dateConfig';
+import { stringFromMillis } from '../../utils/time';
import style from './EditableTimer.module.scss';
diff --git a/client/src/common/input/EditableTimer.module.scss b/client/src/common/components/input/EditableTimer.module.scss
similarity index 88%
rename from client/src/common/input/EditableTimer.module.scss
rename to client/src/common/components/input/EditableTimer.module.scss
index 8307bc17d..b7321c028 100644
--- a/client/src/common/input/EditableTimer.module.scss
+++ b/client/src/common/components/input/EditableTimer.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main'as *;
+@use '../../../theme/main'as *;
.editable,
.delayedEditable {
diff --git a/client/src/common/input/TimeInput.module.css b/client/src/common/components/input/TimeInput.module.css
similarity index 100%
rename from client/src/common/input/TimeInput.module.css
rename to client/src/common/components/input/TimeInput.module.css
diff --git a/client/src/common/input/__tests__/EditableTimer.test.jsx b/client/src/common/components/input/__tests__/EditableTimer.test.jsx
similarity index 100%
rename from client/src/common/input/__tests__/EditableTimer.test.jsx
rename to client/src/common/components/input/__tests__/EditableTimer.test.jsx
diff --git a/client/src/common/components/myProgressBar/MyProgressBar.jsx b/client/src/common/components/myProgressBar/MyProgressBar.jsx
index ff7a07543..6e7a9884c 100644
--- a/client/src/common/components/myProgressBar/MyProgressBar.jsx
+++ b/client/src/common/components/myProgressBar/MyProgressBar.jsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { clamp } from 'app/utils/math';
+import { clamp } from 'common/utils/math';
import PropTypes from 'prop-types';
import styles from './MyProgressBar.module.scss';
diff --git a/client/src/common/components/myProgressBar/MyProgressBar.module.scss b/client/src/common/components/myProgressBar/MyProgressBar.module.scss
index 6f183f155..deef4b350 100644
--- a/client/src/common/components/myProgressBar/MyProgressBar.module.scss
+++ b/client/src/common/components/myProgressBar/MyProgressBar.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.progress,
.progressCountdown {
diff --git a/client/src/common/components/nav/NavLogo.module.scss b/client/src/common/components/nav/NavLogo.module.scss
index 67ecabd7c..680a1dff0 100644
--- a/client/src/common/components/nav/NavLogo.module.scss
+++ b/client/src/common/components/nav/NavLogo.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.navContainer {
position: absolute;
diff --git a/client/src/common/components/protectRoute/ProtectRoute.jsx b/client/src/common/components/protectRoute/ProtectRoute.jsx
index df6cfe1b3..9a91a5c94 100644
--- a/client/src/common/components/protectRoute/ProtectRoute.jsx
+++ b/client/src/common/components/protectRoute/ProtectRoute.jsx
@@ -4,7 +4,7 @@ import { HStack, PinInput, PinInputField } from '@chakra-ui/react';
import { FiCheck } from '@react-icons/all-files/fi/FiCheck';
import PropTypes from 'prop-types';
-import { AppContext } from '../../../app/context/AppContext';
+import { AppContext } from '../../context/AppContext';
import style from './ProtectRoute.module.scss';
diff --git a/client/src/common/components/protectRoute/ProtectRoute.module.scss b/client/src/common/components/protectRoute/ProtectRoute.module.scss
index 729a20bb2..ba417abd8 100644
--- a/client/src/common/components/protectRoute/ProtectRoute.module.scss
+++ b/client/src/common/components/protectRoute/ProtectRoute.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/mixins' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/mixins' as *;
.container {
background: $bg-black;
diff --git a/client/src/common/state/Empty.jsx b/client/src/common/components/state/Empty.jsx
similarity index 100%
rename from client/src/common/state/Empty.jsx
rename to client/src/common/components/state/Empty.jsx
diff --git a/client/src/common/state/Empty.module.scss b/client/src/common/components/state/Empty.module.scss
similarity index 90%
rename from client/src/common/state/Empty.module.scss
rename to client/src/common/components/state/Empty.module.scss
index dec63be38..95ad20e56 100644
--- a/client/src/common/state/Empty.module.scss
+++ b/client/src/common/components/state/Empty.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../../theme/main' as *;
.emptyContainer {
width: 100%;
diff --git a/client/src/common/components/views/Paginator.jsx b/client/src/common/components/views/Paginator.jsx
index 4f6350412..0642e2a29 100644
--- a/client/src/common/components/views/Paginator.jsx
+++ b/client/src/common/components/views/Paginator.jsx
@@ -1,8 +1,8 @@
import React, { useEffect, useState } from 'react';
-import { useInterval } from 'app/hooks/useInterval';
+import { useInterval } from 'common/hooks/useInterval';
import PropTypes from 'prop-types';
-import Empty from '../../state/Empty';
+import Empty from '../state/Empty';
import TodayItem from './TodayItem';
diff --git a/client/src/common/components/views/Paginator.module.scss b/client/src/common/components/views/Paginator.module.scss
index 5e155ced8..9f75b5672 100644
--- a/client/src/common/components/views/Paginator.module.scss
+++ b/client/src/common/components/views/Paginator.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.entries {
width: 100%;
diff --git a/client/src/common/components/views/TitleCard.module.scss b/client/src/common/components/views/TitleCard.module.scss
index c596eef1a..3dbc6e430 100644
--- a/client/src/common/components/views/TitleCard.module.scss
+++ b/client/src/common/components/views/TitleCard.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.label {
@include card-label;
diff --git a/client/src/common/components/views/TitleSide.module.scss b/client/src/common/components/views/TitleSide.module.scss
index 08a253b7f..292fe9ad6 100644
--- a/client/src/common/components/views/TitleSide.module.scss
+++ b/client/src/common/components/views/TitleSide.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.label {
@include card-label;
diff --git a/client/src/app/context/AppContext.jsx b/client/src/common/context/AppContext.jsx
similarity index 100%
rename from client/src/app/context/AppContext.jsx
rename to client/src/common/context/AppContext.jsx
diff --git a/client/src/app/context/CollapseContext.jsx b/client/src/common/context/CollapseContext.jsx
similarity index 100%
rename from client/src/app/context/CollapseContext.jsx
rename to client/src/common/context/CollapseContext.jsx
diff --git a/client/src/app/context/CursorContext.jsx b/client/src/common/context/CursorContext.jsx
similarity index 100%
rename from client/src/app/context/CursorContext.jsx
rename to client/src/common/context/CursorContext.jsx
diff --git a/client/src/app/context/LocalEventSettingsContext.jsx b/client/src/common/context/LocalEventSettingsContext.jsx
similarity index 100%
rename from client/src/app/context/LocalEventSettingsContext.jsx
rename to client/src/common/context/LocalEventSettingsContext.jsx
diff --git a/client/src/app/context/LoggingContext.jsx b/client/src/common/context/LoggingContext.jsx
similarity index 94%
rename from client/src/app/context/LoggingContext.jsx
rename to client/src/common/context/LoggingContext.jsx
index 24f8cfe52..1a9b9cd7a 100644
--- a/client/src/app/context/LoggingContext.jsx
+++ b/client/src/common/context/LoggingContext.jsx
@@ -1,7 +1,7 @@
import React, { createContext, useCallback, useEffect, useState } from 'react';
-import { generateId } from '../../common/utils/generate_id';
-import { nowInMillis, stringFromMillis } from '../../common/utils/time';
+import { generateId } from '../utils/generate_id';
+import { nowInMillis, stringFromMillis } from '../utils/time';
import { useSocket } from './socketContext';
diff --git a/client/src/app/context/TableSettingsContext.jsx b/client/src/common/context/TableSettingsContext.jsx
similarity index 100%
rename from client/src/app/context/TableSettingsContext.jsx
rename to client/src/common/context/TableSettingsContext.jsx
diff --git a/client/src/app/context/socketContext.jsx b/client/src/common/context/socketContext.jsx
similarity index 91%
rename from client/src/app/context/socketContext.jsx
rename to client/src/common/context/socketContext.jsx
index 625521426..080ed2333 100644
--- a/client/src/app/context/socketContext.jsx
+++ b/client/src/common/context/socketContext.jsx
@@ -1,5 +1,5 @@
import React, { createContext, useContext, useEffect, useState } from 'react';
-import { serverURL } from 'app/api/apiConstants';
+import { serverURL } from 'common/api/apiConstants';
import io from 'socket.io-client';
const SocketContext = createContext([[], () => {}]);
diff --git a/client/src/app/hooks/useFetch.js b/client/src/common/hooks/useFetch.js
similarity index 100%
rename from client/src/app/hooks/useFetch.js
rename to client/src/common/hooks/useFetch.js
diff --git a/client/src/app/hooks/useInterval.js b/client/src/common/hooks/useInterval.js
similarity index 100%
rename from client/src/app/hooks/useInterval.js
rename to client/src/common/hooks/useInterval.js
diff --git a/client/src/app/hooks/useLocalStorage.js b/client/src/common/hooks/useLocalStorage.js
similarity index 100%
rename from client/src/app/hooks/useLocalStorage.js
rename to client/src/common/hooks/useLocalStorage.js
diff --git a/client/src/app/hooks/useMutateEvents.js b/client/src/common/hooks/useMutateEvents.js
similarity index 100%
rename from client/src/app/hooks/useMutateEvents.js
rename to client/src/common/hooks/useMutateEvents.js
diff --git a/client/src/app/utils/__tests__/aliases.test.js b/client/src/common/utils/__tests__/aliases.test.js
similarity index 100%
rename from client/src/app/utils/__tests__/aliases.test.js
rename to client/src/common/utils/__tests__/aliases.test.js
diff --git a/client/src/app/utils/__tests__/math.test.js b/client/src/common/utils/__tests__/math.test.js
similarity index 100%
rename from client/src/app/utils/__tests__/math.test.js
rename to client/src/common/utils/__tests__/math.test.js
diff --git a/client/src/app/utils/aliases.js b/client/src/common/utils/aliases.js
similarity index 100%
rename from client/src/app/utils/aliases.js
rename to client/src/common/utils/aliases.js
diff --git a/client/src/app/entryValidator.js b/client/src/common/utils/entryValidator.js
similarity index 100%
rename from client/src/app/entryValidator.js
rename to client/src/common/utils/entryValidator.js
diff --git a/client/src/app/utils/math.js b/client/src/common/utils/math.js
similarity index 100%
rename from client/src/app/utils/math.js
rename to client/src/common/utils/math.js
diff --git a/client/src/features/FeatureWrapper.module.scss b/client/src/features/FeatureWrapper.module.scss
index bfb658a8e..57f5f5639 100644
--- a/client/src/features/FeatureWrapper.module.scss
+++ b/client/src/features/FeatureWrapper.module.scss
@@ -1,4 +1,4 @@
-@use '../styles/main' as *;
+@use '../theme/main' as *;
.wrapper {
background: $bg-black;
diff --git a/client/src/features/control/__tests__/MessageControl.test.js b/client/src/features/control/__tests__/MessageControl.test.js
index 4e1e888e4..f04c9ed23 100644
--- a/client/src/features/control/__tests__/MessageControl.test.js
+++ b/client/src/features/control/__tests__/MessageControl.test.js
@@ -1,6 +1,6 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
-import SocketProvider from 'app/context/socketContext';
+import SocketProvider from 'common/context/socketContext';
import MessageControl from '../message/MessageControl';
diff --git a/client/src/features/control/__tests__/PlaybackControl.test.js b/client/src/features/control/__tests__/PlaybackControl.test.js
index 7c67a3b28..efa064528 100644
--- a/client/src/features/control/__tests__/PlaybackControl.test.js
+++ b/client/src/features/control/__tests__/PlaybackControl.test.js
@@ -1,6 +1,6 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
-import SocketProvider from 'app/context/socketContext';
+import SocketProvider from 'common/context/socketContext';
import PlaybackControl from '../playback/PlaybackControl';
diff --git a/client/src/features/control/message/MessageControl.jsx b/client/src/features/control/message/MessageControl.jsx
index 9824a0a17..c3fdb79a1 100644
--- a/client/src/features/control/message/MessageControl.jsx
+++ b/client/src/features/control/message/MessageControl.jsx
@@ -3,7 +3,7 @@ import { IconButton } from '@chakra-ui/button';
import { Tooltip } from '@chakra-ui/tooltip';
import { IoMicOffOutline } from '@react-icons/all-files/io5/IoMicOffOutline';
import { IoMicSharp } from '@react-icons/all-files/io5/IoMicSharp';
-import { useSocket } from 'app/context/socketContext';
+import { useSocket } from 'common/context/socketContext';
import InputRow from './InputRow';
diff --git a/client/src/features/control/message/MessageControl.module.scss b/client/src/features/control/message/MessageControl.module.scss
index c35cad3fd..72dd03a65 100644
--- a/client/src/features/control/message/MessageControl.module.scss
+++ b/client/src/features/control/message/MessageControl.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/mixins' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/mixins' as *;
.messageContainer,
.onAirToggle {
diff --git a/client/src/features/control/playback/PlaybackControl.jsx b/client/src/features/control/playback/PlaybackControl.jsx
index 173387b9b..1e36b50ee 100644
--- a/client/src/features/control/playback/PlaybackControl.jsx
+++ b/client/src/features/control/playback/PlaybackControl.jsx
@@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useState } from 'react';
-import { useSocket } from 'app/context/socketContext';
+import { useSocket } from 'common/context/socketContext';
import PlaybackButtons from './PlaybackButtons';
import PlaybackTimer from './PlaybackTimer';
diff --git a/client/src/features/control/playback/PlaybackControl.module.scss b/client/src/features/control/playback/PlaybackControl.module.scss
index 0a1a532af..9807d7aa0 100644
--- a/client/src/features/control/playback/PlaybackControl.module.scss
+++ b/client/src/features/control/playback/PlaybackControl.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/mixins' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/mixins' as *;
.mainContainer {
width: 100%;
diff --git a/client/src/features/editors/BlockBlock/BlockBlock.module.scss b/client/src/features/editors/BlockBlock/BlockBlock.module.scss
index 7caab45db..ba0edfe51 100644
--- a/client/src/features/editors/BlockBlock/BlockBlock.module.scss
+++ b/client/src/features/editors/BlockBlock/BlockBlock.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
/* ============= COMMON ============= */
.block {
diff --git a/client/src/features/editors/DelayBlock/DelayBlock.jsx b/client/src/features/editors/DelayBlock/DelayBlock.jsx
index 1d985af71..70f5e41df 100644
--- a/client/src/features/editors/DelayBlock/DelayBlock.jsx
+++ b/client/src/features/editors/DelayBlock/DelayBlock.jsx
@@ -4,7 +4,7 @@ import { HStack } from '@chakra-ui/react';
import { FiCheck } from '@react-icons/all-files/fi/FiCheck';
import { FiMoreVertical } from '@react-icons/all-files/fi/FiMoreVertical';
import { IoRemove } from '@react-icons/all-files/io5/IoRemove';
-import DelayInput from 'common/input/DelayInput';
+import DelayInput from 'common/components/input/DelayInput';
import { millisToMinutes } from 'common/utils/dateConfig';
import PropTypes from 'prop-types';
diff --git a/client/src/features/editors/DelayBlock/DelayBlock.module.scss b/client/src/features/editors/DelayBlock/DelayBlock.module.scss
index 1b5dfc65c..a58dc103d 100644
--- a/client/src/features/editors/DelayBlock/DelayBlock.module.scss
+++ b/client/src/features/editors/DelayBlock/DelayBlock.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
/* ============= COMMON ============= */
diff --git a/client/src/features/editors/Editor.jsx b/client/src/features/editors/Editor.jsx
index 4845a79bf..6310a859b 100644
--- a/client/src/features/editors/Editor.jsx
+++ b/client/src/features/editors/Editor.jsx
@@ -4,8 +4,8 @@ import { Box } from '@chakra-ui/layout';
import ErrorBoundary from 'common/components/errorBoundary/ErrorBoundary';
import ModalManager from 'features/modals/ModalManager';
-import { LocalEventSettingsProvider } from '../../app/context/LocalEventSettingsContext';
-import { LoggingProvider } from '../../app/context/LoggingContext';
+import { LocalEventSettingsProvider } from '../../common/context/LocalEventSettingsContext';
+import { LoggingProvider } from '../../common/context/LoggingContext';
import MenuBar from '../menu/MenuBar';
import styles from './Editor.module.scss';
diff --git a/client/src/features/editors/Editor.module.scss b/client/src/features/editors/Editor.module.scss
index 8ee05e3ad..a20d7731e 100644
--- a/client/src/features/editors/Editor.module.scss
+++ b/client/src/features/editors/Editor.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../theme/main' as *;
.corner {
display: none;
diff --git a/client/src/features/editors/EntryBlock/EntryBlock.jsx b/client/src/features/editors/EntryBlock/EntryBlock.jsx
index 4c88670ae..d0018f39a 100644
--- a/client/src/features/editors/EntryBlock/EntryBlock.jsx
+++ b/client/src/features/editors/EntryBlock/EntryBlock.jsx
@@ -3,7 +3,7 @@ import { Checkbox } from '@chakra-ui/react';
import { Tooltip } from '@chakra-ui/tooltip';
import PropTypes from 'prop-types';
-import { LocalEventSettingsContext } from '../../../app/context/LocalEventSettingsContext';
+import { LocalEventSettingsContext } from '../../../common/context/LocalEventSettingsContext';
import style from './EntryBlock.module.scss';
diff --git a/client/src/features/editors/EntryBlock/EntryBlock.module.scss b/client/src/features/editors/EntryBlock/EntryBlock.module.scss
index 632e86ba3..903950bcb 100644
--- a/client/src/features/editors/EntryBlock/EntryBlock.module.scss
+++ b/client/src/features/editors/EntryBlock/EntryBlock.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
@mixin when-visible() {
opacity: 1;
diff --git a/client/src/features/editors/EventBlock/CollapsedBlock.jsx b/client/src/features/editors/EventBlock/CollapsedBlock.jsx
index 3f8fe05b8..d03aebd04 100644
--- a/client/src/features/editors/EventBlock/CollapsedBlock.jsx
+++ b/client/src/features/editors/EventBlock/CollapsedBlock.jsx
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
import ActionButtons from '../../../common/components/buttons/ActionButtons';
import PublicIconBtn from '../../../common/components/buttons/PublicIconBtn';
import EventTimes from '../../../common/components/eventTimes/EventTimes';
-import EditableText from '../../../common/input/EditableText';
+import EditableText from '../../../common/components/input/EditableText';
import style from './EventBlock.module.scss';
diff --git a/client/src/features/editors/EventBlock/EventBlock.jsx b/client/src/features/editors/EventBlock/EventBlock.jsx
index cf064f7a5..245c68d31 100644
--- a/client/src/features/editors/EventBlock/EventBlock.jsx
+++ b/client/src/features/editors/EventBlock/EventBlock.jsx
@@ -5,7 +5,7 @@ import { FiChevronUp } from '@react-icons/all-files/fi/FiChevronUp';
import { millisToMinutes } from 'common/utils/dateConfig';
import PropTypes from 'prop-types';
-import { CollapseContext } from '../../../app/context/CollapseContext';
+import { CollapseContext } from '../../../common/context/CollapseContext';
import CollapsedBlock from './CollapsedBlock';
import ExpandedBlock from './ExpandedBlock';
diff --git a/client/src/features/editors/EventBlock/EventBlock.module.scss b/client/src/features/editors/EventBlock/EventBlock.module.scss
index 65c381c01..8a5c8bf69 100644
--- a/client/src/features/editors/EventBlock/EventBlock.module.scss
+++ b/client/src/features/editors/EventBlock/EventBlock.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
/* ============= COMMON ============= */
.event {
diff --git a/client/src/features/editors/EventBlock/ExpandedBlock.jsx b/client/src/features/editors/EventBlock/ExpandedBlock.jsx
index 199c51cf5..80cf5c6e5 100644
--- a/client/src/features/editors/EventBlock/ExpandedBlock.jsx
+++ b/client/src/features/editors/EventBlock/ExpandedBlock.jsx
@@ -8,7 +8,7 @@ import ActionButtons from '../../../common/components/buttons/ActionButtons';
import PublicIconBtn from '../../../common/components/buttons/PublicIconBtn';
import TooltipLoadingActionBtn from '../../../common/components/buttons/TooltipLoadingActionBtn';
import EventTimesVertical from '../../../common/components/eventTimes/EventTimesVertical';
-import EditableText from '../../../common/input/EditableText';
+import EditableText from '../../../common/components/input/EditableText';
import style from './EventBlock.module.scss';
diff --git a/client/src/features/editors/list/EventList.jsx b/client/src/features/editors/list/EventList.jsx
index 8a7da8518..4a99d5a4b 100644
--- a/client/src/features/editors/list/EventList.jsx
+++ b/client/src/features/editors/list/EventList.jsx
@@ -1,10 +1,10 @@
import React, { createRef, useCallback, useContext, useEffect, useState } from 'react';
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
-import { useSocket } from 'app/context/socketContext';
-import Empty from 'common/state/Empty';
+import Empty from 'common/components/state/Empty';
+import { useSocket } from 'common/context/socketContext';
-import { CursorContext } from '../../../app/context/CursorContext';
-import { LocalEventSettingsContext } from '../../../app/context/LocalEventSettingsContext';
+import { CursorContext } from '../../../common/context/CursorContext';
+import { LocalEventSettingsContext } from '../../../common/context/LocalEventSettingsContext';
import EntryBlock from '../EntryBlock/EntryBlock';
import EventListItem from './EventListItem';
diff --git a/client/src/features/editors/list/EventListExport.jsx b/client/src/features/editors/list/EventListExport.jsx
index bf98b2277..fad9d788a 100644
--- a/client/src/features/editors/list/EventListExport.jsx
+++ b/client/src/features/editors/list/EventListExport.jsx
@@ -2,9 +2,9 @@ import React from 'react';
import { Box } from '@chakra-ui/layout';
import { FiArrowUpRight } from '@react-icons/all-files/fi/FiArrowUpRight';
-import { CollapseProvider } from '../../../app/context/CollapseContext';
-import { CursorProvider } from '../../../app/context/CursorContext';
import ErrorBoundary from '../../../common/components/errorBoundary/ErrorBoundary';
+import { CollapseProvider } from '../../../common/context/CollapseContext';
+import { CursorProvider } from '../../../common/context/CursorContext';
import { handleLinks } from '../../../common/utils/linkUtils';
import EventListWrapper from './EventListWrapper';
diff --git a/client/src/features/editors/list/EventListItem.jsx b/client/src/features/editors/list/EventListItem.jsx
index f9a10bb4b..5349b9434 100644
--- a/client/src/features/editors/list/EventListItem.jsx
+++ b/client/src/features/editors/list/EventListItem.jsx
@@ -1,8 +1,8 @@
import React, { memo, useCallback, useContext } from 'react';
import PropTypes from 'prop-types';
-import { LocalEventSettingsContext } from '../../../app/context/LocalEventSettingsContext';
-import { LoggingContext } from '../../../app/context/LoggingContext';
+import { LocalEventSettingsContext } from '../../../common/context/LocalEventSettingsContext';
+import { LoggingContext } from '../../../common/context/LoggingContext';
import BlockBlock from '../BlockBlock/BlockBlock';
import DelayBlock from '../DelayBlock/DelayBlock';
import EventBlock from '../EventBlock/EventBlock';
diff --git a/client/src/features/editors/list/EventListWrapper.jsx b/client/src/features/editors/list/EventListWrapper.jsx
index 53b6b4904..c14559df9 100644
--- a/client/src/features/editors/list/EventListWrapper.jsx
+++ b/client/src/features/editors/list/EventListWrapper.jsx
@@ -1,6 +1,6 @@
import React, { useCallback, useContext, useEffect, useState } from 'react';
import { useMutation, useQueryClient } from 'react-query';
-import { EVENTS_TABLE } from 'app/api/apiConstants';
+import { EVENTS_TABLE } from 'common/api/apiConstants';
import {
fetchAllEvents,
requestApplyDelay,
@@ -10,13 +10,13 @@ import {
requestPost,
requestPut,
requestReorder,
-} from 'app/api/eventsApi.js';
-import { useFetch } from 'app/hooks/useFetch.js';
-import Empty from 'common/state/Empty';
+} from 'common/api/eventsApi.js';
+import Empty from 'common/components/state/Empty';
+import { useFetch } from 'common/hooks/useFetch.js';
import EventListMenu from 'features/menu/EventListMenu.jsx';
-import { CollapseContext } from '../../../app/context/CollapseContext';
-import { LoggingContext } from '../../../app/context/LoggingContext';
+import { CollapseContext } from '../../../common/context/CollapseContext';
+import { LoggingContext } from '../../../common/context/LoggingContext';
import EventList from './EventList';
diff --git a/client/src/features/editors/list/List.module.scss b/client/src/features/editors/list/List.module.scss
index 852c2ae7e..8aa563958 100644
--- a/client/src/features/editors/list/List.module.scss
+++ b/client/src/features/editors/list/List.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/mixins' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/mixins' as *;
.eventContainer {
@include second-container;
diff --git a/client/src/features/info/Info.jsx b/client/src/features/info/Info.jsx
index be0f3e5c6..6d947a574 100644
--- a/client/src/features/info/Info.jsx
+++ b/client/src/features/info/Info.jsx
@@ -1,5 +1,5 @@
import React, { useEffect,useState } from 'react';
-import { useSocket } from 'app/context/socketContext';
+import { useSocket } from 'common/context/socketContext';
import InfoLogger from './InfoLogger';
import InfoNif from './InfoNif';
diff --git a/client/src/features/info/Info.module.scss b/client/src/features/info/Info.module.scss
index 6999c20dc..fe1634c09 100644
--- a/client/src/features/info/Info.module.scss
+++ b/client/src/features/info/Info.module.scss
@@ -1,5 +1,5 @@
-@use '../../styles/main' as *;
-@use '../../styles/mixins' as *;
+@use '../../theme/main' as *;
+@use '../../theme/mixins' as *;
@mixin container {
margin-top: 1em;
diff --git a/client/src/features/info/InfoLogger.jsx b/client/src/features/info/InfoLogger.jsx
index d276857fa..8145d71de 100644
--- a/client/src/features/info/InfoLogger.jsx
+++ b/client/src/features/info/InfoLogger.jsx
@@ -1,7 +1,7 @@
import React, { useCallback, useContext, useEffect, useState } from 'react';
-import { LoggingContext } from '../../app/context/LoggingContext';
import CollapseBar from '../../common/components/collapseBar/CollapseBar';
+import { LoggingContext } from '../../common/context/LoggingContext';
import style from './InfoLogger.module.scss';
diff --git a/client/src/features/info/InfoLogger.module.scss b/client/src/features/info/InfoLogger.module.scss
index d9fb40961..40983fd5a 100644
--- a/client/src/features/info/InfoLogger.module.scss
+++ b/client/src/features/info/InfoLogger.module.scss
@@ -1,6 +1,6 @@
@use 'Info.module' as *;
-@use '../../styles/main' as *;
-@use '../../styles/mixins' as *;
+@use '../../theme/main' as *;
+@use '../../theme/mixins' as *;
.container,
.container__expanded{
diff --git a/client/src/features/info/InfoNif.jsx b/client/src/features/info/InfoNif.jsx
index 56d45d7fa..60e2c1264 100644
--- a/client/src/features/info/InfoNif.jsx
+++ b/client/src/features/info/InfoNif.jsx
@@ -1,7 +1,7 @@
import React, { useState } from 'react';
-import { APP_TABLE } from 'app/api/apiConstants';
-import { getInfo, ontimePlaceholderInfo } from 'app/api/ontimeApi';
-import { useFetch } from 'app/hooks/useFetch';
+import { APP_TABLE } from 'common/api/apiConstants';
+import { getInfo, ontimePlaceholderInfo } from 'common/api/ontimeApi';
+import { useFetch } from 'common/hooks/useFetch';
import CollapseBar from '../../common/components/collapseBar/CollapseBar';
import { openLink } from '../../common/utils/linkUtils';
diff --git a/client/src/features/info/__tests__/Info.test.js b/client/src/features/info/__tests__/Info.test.js
index 84f28f532..4bfae6d52 100644
--- a/client/src/features/info/__tests__/Info.test.js
+++ b/client/src/features/info/__tests__/Info.test.js
@@ -1,7 +1,7 @@
import React from 'react';
import { QueryClient, QueryClientProvider } from 'react-query';
import { render, screen } from '@testing-library/react';
-import SocketProvider from 'app/context/socketContext';
+import SocketProvider from 'common/context/socketContext';
import Info from '../Info';
diff --git a/client/src/features/menu/EventListMenu.jsx b/client/src/features/menu/EventListMenu.jsx
index 7320f3382..5e0cc7eca 100644
--- a/client/src/features/menu/EventListMenu.jsx
+++ b/client/src/features/menu/EventListMenu.jsx
@@ -7,8 +7,8 @@ import { IoCaretDown } from '@react-icons/all-files/io5/IoCaretDown';
import { IoCaretUp } from '@react-icons/all-files/io5/IoCaretUp';
import PropTypes from 'prop-types';
-import { CursorContext } from '../../app/context/CursorContext';
import TooltipActionBtn from '../../common/components/buttons/TooltipActionBtn';
+import { CursorContext } from '../../common/context/CursorContext';
import MenuActionButtons from './MenuActionButtons';
diff --git a/client/src/features/menu/MenuBar.jsx b/client/src/features/menu/MenuBar.jsx
index 53954a229..feb859aff 100644
--- a/client/src/features/menu/MenuBar.jsx
+++ b/client/src/features/menu/MenuBar.jsx
@@ -7,13 +7,13 @@ import { FiMaximize } from '@react-icons/all-files/fi/FiMaximize';
import { FiMinimize } from '@react-icons/all-files/fi/FiMinimize';
import { FiSettings } from '@react-icons/all-files/fi/FiSettings';
import { FiUpload } from '@react-icons/all-files/fi/FiUpload';
-import { EVENTS_TABLE } from 'app/api/apiConstants';
-import { downloadEvents, uploadEvents } from 'app/api/ontimeApi';
+import { EVENTS_TABLE } from 'common/api/apiConstants';
+import { downloadEvents, uploadEvents } from 'common/api/ontimeApi';
import PropTypes from 'prop-types';
-import { LoggingContext } from '../../app/context/LoggingContext';
import QuitIconBtn from '../../common/components/buttons/QuitIconBtn';
import TooltipActionBtn from '../../common/components/buttons/TooltipActionBtn';
+import { LoggingContext } from '../../common/context/LoggingContext';
import style from './MenuBar.module.scss';
diff --git a/client/src/features/menu/MenuBar.module.scss b/client/src/features/menu/MenuBar.module.scss
index a11bf57e7..19139e7ff 100644
--- a/client/src/features/menu/MenuBar.module.scss
+++ b/client/src/features/menu/MenuBar.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../theme/main' as *;
.gap {
height: 1em;
diff --git a/client/src/features/modals/AliasesModal.jsx b/client/src/features/modals/AliasesModal.jsx
index b27983713..c6134cb39 100644
--- a/client/src/features/modals/AliasesModal.jsx
+++ b/client/src/features/modals/AliasesModal.jsx
@@ -7,13 +7,13 @@ import { Tooltip } from '@chakra-ui/tooltip';
import { IoInformationCircleOutline } from '@react-icons/all-files/io5/IoInformationCircleOutline';
import { IoRemove } from '@react-icons/all-files/io5/IoRemove';
import { IoSunny } from '@react-icons/all-files/io5/IoSunny';
-import { ALIASES } from 'app/api/apiConstants';
-import { useFetch } from 'app/hooks/useFetch';
+import { ALIASES } from 'common/api/apiConstants';
+import { useFetch } from 'common/hooks/useFetch';
-import { getAliases, postAliases } from '../../app/api/ontimeApi';
-import { viewerLocations } from '../../app/appConstants';
-import { LoggingContext } from '../../app/context/LoggingContext';
-import { validateAlias } from '../../app/utils/aliases';
+import { viewerLocations } from '../../appConstants';
+import { getAliases, postAliases } from '../../common/api/ontimeApi';
+import { LoggingContext } from '../../common/context/LoggingContext';
+import { validateAlias } from '../../common/utils/aliases';
import { handleLinks, host } from '../../common/utils/linkUtils';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/modals/AppSettingsModal.jsx b/client/src/features/modals/AppSettingsModal.jsx
index 0d96a6182..57d137a30 100644
--- a/client/src/features/modals/AppSettingsModal.jsx
+++ b/client/src/features/modals/AppSettingsModal.jsx
@@ -4,13 +4,13 @@ import { ModalBody } from '@chakra-ui/modal';
import { Checkbox, FormControl, FormLabel, Input, PinInput, PinInputField } from '@chakra-ui/react';
import { FiEye } from '@react-icons/all-files/fi/FiEye';
import { FiX } from '@react-icons/all-files/fi/FiX';
-import { APP_SETTINGS } from 'app/api/apiConstants';
-import { getSettings, ontimePlaceholderSettings, postSettings } from 'app/api/ontimeApi';
-import { useFetch } from 'app/hooks/useFetch';
+import { APP_SETTINGS } from 'common/api/apiConstants';
+import { getSettings, ontimePlaceholderSettings, postSettings } from 'common/api/ontimeApi';
+import { useFetch } from 'common/hooks/useFetch';
-import { LocalEventSettingsContext } from '../../app/context/LocalEventSettingsContext';
-import { LoggingContext } from '../../app/context/LoggingContext';
import TooltipActionBtn from '../../common/components/buttons/TooltipActionBtn';
+import { LocalEventSettingsContext } from '../../common/context/LocalEventSettingsContext';
+import { LoggingContext } from '../../common/context/LoggingContext';
import { inputProps } from './modalHelper';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/modals/EventSettingsModal.jsx b/client/src/features/modals/EventSettingsModal.jsx
index 0bee6a7c8..ae8f9130e 100644
--- a/client/src/features/modals/EventSettingsModal.jsx
+++ b/client/src/features/modals/EventSettingsModal.jsx
@@ -1,11 +1,11 @@
import React, { useCallback, useEffect, useState } from 'react';
import { ModalBody } from '@chakra-ui/modal';
import { FormLabel, Input, Textarea } from '@chakra-ui/react';
-import { EVENT_TABLE } from 'app/api/apiConstants';
-import { fetchEvent, postEvent } from 'app/api/eventApi';
-import { useFetch } from 'app/hooks/useFetch';
+import { EVENT_TABLE } from 'common/api/apiConstants';
+import { fetchEvent, postEvent } from 'common/api/eventApi';
+import { useFetch } from 'common/hooks/useFetch';
-import { eventPlaceholderSettings } from '../../app/api/ontimeApi';
+import { eventPlaceholderSettings } from '../../common/api/ontimeApi';
import { inputProps } from './modalHelper';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/modals/IntegrationSettingsModal.jsx b/client/src/features/modals/IntegrationSettingsModal.jsx
index b246652de..5db92a445 100644
--- a/client/src/features/modals/IntegrationSettingsModal.jsx
+++ b/client/src/features/modals/IntegrationSettingsModal.jsx
@@ -2,11 +2,11 @@ import React, { useCallback, useContext, useEffect, useState } from 'react';
import { ModalBody } from '@chakra-ui/modal';
import { FormControl, FormLabel, Input, Switch } from '@chakra-ui/react';
import { FiInfo } from '@react-icons/all-files/fi/FiInfo';
-import { APP_TABLE } from 'app/api/apiConstants';
-import { getInfo, httpPlaceholder, ontimeVars, postInfo } from 'app/api/ontimeApi';
-import { useFetch } from 'app/hooks/useFetch';
+import { APP_TABLE } from 'common/api/apiConstants';
+import { getInfo, httpPlaceholder, ontimeVars, postInfo } from 'common/api/ontimeApi';
+import { useFetch } from 'common/hooks/useFetch';
-import { LoggingContext } from '../../app/context/LoggingContext';
+import { LoggingContext } from '../../common/context/LoggingContext';
import { inputProps } from './modalHelper';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/modals/Modals.module.scss b/client/src/features/modals/Modals.module.scss
index a44c3b557..db09cb37f 100644
--- a/client/src/features/modals/Modals.module.scss
+++ b/client/src/features/modals/Modals.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../theme/main' as *;
//////////////////////////////////// main
diff --git a/client/src/features/modals/OscSettingsModal.jsx b/client/src/features/modals/OscSettingsModal.jsx
index 1e998bf3b..dcd082323 100644
--- a/client/src/features/modals/OscSettingsModal.jsx
+++ b/client/src/features/modals/OscSettingsModal.jsx
@@ -2,12 +2,12 @@ import React, { useCallback, useContext, useEffect, useState } from 'react';
import { ModalBody } from '@chakra-ui/modal';
import { FormControl, FormLabel, Input } from '@chakra-ui/react';
import { IoInformationCircleOutline } from '@react-icons/all-files/io5/IoInformationCircleOutline';
-import { OSC_SETTINGS } from 'app/api/apiConstants';
-import { getOSC, oscPlaceholderSettings, postOSC } from 'app/api/ontimeApi';
-import { useFetch } from 'app/hooks/useFetch';
+import { OSC_SETTINGS } from 'common/api/apiConstants';
+import { getOSC, oscPlaceholderSettings, postOSC } from 'common/api/ontimeApi';
+import { useFetch } from 'common/hooks/useFetch';
-import { LoggingContext } from '../../app/context/LoggingContext';
import EnableBtn from '../../common/components/buttons/EnableBtn';
+import { LoggingContext } from '../../common/context/LoggingContext';
import { inputProps, portInputProps } from './modalHelper';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/modals/TableOptionsModal.jsx b/client/src/features/modals/TableOptionsModal.jsx
index d4bb90dbc..3be1d61f2 100644
--- a/client/src/features/modals/TableOptionsModal.jsx
+++ b/client/src/features/modals/TableOptionsModal.jsx
@@ -2,10 +2,10 @@ import React, { useCallback, useEffect, useState } from 'react';
import { ModalBody } from '@chakra-ui/modal';
import { Input } from '@chakra-ui/react';
import { IoInformationCircleOutline } from '@react-icons/all-files/io5/IoInformationCircleOutline';
-import { USERFIELDS } from 'app/api/apiConstants';
-import { useFetch } from 'app/hooks/useFetch';
+import { USERFIELDS } from 'common/api/apiConstants';
+import { useFetch } from 'common/hooks/useFetch';
-import { getUserFields, postUserFields, userFieldsPlaceholder } from '../../app/api/ontimeApi';
+import { getUserFields, postUserFields, userFieldsPlaceholder } from '../../common/api/ontimeApi';
import { handleLinks, host } from '../../common/utils/linkUtils';
import SubmitContainer from './SubmitContainer';
diff --git a/client/src/features/table/OntimeTable.jsx b/client/src/features/table/OntimeTable.jsx
index c808b722f..5d1181abd 100644
--- a/client/src/features/table/OntimeTable.jsx
+++ b/client/src/features/table/OntimeTable.jsx
@@ -17,8 +17,8 @@ import {
} from '@dnd-kit/sortable';
import PropTypes from 'prop-types';
-import { TableSettingsContext } from '../../app/context/TableSettingsContext';
-import { useLocalStorage } from '../../app/hooks/useLocalStorage';
+import { TableSettingsContext } from '../../common/context/TableSettingsContext';
+import { useLocalStorage } from '../../common/hooks/useLocalStorage';
import SortableCell from './tableElements/SortableCell';
import TableSettings from './tableElements/TableSettings';
diff --git a/client/src/features/table/ProtectedTable.jsx b/client/src/features/table/ProtectedTable.jsx
index 77217382c..76724a738 100644
--- a/client/src/features/table/ProtectedTable.jsx
+++ b/client/src/features/table/ProtectedTable.jsx
@@ -1,7 +1,7 @@
import React from 'react';
-import { TableSettingsProvider } from '../../app/context/TableSettingsContext';
import ProtectRoute from '../../common/components/protectRoute/ProtectRoute';
+import { TableSettingsProvider } from '../../common/context/TableSettingsContext';
import TableWrapper from './TableWrapper';
diff --git a/client/src/features/table/Table.module.scss b/client/src/features/table/Table.module.scss
index 3848bc1be..25c2ecc3f 100644
--- a/client/src/features/table/Table.module.scss
+++ b/client/src/features/table/Table.module.scss
@@ -1,4 +1,4 @@
-@use '../../styles/main' as *;
+@use '../../theme/main' as *;
.tableWrapper,
.tableWrapper__dark {
diff --git a/client/src/features/table/TableHeader.jsx b/client/src/features/table/TableHeader.jsx
index d35d1db6c..4520cb2ec 100644
--- a/client/src/features/table/TableHeader.jsx
+++ b/client/src/features/table/TableHeader.jsx
@@ -4,11 +4,11 @@ import { FiSettings } from '@react-icons/all-files/fi/FiSettings';
import { FiTarget } from '@react-icons/all-files/fi/FiTarget';
import { IoMoon } from '@react-icons/all-files/io5/IoMoon';
-import { EVENT_TABLE } from '../../app/api/apiConstants';
-import { fetchEvent } from '../../app/api/eventApi';
-import { useSocket } from '../../app/context/socketContext';
-import { TableSettingsContext } from '../../app/context/TableSettingsContext';
-import { useFetch } from '../../app/hooks/useFetch';
+import { EVENT_TABLE } from '../../common/api/apiConstants';
+import { fetchEvent } from '../../common/api/eventApi';
+import { useSocket } from '../../common/context/socketContext';
+import { TableSettingsContext } from '../../common/context/TableSettingsContext';
+import { useFetch } from '../../common/hooks/useFetch';
import { formatDisplay } from '../../common/utils/dateConfig';
import { stringFromMillis } from '../../common/utils/time';
diff --git a/client/src/features/table/TableWrapper.jsx b/client/src/features/table/TableWrapper.jsx
index d2c0565f2..06a1902a0 100644
--- a/client/src/features/table/TableWrapper.jsx
+++ b/client/src/features/table/TableWrapper.jsx
@@ -1,12 +1,12 @@
import React, { useCallback, useContext, useEffect, useState } from 'react';
-import { EVENTS_TABLE, USERFIELDS } from '../../app/api/apiConstants';
-import { fetchAllEvents, requestPatch } from '../../app/api/eventsApi';
-import { getUserFields } from '../../app/api/ontimeApi';
-import { useSocket } from '../../app/context/socketContext';
-import { TableSettingsContext } from '../../app/context/TableSettingsContext';
-import { useFetch } from '../../app/hooks/useFetch';
-import useMutateEvents from '../../app/hooks/useMutateEvents';
+import { EVENTS_TABLE, USERFIELDS } from '../../common/api/apiConstants';
+import { fetchAllEvents, requestPatch } from '../../common/api/eventsApi';
+import { getUserFields } from '../../common/api/ontimeApi';
+import { useSocket } from '../../common/context/socketContext';
+import { TableSettingsContext } from '../../common/context/TableSettingsContext';
+import { useFetch } from '../../common/hooks/useFetch';
+import useMutateEvents from '../../common/hooks/useMutateEvents';
import OntimeTable from './OntimeTable';
import TableHeader from './TableHeader';
diff --git a/client/src/features/table/tableElements/EditableCell.jsx b/client/src/features/table/tableElements/EditableCell.jsx
index 757f6ee95..38b08d023 100644
--- a/client/src/features/table/tableElements/EditableCell.jsx
+++ b/client/src/features/table/tableElements/EditableCell.jsx
@@ -1,7 +1,7 @@
import React, { useCallback, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
-import { AutoTextArea } from '../../../common/input/AutoTextArea';
+import { AutoTextArea } from '../../../common/components/input/AutoTextArea';
/**
* Shamelessly copied from react-table docs
diff --git a/client/src/features/viewers/ViewWrapper.jsx b/client/src/features/viewers/ViewWrapper.jsx
index 71b8b656d..2af2cddf9 100644
--- a/client/src/features/viewers/ViewWrapper.jsx
+++ b/client/src/features/viewers/ViewWrapper.jsx
@@ -1,10 +1,10 @@
/* eslint-disable react/display-name */
import React, { useEffect, useState } from 'react';
-import { EVENT_TABLE, EVENTS_TABLE } from 'app/api/apiConstants';
-import { fetchEvent } from 'app/api/eventApi';
-import { fetchAllEvents } from 'app/api/eventsApi';
-import { useSocket } from 'app/context/socketContext';
-import { useFetch } from 'app/hooks/useFetch';
+import { EVENT_TABLE, EVENTS_TABLE } from 'common/api/apiConstants';
+import { fetchEvent } from 'common/api/eventApi';
+import { fetchAllEvents } from 'common/api/eventsApi';
+import { useSocket } from 'common/context/socketContext';
+import { useFetch } from 'common/hooks/useFetch';
import { stringFromMillis } from '../../common/utils/time';
diff --git a/client/src/features/viewers/backstage/StageManager.module.scss b/client/src/features/viewers/backstage/StageManager.module.scss
index 8bd053af4..2c86f9dc4 100644
--- a/client/src/features/viewers/backstage/StageManager.module.scss
+++ b/client/src/features/viewers/backstage/StageManager.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/viewers' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/viewers' as *;
.container__gray,
.container__grayFinished {
diff --git a/client/src/features/viewers/countdown/Countdown.jsx b/client/src/features/viewers/countdown/Countdown.jsx
index a7ea4d3a0..7fb997aa9 100644
--- a/client/src/features/viewers/countdown/Countdown.jsx
+++ b/client/src/features/viewers/countdown/Countdown.jsx
@@ -3,7 +3,7 @@ import { Link, useSearchParams } from 'react-router-dom';
import PropTypes from 'prop-types';
import NavLogo from '../../../common/components/nav/NavLogo';
-import Empty from '../../../common/state/Empty';
+import Empty from '../../../common/components/state/Empty';
import { formatDisplay, millisToSeconds } from '../../../common/utils/dateConfig';
import getDelayTo from '../../../common/utils/getDelayTo';
import { stringFromMillis } from '../../../common/utils/time';
diff --git a/client/src/features/viewers/countdown/Countdown.module.scss b/client/src/features/viewers/countdown/Countdown.module.scss
index 834c3156d..94e478a7f 100644
--- a/client/src/features/viewers/countdown/Countdown.module.scss
+++ b/client/src/features/viewers/countdown/Countdown.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.container {
margin: 0;
diff --git a/client/src/features/viewers/foh/Public.module.scss b/client/src/features/viewers/foh/Public.module.scss
index 104a3f5a0..8c7e8b79a 100644
--- a/client/src/features/viewers/foh/Public.module.scss
+++ b/client/src/features/viewers/foh/Public.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/viewers' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/viewers' as *;
.container__gray,
.container__grayFinished {
diff --git a/client/src/features/viewers/production/Pip.module.scss b/client/src/features/viewers/production/Pip.module.scss
index d42657986..f219ce49d 100644
--- a/client/src/features/viewers/production/Pip.module.scss
+++ b/client/src/features/viewers/production/Pip.module.scss
@@ -1,5 +1,5 @@
-@use '../../../styles/main' as *;
-@use '../../../styles/viewers' as *;
+@use '../../../theme/main' as *;
+@use '../../../theme/viewers' as *;
.container__gray,
.container__grayFinished {
diff --git a/client/src/features/viewers/timer/MinimalTimer.module.scss b/client/src/features/viewers/timer/MinimalTimer.module.scss
index f06f0248b..1ad79ccb2 100644
--- a/client/src/features/viewers/timer/MinimalTimer.module.scss
+++ b/client/src/features/viewers/timer/MinimalTimer.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.container,
.containerFinished {
diff --git a/client/src/features/viewers/timer/Timer.module.scss b/client/src/features/viewers/timer/Timer.module.scss
index ba23ae2f5..fae72a32b 100644
--- a/client/src/features/viewers/timer/Timer.module.scss
+++ b/client/src/features/viewers/timer/Timer.module.scss
@@ -1,4 +1,4 @@
-@use '../../../styles/main' as *;
+@use '../../../theme/main' as *;
.container__gray,
.container__grayFinished {
diff --git a/client/src/index.js b/client/src/index.js
deleted file mode 100644
index 745580476..000000000
--- a/client/src/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import { createRoot } from 'react-dom/client';
-import { QueryClient, QueryClientProvider } from 'react-query';
-import { BrowserRouter } from 'react-router-dom';
-import { ChakraProvider } from '@chakra-ui/react';
-
-import { AppContextProvider } from './app/context/AppContext';
-import SocketProvider from './app/context/socketContext';
-import theme from './theme/theme';
-import App from './App';
-import reportWebVitals from './reportWebVitals';
-
-import './index.scss';
-
-// Load Open Sans typeface
-require('typeface-open-sans');
-const queryClient = new QueryClient();
-
-const container = document.getElementById('root');
-// create a root
-const root = createRoot(container);
-
-root.render(
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// If you want to start measuring performance in your app, pass a function
-// to log results (for example: reportWebVitals(console.log))
-// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
-reportWebVitals();
diff --git a/client/src/index.jsx b/client/src/index.jsx
new file mode 100644
index 000000000..dad35fe20
--- /dev/null
+++ b/client/src/index.jsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import { createRoot } from 'react-dom/client';
+
+import App from './App';
+
+import './index.scss';
+
+const container = document.getElementById('root');
+// create a root
+const root = createRoot(container);
+
+root.render(
+
+
+
+);
diff --git a/client/src/index.scss b/client/src/index.scss
index cea7ef3b7..a854960ef 100644
--- a/client/src/index.scss
+++ b/client/src/index.scss
@@ -1,15 +1,47 @@
-@use './styles/main';
+@use './theme/main';
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
+* {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
+ scrollbar-color: rgba(255, 255, 255, 0.15) rgba(255, 255, 255, 0.01);
+ scrollbar-width: thin;
}
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
+body,
+html,
+.App {
+ margin: 0 auto;
+ overflow: hidden;
+ overflow: clip;
+ height: 100vh;
+ -webkit-user-select: none;
+ user-select: none;
+ -webkit-app-region: drag;
+}
+
+option {
+ color: black;
+}
+
+/* width */
+::-webkit-scrollbar {
+ width: 0.5rem;
+ height: 0.5rem;
+}
+
+/* Track */
+::-webkit-scrollbar-track {
+ background: rgba(255, 255, 255, 0.01);
+ border-radius: 4px;
+}
+
+/* Handle */
+::-webkit-scrollbar-thumb {
+ background: rgba(255, 255, 255, 0.15);
+ border-radius: 4px;
+}
+
+/* Handle on hover */
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(255, 255, 255, 0.35);
}
diff --git a/client/src/logo.svg b/client/src/logo.svg
deleted file mode 100644
index 9dfc1c058..000000000
--- a/client/src/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/client/src/reportWebVitals.js b/client/src/reportWebVitals.js
deleted file mode 100644
index 5253d3ad9..000000000
--- a/client/src/reportWebVitals.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const reportWebVitals = onPerfEntry => {
- if (onPerfEntry && onPerfEntry instanceof Function) {
- import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
- getCLS(onPerfEntry);
- getFID(onPerfEntry);
- getFCP(onPerfEntry);
- getLCP(onPerfEntry);
- getTTFB(onPerfEntry);
- });
- }
-};
-
-export default reportWebVitals;
diff --git a/client/src/styles/_main.scss b/client/src/theme/_main.scss
similarity index 100%
rename from client/src/styles/_main.scss
rename to client/src/theme/_main.scss
diff --git a/client/src/styles/_mixins.scss b/client/src/theme/_mixins.scss
similarity index 96%
rename from client/src/styles/_mixins.scss
rename to client/src/theme/_mixins.scss
index 8938324a8..bacbcfcfb 100644
--- a/client/src/styles/_mixins.scss
+++ b/client/src/theme/_mixins.scss
@@ -1,4 +1,4 @@
-@use "./main" as *;
+@use "main" as *;
//////////////////////////////////// general app elements
diff --git a/client/src/styles/_viewers.scss b/client/src/theme/_viewers.scss
similarity index 99%
rename from client/src/styles/_viewers.scss
rename to client/src/theme/_viewers.scss
index 65910d109..bd3f0cc80 100644
--- a/client/src/styles/_viewers.scss
+++ b/client/src/theme/_viewers.scss
@@ -1,4 +1,4 @@
-@use './main' as *;
+@use 'main' as *;
@mixin viewer-container {
margin: 0;
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index 9e1fcecef..000000000
--- a/yarn.lock
+++ /dev/null
@@ -1,567 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@electron/get@^1.13.0":
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368"
- integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==
- dependencies:
- debug "^4.1.1"
- env-paths "^2.2.0"
- fs-extra "^8.1.0"
- got "^9.6.0"
- progress "^2.0.3"
- semver "^6.2.0"
- sumchecker "^3.0.1"
- optionalDependencies:
- global-agent "^3.0.0"
- global-tunnel-ng "^2.7.1"
-
-"@sindresorhus/is@^0.14.0":
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
- integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
-
-"@szmarczak/http-timer@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
- integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
- dependencies:
- defer-to-connect "^1.0.1"
-
-"@types/node@^14.6.2":
- version "14.17.32"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.32.tgz#2ca61c9ef8c77f6fa1733be9e623ceb0d372ad96"
- integrity sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==
-
-boolean@^3.0.1:
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.4.tgz#f51a2fb5838a99e06f9b6ec1edb674de67026435"
- integrity sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==
-
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
-cacheable-request@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
- integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^3.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
- responselike "^1.0.2"
-
-clone-response@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
- dependencies:
- mimic-response "^1.0.0"
-
-concat-stream@^1.6.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
- dependencies:
- buffer-from "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^2.2.2"
- typedarray "^0.0.6"
-
-config-chain@^1.1.11:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
- integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
-core-util-is@~1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
- integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
-
-debug@^2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@^4.1.0, debug@^4.1.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
- integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
- dependencies:
- ms "2.1.2"
-
-decompress-response@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
- integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
- dependencies:
- mimic-response "^1.0.0"
-
-defer-to-connect@^1.0.1:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
- integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
-
-define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
- dependencies:
- object-keys "^1.0.12"
-
-detect-node@^2.0.4:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
- integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
-
-duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
-
-electron@^15.3.0:
- version "15.3.0"
- resolved "https://registry.yarnpkg.com/electron/-/electron-15.3.0.tgz#f9803c5a05b2dac12efc6d4203492c7e204b4819"
- integrity sha512-YLzaKCFmSniNlz9+NUTNs7ssPyDc+bYOCYZ0b/D6DjVkOeIFz4SR8EYKqlOc8TcqlDNu18BbWqz6zbJPyAAURg==
- dependencies:
- "@electron/get" "^1.13.0"
- "@types/node" "^14.6.2"
- extract-zip "^1.0.3"
-
-encodeurl@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
- integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-
-end-of-stream@^1.1.0:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-env-paths@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-es6-error@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
- integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
-
-escape-string-regexp@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
- integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-
-extract-zip@^1.0.3:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
- integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==
- dependencies:
- concat-stream "^1.6.2"
- debug "^2.6.9"
- mkdirp "^0.5.4"
- yauzl "^2.10.0"
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-fs-extra@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
- integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-get-stream@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
- integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
- dependencies:
- pump "^3.0.0"
-
-get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
-global-agent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
- integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
- dependencies:
- boolean "^3.0.1"
- es6-error "^4.1.1"
- matcher "^3.0.0"
- roarr "^2.15.3"
- semver "^7.3.2"
- serialize-error "^7.0.1"
-
-global-tunnel-ng@^2.7.1:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
- integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
- dependencies:
- encodeurl "^1.0.2"
- lodash "^4.17.10"
- npm-conf "^1.1.3"
- tunnel "^0.0.6"
-
-globalthis@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
- integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
- dependencies:
- define-properties "^1.1.3"
-
-got@^9.6.0:
- version "9.6.0"
- resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
- integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
- dependencies:
- "@sindresorhus/is" "^0.14.0"
- "@szmarczak/http-timer" "^1.1.2"
- cacheable-request "^6.0.0"
- decompress-response "^3.3.0"
- duplexer3 "^0.1.4"
- get-stream "^4.1.0"
- lowercase-keys "^1.0.1"
- mimic-response "^1.0.1"
- p-cancelable "^1.0.0"
- to-readable-stream "^1.0.0"
- url-parse-lax "^3.0.0"
-
-graceful-fs@^4.1.6, graceful-fs@^4.2.0:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
- integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
-
-http-cache-semantics@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
-
-inherits@^2.0.3, inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@^1.3.4:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-json-buffer@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
- integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-
-json-stringify-safe@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-jsonfile@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
- integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-keyv@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
- integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
- dependencies:
- json-buffer "3.0.0"
-
-lodash@^4.17.10:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
- integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-matcher@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
- integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
- dependencies:
- escape-string-regexp "^4.0.0"
-
-mimic-response@^1.0.0, mimic-response@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-mkdirp@^0.5.4:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
- integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
- dependencies:
- minimist "^1.2.5"
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-normalize-url@^4.1.0:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
- integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
-
-npm-conf@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
- integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
- dependencies:
- config-chain "^1.1.11"
- pify "^3.0.0"
-
-object-keys@^1.0.12:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
- integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-once@^1.3.1, once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-p-cancelable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
- integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
-prepend-http@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
- integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
-process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-progress@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-readable-stream@^2.2.2:
- version "2.3.7"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
- 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"
-
-responselike@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
- integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
- dependencies:
- lowercase-keys "^1.0.0"
-
-roarr@^2.15.3:
- version "2.15.4"
- resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
- integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
- dependencies:
- boolean "^3.0.1"
- detect-node "^2.0.4"
- globalthis "^1.0.1"
- json-stringify-safe "^5.0.1"
- semver-compare "^1.0.0"
- sprintf-js "^1.1.2"
-
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-semver-compare@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
- integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
-
-semver@^6.2.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@^7.3.2:
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
- integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
- dependencies:
- lru-cache "^6.0.0"
-
-serialize-error@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
- integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
- dependencies:
- type-fest "^0.13.1"
-
-sprintf-js@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
- integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-sumchecker@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
- integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
- dependencies:
- debug "^4.1.0"
-
-to-readable-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
- integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
-
-tunnel@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
- integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
-
-type-fest@^0.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
- integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
-
-typedarray@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
- integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-
-universalify@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-
-url-parse-lax@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
- integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
- dependencies:
- prepend-http "^2.0.0"
-
-util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yauzl@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"