diff --git a/web-app/package.json b/web-app/package.json
index e164abc6c..154bfb146 100644
--- a/web-app/package.json
+++ b/web-app/package.json
@@ -5,11 +5,6 @@
"dependencies": {
"@emotion/react": "^11.13.0",
"@emotion/styled": "^11.13.0",
- "@fortawesome/fontawesome-svg-core": "^6.4.2",
- "@fortawesome/free-brands-svg-icons": "^6.4.2",
- "@fortawesome/free-regular-svg-icons": "^6.4.2",
- "@fortawesome/free-solid-svg-icons": "^6.4.2",
- "@fortawesome/react-fontawesome": "^0.2.0",
"@mui/icons-material": "^5.16.4",
"@mui/material": "^5.16.4",
"@mui/x-date-pickers": "^7.11.0",
@@ -41,7 +36,6 @@
"react-hook-form": "^7.52.1",
"react-i18next": "^14.1.2",
"react-leaflet": "^4.2.1",
- "react-loading-overlay-ts": "^2.0.2",
"react-redux": "^8.1.3",
"react-router-dom": "^6.16.0",
"react-scripts": "5.0.1",
diff --git a/web-app/public/index.html b/web-app/public/index.html
index 7bd5101da..8b81b5bcc 100644
--- a/web-app/public/index.html
+++ b/web-app/public/index.html
@@ -1,14 +1,37 @@
-
+
+
+
+
+
+
-
+
-
-
-
-
Mobility Database
diff --git a/web-app/src/app/App.css b/web-app/src/app/App.css
index 9cc9b3fd1..cd50098d0 100644
--- a/web-app/src/app/App.css
+++ b/web-app/src/app/App.css
@@ -38,8 +38,8 @@
}
#app-main-container {
- height: 100vh;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
+ position: relative;
+ min-height: 100vh;
+ padding-bottom: 230px; /* footer space */
+ box-sizing: border-box;
}
diff --git a/web-app/src/app/App.tsx b/web-app/src/app/App.tsx
index a0327f055..13b6d333c 100644
--- a/web-app/src/app/App.tsx
+++ b/web-app/src/app/App.tsx
@@ -1,9 +1,6 @@
import './App.css';
import AppRouter from './router/Router';
-import Footer from './components/Footer';
-import Header from './components/Header';
import { BrowserRouter } from 'react-router-dom';
-import AppSpinner from './components/AppSpinner';
import { RemoteConfigProvider } from './context/RemoteConfigProvider';
import { useDispatch } from 'react-redux';
import { anonymousLogin } from './store/profile-reducer';
@@ -13,6 +10,7 @@ import { I18nextProvider } from 'react-i18next';
import { app } from '../firebase';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
+import AppContainer from './AppContainer';
function App(): React.ReactElement {
const dispatch = useDispatch();
@@ -35,15 +33,9 @@ function App(): React.ReactElement {
-
-
-
-
- {isAppReady ? : null}
-
-
-
-
+
+ {isAppReady ? : null}
+
diff --git a/web-app/src/app/AppContainer.tsx b/web-app/src/app/AppContainer.tsx
new file mode 100644
index 000000000..f8384a56b
--- /dev/null
+++ b/web-app/src/app/AppContainer.tsx
@@ -0,0 +1,33 @@
+import * as React from 'react';
+import { useSelector } from 'react-redux';
+import { Box, LinearProgress } from '@mui/material';
+import { selectLoadingApp } from './store/selectors';
+import type ContextProviderProps from './interface/ContextProviderProps';
+import Footer from './components/Footer';
+import Header from './components/Header';
+import { useLocation } from 'react-router-dom';
+
+const AppContainer: React.FC = ({ children }) => {
+ const isAppLoading = useSelector(selectLoadingApp);
+ const location = useLocation();
+
+ React.useLayoutEffect(() => {
+ window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
+ }, [location.pathname]);
+
+ return (
+
+
+ {isAppLoading ? (
+
+
+
+ ) : (
+ children
+ )}
+
+
+ );
+};
+
+export default AppContainer;
diff --git a/web-app/src/app/components/AppSpinner.tsx b/web-app/src/app/components/AppSpinner.tsx
deleted file mode 100644
index 09b698010..000000000
--- a/web-app/src/app/components/AppSpinner.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from 'react';
-import type ContextProviderProps from '../interface/ContextProviderProps';
-import LoadingOverlay from 'react-loading-overlay-ts';
-import { useSelector } from 'react-redux';
-import { selectLoadingApp } from '../store/selectors';
-
-/**
- * This adds a spinner to the entire application
- */
-const AppSpinner: React.FC = ({ children }) => {
- const isActive = useSelector(selectLoadingApp);
- return (
-
- {children}
-
- );
-};
-
-export default AppSpinner;
diff --git a/web-app/src/app/components/Footer.tsx b/web-app/src/app/components/Footer.tsx
index b10070582..6adb9de04 100644
--- a/web-app/src/app/components/Footer.tsx
+++ b/web-app/src/app/components/Footer.tsx
@@ -2,11 +2,23 @@ import React from 'react';
import '../styles/Footer.css';
import TwitterIcon from '@mui/icons-material/Twitter';
import { Button, IconButton } from '@mui/material';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faSlack } from '@fortawesome/free-brands-svg-icons';
import { GitHub, LinkedIn, OpenInNew } from '@mui/icons-material';
import { MOBILITY_DATA_LINKS } from '../constants/Navigation';
-import { fontFamily } from '../Theme';
+import { fontFamily, theme } from '../Theme';
+
+const SlackSvg = (
+
+);
const Footer: React.FC = () => {
const navigateTo = (link: string): void => {
@@ -52,7 +64,7 @@ const Footer: React.FC = () => {
navigateTo(MOBILITY_DATA_LINKS.slack);
}}
>
-
+ {SlackSvg}
([]);
+ >(buildNavigationItems(defaultRemoteConfigValues));
const [currentLanguage, setCurrentLanguage] = React.useState<
string | undefined
>(i18n.language);
diff --git a/web-app/src/app/constants/Navigation.spec.ts b/web-app/src/app/constants/Navigation.spec.ts
index 5173885fe..92b6515c3 100644
--- a/web-app/src/app/constants/Navigation.spec.ts
+++ b/web-app/src/app/constants/Navigation.spec.ts
@@ -23,16 +23,4 @@ describe('Navigation Elements', () => {
);
expect(feedsNavigation).toBeDefined();
});
-
- it('should not return feed nav item if feature flag disabled', () => {
- const featureFlags: RemoteConfigValues = {
- ...defaultRemoteConfigValues,
- enableFeedsPage: false,
- };
- const navigationItems = buildNavigationItems(featureFlags);
- const feedsNavigation = navigationItems.find(
- (item) => item.title === 'Feeds',
- );
- expect(feedsNavigation).toBeUndefined();
- });
});
diff --git a/web-app/src/app/constants/Navigation.ts b/web-app/src/app/constants/Navigation.ts
index 5aac46fc3..bbd6dfcc4 100644
--- a/web-app/src/app/constants/Navigation.ts
+++ b/web-app/src/app/constants/Navigation.ts
@@ -31,13 +31,11 @@ export function buildNavigationItems(
},
];
- if (featureFlags.enableFeedsPage) {
- navigationItems.push({
- title: 'Feeds',
- target: 'feeds',
- color: 'inherit',
- });
- }
+ navigationItems.push({
+ title: 'Feeds',
+ target: 'feeds',
+ color: 'inherit',
+ });
navigationItems.push(
...[
diff --git a/web-app/src/app/screens/Feed/AssociatedFeeds.tsx b/web-app/src/app/screens/Feed/AssociatedFeeds.tsx
index a7681cc62..147df14fb 100644
--- a/web-app/src/app/screens/Feed/AssociatedFeeds.tsx
+++ b/web-app/src/app/screens/Feed/AssociatedFeeds.tsx
@@ -112,12 +112,12 @@ export default function AssociatedGTFSRTFeeds({
const gtfsFeeds =
feeds?.filter((assocFeed) => assocFeed?.data_type === 'gtfs') ?? [];
return (
-
+
{feeds === undefined && Loading...}
diff --git a/web-app/src/app/screens/Feed/index.tsx b/web-app/src/app/screens/Feed/index.tsx
index 7154b1f3d..c35e7cbb0 100644
--- a/web-app/src/app/screens/Feed/index.tsx
+++ b/web-app/src/app/screens/Feed/index.tsx
@@ -9,6 +9,7 @@ import {
Typography,
Button,
Grid,
+ Skeleton,
} from '@mui/material';
import { ChevronLeft } from '@mui/icons-material';
import '../../styles/SignUp.css';
@@ -265,11 +266,60 @@ export default function Feed(): React.ReactElement {
}, [feed, needsToLoadFeed]);
// The feedId parameter doesn't match the feedId in the store, so we need to load the feed and only render the loading message.
- if (needsToLoadFeed) {
+ const areDatasetsLoading =
+ feed?.data_type === 'gtfs' && datasetLoadingStatus === 'loading';
+ const isCurrenltyLoadingFeed =
+ feedLoadingStatus === 'loading' || areDatasetsLoading;
+ if (needsToLoadFeed || isCurrenltyLoadingFeed) {
return wrapComponent(
feedLoadingStatus,
undefined,
- {t('common:loading')},
+
+
+
+
+
+
+
+
+
+
+
+ ,
);
}
const hasDatasets = datasets !== undefined && datasets.length > 0;
@@ -402,16 +452,12 @@ export default function Feed(): React.ReactElement {
disableElevation
variant='contained'
sx={{ marginRight: 2, my: 1 }}
+ href={downloadLatestUrl}
+ target='_blank'
+ rel='noreferrer'
+ id='download-latest-button'
>
-
- {t('downloadLatest')}
-
+ {t('downloadLatest')}
)}
{feed?.source_info?.license_url !== undefined &&
@@ -420,15 +466,11 @@ export default function Feed(): React.ReactElement {
disableElevation
variant='contained'
sx={{ marginRight: 2 }}
+ href={feed?.source_info?.license_url}
+ target='_blank'
+ rel='noreferrer'
>
-
- {t('seeLicense')}
-
+ {t('seeLicense')}
)}
@@ -440,13 +482,13 @@ export default function Feed(): React.ReactElement {
xs: feed?.data_type === 'gtfs' ? 'column-reverse' : 'column',
md: 'row',
}}
- sx={{ gap: '10px' }}
+ sx={{ gap: 3, flexWrap: 'nowrap' }}
justifyContent={'space-between'}
>
{feed?.data_type === 'gtfs' && (
@@ -467,7 +509,7 @@ export default function Feed(): React.ReactElement {
feed={feed}
sortedProviders={sortedProviders}
latestDataset={latestDataset}
- width={{ xs: '100%', md: '55%' }}
+ width={{ xs: '100%' }}
/>
{feed?.data_type === 'gtfs_rt' && relatedFeeds !== undefined && (
diff --git a/web-app/src/app/screens/Feeds/index.tsx b/web-app/src/app/screens/Feeds/index.tsx
index 92d776b99..324c47184 100644
--- a/web-app/src/app/screens/Feeds/index.tsx
+++ b/web-app/src/app/screens/Feeds/index.tsx
@@ -154,7 +154,7 @@ export default function Feed(): React.ReactElement {
};
return (
-
+
diff --git a/web-app/src/app/styles/Footer.css b/web-app/src/app/styles/Footer.css
index 09872a841..b03b27c3e 100644
--- a/web-app/src/app/styles/Footer.css
+++ b/web-app/src/app/styles/Footer.css
@@ -4,9 +4,16 @@
padding: 40px 8px;
font-size: 13px;
box-sizing: border-box;
+ min-height: 210px;
+ position: absolute;
+ bottom: 0;
}
.link-button:hover {
color: white !important;
background-color: #3959fa !important;
+}
+
+.link-button:hover svg path {
+ fill: white;
}
\ No newline at end of file
diff --git a/web-app/yarn.lock b/web-app/yarn.lock
index 36c1c0051..ef73f9a02 100644
--- a/web-app/yarn.lock
+++ b/web-app/yarn.lock
@@ -1371,23 +1371,6 @@
enabled "2.0.x"
kuler "^2.0.0"
-"@emotion/babel-plugin@^11.10.6":
- version "11.11.0"
- resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz"
- integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
- dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/runtime" "^7.18.3"
- "@emotion/hash" "^0.9.1"
- "@emotion/memoize" "^0.8.1"
- "@emotion/serialize" "^1.1.2"
- babel-plugin-macros "^3.1.0"
- convert-source-map "^1.5.0"
- escape-string-regexp "^4.0.0"
- find-root "^1.1.0"
- source-map "^0.5.7"
- stylis "4.2.0"
-
"@emotion/babel-plugin@^11.12.0":
version "11.12.0"
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
@@ -1416,7 +1399,7 @@
"@emotion/weak-memoize" "^0.4.0"
stylis "4.2.0"
-"@emotion/cache@^11.10.5", "@emotion/cache@^11.11.0":
+"@emotion/cache@^11.11.0":
version "11.11.0"
resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz"
integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
@@ -1427,22 +1410,6 @@
"@emotion/weak-memoize" "^0.3.1"
stylis "4.2.0"
-"@emotion/css@11.10.6":
- version "11.10.6"
- resolved "https://registry.npmjs.org/@emotion/css/-/css-11.10.6.tgz"
- integrity sha512-88Sr+3heKAKpj9PCqq5A1hAmAkoSIvwEq1O2TwDij7fUtsJpdkV4jMTISSTouFeRvsGvXIpuSuDQ4C1YdfNGXw==
- dependencies:
- "@emotion/babel-plugin" "^11.10.6"
- "@emotion/cache" "^11.10.5"
- "@emotion/serialize" "^1.1.1"
- "@emotion/sheet" "^1.2.1"
- "@emotion/utils" "^1.2.0"
-
-"@emotion/hash@^0.9.1":
- version "0.9.1"
- resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz"
- integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
-
"@emotion/hash@^0.9.2":
version "0.9.2"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b"
@@ -1490,18 +1457,7 @@
"@emotion/utils" "^1.4.0"
csstype "^3.0.2"
-"@emotion/serialize@^1.1.1", "@emotion/serialize@^1.1.2":
- version "1.1.2"
- resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz"
- integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
- dependencies:
- "@emotion/hash" "^0.9.1"
- "@emotion/memoize" "^0.8.1"
- "@emotion/unitless" "^0.8.1"
- "@emotion/utils" "^1.2.1"
- csstype "^3.0.2"
-
-"@emotion/sheet@^1.2.1", "@emotion/sheet@^1.2.2":
+"@emotion/sheet@^1.2.2":
version "1.2.2"
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
@@ -1523,11 +1479,6 @@
"@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
"@emotion/utils" "^1.4.0"
-"@emotion/unitless@^0.8.1":
- version "0.8.1"
- resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
- integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
-
"@emotion/unitless@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.9.0.tgz#8e5548f072bd67b8271877e51c0f95c76a66cbe2"
@@ -1543,7 +1494,7 @@
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.0.tgz#262f1d02aaedb2ec91c83a0955dd47822ad5fbdd"
integrity sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==
-"@emotion/utils@^1.2.0", "@emotion/utils@^1.2.1":
+"@emotion/utils@^1.2.1":
version "1.2.1"
resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz"
integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
@@ -2021,46 +1972,6 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
-"@fortawesome/fontawesome-common-types@6.4.2":
- version "6.4.2"
- resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz"
- integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==
-
-"@fortawesome/fontawesome-svg-core@^6.4.2":
- version "6.4.2"
- resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz"
- integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==
- dependencies:
- "@fortawesome/fontawesome-common-types" "6.4.2"
-
-"@fortawesome/free-brands-svg-icons@^6.4.2":
- version "6.4.2"
- resolved "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz"
- integrity sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==
- dependencies:
- "@fortawesome/fontawesome-common-types" "6.4.2"
-
-"@fortawesome/free-regular-svg-icons@^6.4.2":
- version "6.4.2"
- resolved "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz"
- integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==
- dependencies:
- "@fortawesome/fontawesome-common-types" "6.4.2"
-
-"@fortawesome/free-solid-svg-icons@^6.4.2":
- version "6.4.2"
- resolved "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz"
- integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==
- dependencies:
- "@fortawesome/fontawesome-common-types" "6.4.2"
-
-"@fortawesome/react-fontawesome@^0.2.0":
- version "0.2.0"
- resolved "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz"
- integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==
- dependencies:
- prop-types "^15.8.1"
-
"@google-cloud/paginator@^4.0.0":
version "4.0.1"
resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz"
@@ -2963,11 +2874,6 @@
resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz"
integrity sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==
-"@scarf/scarf@1.1.1":
- version "1.1.1"
- resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz"
- integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==
-
"@sideway/address@^4.1.3":
version "4.1.4"
resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz"
@@ -12592,15 +12498,6 @@ react-lifecycles-compat@^3.0.4:
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
-react-loading-overlay-ts@^2.0.2:
- version "2.0.2"
- resolved "https://registry.npmjs.org/react-loading-overlay-ts/-/react-loading-overlay-ts-2.0.2.tgz"
- integrity sha512-dy1GhUOz91aPmvvuT85WUFBCG7NX1ZJBKbeHgGHSC+gss6u9/6AfpFgDnXlJLxGpv+VbbeCXye8ETy+BX3SS4A==
- dependencies:
- "@emotion/css" "11.10.6"
- "@scarf/scarf" "1.1.1"
- react-transition-group "4.4.5"
-
react-redux@^8.1.3:
version "8.1.3"
resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz"
@@ -12717,7 +12614,7 @@ react-to-print@^2.8.0:
resolved "https://registry.yarnpkg.com/react-to-print/-/react-to-print-2.15.1.tgz#c9a6732cadf1118fc90d886b54a9388c419561b9"
integrity sha512-1foogIFbCpzAVxydkhBiDfMiFYhIMphiagDOfcG4X/EcQ+fBPqJ0rby9Wv/emzY1YLkIQy/rEgOrWQT+rBKhjw==
-react-transition-group@4.4.5, react-transition-group@^4.4.5:
+react-transition-group@^4.4.5:
version "4.4.5"
resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==