From 54b4fa20e0dc879c12c6aa6109c0127122249f07 Mon Sep 17 00:00:00 2001
From: Chris Beer <chris@cbeer.info>
Date: Thu, 12 Jan 2023 10:35:18 -0800
Subject: [PATCH] Use modern jsx transform approach

---
 .eslintrc                                            |  4 +++-
 __tests__/src/components/AccessTokenSender.test.js   |  1 -
 __tests__/src/components/AnnotationSettings.test.js  |  1 -
 __tests__/src/components/AnnotationsOverlay.test.js  |  1 -
 __tests__/src/components/App.test.js                 |  1 -
 __tests__/src/components/AppProviders.test.js        |  1 -
 __tests__/src/components/AttributionPanel.test.js    |  1 -
 __tests__/src/components/AudioViewer.test.js         |  1 -
 .../src/components/BackgroundPluginArea.test.js      |  1 -
 __tests__/src/components/Branding.test.js            |  1 -
 __tests__/src/components/CanvasAnnotations.test.js   |  1 -
 __tests__/src/components/CanvasInfo.test.js          |  1 -
 __tests__/src/components/CanvasLayers.test.js        |  1 -
 __tests__/src/components/ChangeThemeDialog.test.js   |  1 -
 __tests__/src/components/CollapsibleSection.test.js  |  1 -
 __tests__/src/components/CollectionDialog.test.js    |  1 -
 __tests__/src/components/CollectionInfo.test.js      |  1 -
 __tests__/src/components/CompanionArea.test.js       |  1 -
 __tests__/src/components/CompanionWindow.test.js     |  1 -
 .../src/components/CompanionWindowFactory.test.js    |  1 -
 __tests__/src/components/ErrorDialog.test.js         |  1 -
 __tests__/src/components/FullScreenButton.test.js    |  1 -
 __tests__/src/components/GalleryView.test.js         |  1 -
 .../src/components/GalleryViewThumbnail.test.js      |  1 -
 __tests__/src/components/IIIFAuthentication.test.js  |  1 -
 __tests__/src/components/IIIFThumbnail.test.js       |  1 -
 __tests__/src/components/LabelValueMetadata.test.js  |  1 -
 __tests__/src/components/LanguageSettings.test.js    |  1 -
 __tests__/src/components/LayersPanel.test.js         |  1 -
 __tests__/src/components/LocalePicker.test.js        |  1 -
 __tests__/src/components/ManifestForm.test.js        |  1 -
 __tests__/src/components/ManifestInfo.test.js        |  1 -
 __tests__/src/components/ManifestListItem.test.js    |  1 -
 .../src/components/ManifestListItemError.test.js     |  1 -
 .../src/components/ManifestRelatedLinks.test.js      |  1 -
 __tests__/src/components/MiradorMenuButton.test.js   |  1 -
 __tests__/src/components/MosaicRenderPreview.test.js |  1 -
 __tests__/src/components/NestedMenu.test.js          |  1 -
 __tests__/src/components/NewWindow.test.js           |  1 -
 __tests__/src/components/OpenSeadragonViewer.test.js |  1 -
 __tests__/src/components/PluginHook.test.js          |  1 -
 __tests__/src/components/PrimaryWindow.test.js       |  1 -
 __tests__/src/components/SanitizedHtml.test.js       |  1 -
 .../components/ScrollIndicatedDialogContent.test.js  |  1 -
 __tests__/src/components/ScrollTo.test.js            |  1 -
 __tests__/src/components/SearchHit.test.js           |  1 -
 __tests__/src/components/SearchPanel.test.js         |  1 -
 __tests__/src/components/SearchPanelControls.test.js |  1 -
 .../src/components/SearchPanelNavigation.test.js     |  1 -
 __tests__/src/components/SearchResults.test.js       |  1 -
 __tests__/src/components/SidebarIndexItem.test.js    |  1 -
 __tests__/src/components/SidebarIndexList.test.js    |  1 -
 .../components/SidebarIndexTableOfContents.test.js   |  1 -
 .../src/components/SidebarIndexThumbnail.test.js     |  1 -
 .../src/components/ThumbnailCanvasGrouping.test.js   |  1 -
 __tests__/src/components/ThumbnailNavigation.test.js |  1 -
 __tests__/src/components/VideoViewer.test.js         |  1 -
 __tests__/src/components/ViewerInfo.test.js          |  1 -
 __tests__/src/components/ViewerNavigation.test.js    |  1 -
 __tests__/src/components/Window.test.js              |  1 -
 .../src/components/WindowAuthenticationBar.test.js   |  1 -
 .../WindowCanvasNavigationControls.test.js           |  1 -
 __tests__/src/components/WindowList.test.js          |  1 -
 __tests__/src/components/WindowListButton.test.js    |  1 -
 __tests__/src/components/WindowSideBar.test.js       |  1 -
 .../components/WindowSideBarAnnotationsPanel.test.js |  1 -
 .../src/components/WindowSideBarButtons.test.js      |  1 -
 .../src/components/WindowSideBarCanvasPanel.test.js  |  1 -
 .../src/components/WindowSideBarInfoPanel.test.js    |  1 -
 .../src/components/WindowThumbnailSettings.test.js   |  1 -
 __tests__/src/components/WindowTopBar.test.js        |  1 -
 .../src/components/WindowTopBarPluginArea.test.js    |  1 -
 .../src/components/WindowTopBarPluginMenu.test.js    |  1 -
 __tests__/src/components/WindowTopBarTitle.test.js   |  1 -
 __tests__/src/components/WindowTopMenu.test.js       |  1 -
 __tests__/src/components/WindowTopMenuButton.test.js |  1 -
 __tests__/src/components/WindowViewSettings.test.js  |  1 -
 __tests__/src/components/WindowViewer.test.js        |  1 -
 __tests__/src/components/Workspace.test.js           |  1 -
 __tests__/src/components/WorkspaceAdd.test.js        |  1 -
 __tests__/src/components/WorkspaceAddButton.test.js  |  1 -
 __tests__/src/components/WorkspaceArea.test.js       |  1 -
 .../src/components/WorkspaceControlPanel.test.js     |  1 -
 .../components/WorkspaceControlPanelButtons.test.js  |  1 -
 __tests__/src/components/WorkspaceElastic.test.js    |  1 -
 .../src/components/WorkspaceElasticWindow.test.js    |  1 -
 __tests__/src/components/WorkspaceExport.test.js     |  1 -
 __tests__/src/components/WorkspaceImport.test.js     |  1 -
 __tests__/src/components/WorkspaceMenu.test.js       |  1 -
 __tests__/src/components/WorkspaceMenuButton.test.js |  1 -
 __tests__/src/components/WorkspaceMosaic.test.js     |  1 -
 .../src/components/WorkspaceOptionsButton.test.js    |  1 -
 .../src/components/WorkspaceOptionsMenu.test.js      |  1 -
 .../src/components/WorkspaceSelectionDialog.test.js  |  1 -
 __tests__/src/components/ZoomControls.test.js        |  1 -
 __tests__/src/extend/withPlugins.test.js             |  1 -
 babel.config.js                                      |  2 +-
 package.json                                         |  8 ++++----
 src/components/AccessTokenSender.js                  |  2 +-
 src/components/AnnotationSettings.js                 |  2 +-
 src/components/AnnotationsOverlay.js                 |  4 ++--
 src/components/App.js                                |  2 +-
 src/components/AppProviders.js                       |  2 +-
 src/components/AttributionPanel.js                   |  2 +-
 src/components/AudioViewer.js                        |  2 +-
 src/components/BackgroundPluginArea.js               |  1 -
 src/components/Branding.js                           |  2 +-
 src/components/CanvasAnnotations.js                  |  2 +-
 src/components/CanvasInfo.js                         |  2 +-
 src/components/CanvasLayers.js                       |  2 +-
 src/components/ChangeThemeDialog.js                  |  2 +-
 src/components/CollapsibleSection.js                 |  2 +-
 src/components/CollectionDialog.js                   |  2 +-
 src/components/CollectionInfo.js                     |  2 +-
 src/components/CompanionArea.js                      |  2 +-
 src/components/CompanionWindow.js                    |  6 +++---
 src/components/CompanionWindowFactory.js             |  4 ++--
 src/components/CustomPanel.js                        |  2 +-
 src/components/ErrorContent.js                       |  2 +-
 src/components/ErrorDialog.js                        |  2 +-
 src/components/FullScreenButton.js                   |  2 +-
 src/components/GalleryView.js                        |  2 +-
 src/components/GalleryViewThumbnail.js               |  4 ++--
 src/components/IIIFAuthentication.js                 |  2 +-
 src/components/IIIFDropTarget.js                     |  1 -
 src/components/IIIFThumbnail.js                      |  2 +-
 src/components/LabelValueMetadata.js                 |  2 +-
 src/components/LanguageSettings.js                   |  2 +-
 src/components/LayersPanel.js                        |  2 +-
 src/components/LocalePicker.js                       |  2 +-
 src/components/ManifestForm.js                       |  2 +-
 src/components/ManifestInfo.js                       |  2 +-
 src/components/ManifestListItem.js                   |  4 ++--
 src/components/ManifestListItemError.js              |  2 +-
 src/components/ManifestRelatedLinks.js               |  2 +-
 src/components/MinimalWindow.js                      |  2 +-
 src/components/MiradorMenuButton.js                  |  1 -
 src/components/MosaicRenderPreview.js                |  1 -
 src/components/NestedMenu.js                         |  2 +-
 src/components/OpenSeadragonViewer.js                | 12 +++++++-----
 src/components/PluginHook.js                         |  8 ++++----
 src/components/PrimaryWindow.js                      |  2 +-
 src/components/SanitizedHtml.js                      |  2 +-
 src/components/ScrollIndicatedDialogContent.js       |  1 -
 src/components/ScrollTo.js                           |  4 ++--
 src/components/SearchHit.js                          |  2 +-
 src/components/SearchPanel.js                        |  4 ++--
 src/components/SearchPanelControls.js                |  2 +-
 src/components/SearchPanelNavigation.js              |  2 +-
 src/components/SearchResults.js                      |  2 +-
 src/components/SelectCollection.js                   |  2 +-
 src/components/SidebarIndexItem.js                   |  2 +-
 src/components/SidebarIndexList.js                   |  2 +-
 src/components/SidebarIndexTableOfContents.js        |  2 +-
 src/components/SidebarIndexThumbnail.js              |  2 +-
 src/components/ThumbnailCanvasGrouping.js            |  2 +-
 src/components/ThumbnailNavigation.js                |  4 ++--
 src/components/VideoViewer.js                        |  2 +-
 src/components/ViewerInfo.js                         |  2 +-
 src/components/ViewerNavigation.js                   |  2 +-
 src/components/Window.js                             |  2 +-
 src/components/WindowAuthenticationBar.js            |  2 +-
 src/components/WindowCanvasNavigationControls.js     |  2 +-
 src/components/WindowList.js                         |  2 +-
 src/components/WindowListButton.js                   |  2 +-
 src/components/WindowSideBar.js                      |  2 +-
 src/components/WindowSideBarAnnotationsPanel.js      |  4 ++--
 src/components/WindowSideBarButtons.js               |  2 +-
 src/components/WindowSideBarCanvasPanel.js           |  4 ++--
 src/components/WindowSideBarCollectionPanel.js       |  2 +-
 src/components/WindowSideBarInfoPanel.js             |  2 +-
 src/components/WindowThumbnailSettings.js            |  2 +-
 src/components/WindowTopBar.js                       |  2 +-
 src/components/WindowTopBarPluginArea.js             |  2 +-
 src/components/WindowTopBarPluginMenu.js             |  2 +-
 src/components/WindowTopBarTitle.js                  |  2 +-
 src/components/WindowTopMenu.js                      |  2 +-
 src/components/WindowTopMenuButton.js                |  2 +-
 src/components/WindowViewSettings.js                 |  2 +-
 src/components/WindowViewer.js                       |  2 +-
 src/components/Workspace.js                          |  4 ++--
 src/components/WorkspaceAdd.js                       |  6 +++---
 src/components/WorkspaceAddButton.js                 |  2 +-
 src/components/WorkspaceArea.js                      |  2 +-
 src/components/WorkspaceControlPanel.js              |  2 +-
 src/components/WorkspaceControlPanelButtons.js       |  2 +-
 src/components/WorkspaceElastic.js                   |  4 ++--
 src/components/WorkspaceElasticWindow.js             |  4 ++--
 src/components/WorkspaceExport.js                    |  2 +-
 src/components/WorkspaceImport.js                    |  2 +-
 src/components/WorkspaceMenu.js                      |  2 +-
 src/components/WorkspaceMenuButton.js                |  2 +-
 src/components/WorkspaceMosaic.js                    |  4 ++--
 src/components/WorkspaceOptionsButton.js             |  2 +-
 src/components/WorkspaceOptionsMenu.js               |  2 +-
 src/components/WorkspaceSelectionDialog.js           |  2 +-
 src/components/ZoomControls.js                       |  2 +-
 src/components/icons/BookViewIcon.js                 |  1 -
 src/components/icons/CanvasIndexIcon.js              |  1 -
 src/components/icons/GalleryViewIcon.js              |  1 -
 src/components/icons/MiradorIcon.js                  |  1 -
 src/components/icons/RestoreZoomIcon.js              |  1 -
 .../icons/ThumbnailNavigationBottomIcon.js           |  1 -
 src/components/icons/ThumbnailNavigationRightIcon.js |  1 -
 src/components/icons/WindowMaxIcon.js                |  1 -
 src/components/icons/WindowMinIcon.js                |  1 -
 src/components/icons/WindowOptionsIcon.js            |  1 -
 src/components/icons/WorkspaceTypeElasticIcon.js     |  1 -
 src/components/icons/WorkspaceTypeMosaicIcon.js      |  1 -
 src/extend/PluginContext.js                          |  4 ++--
 src/extend/PluginProvider.js                         |  2 +-
 src/extend/withPlugins.js                            |  4 ++--
 src/extend/withRef.js                                |  2 +-
 src/lib/MiradorViewer.js                             |  1 -
 webpack.config.js                                    |  2 ++
 215 files changed, 136 insertions(+), 243 deletions(-)

diff --git a/.eslintrc b/.eslintrc
index 2c700b509..531acf5e5 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -38,6 +38,8 @@
       "ignoreStrings": true,
       "ignoreTemplateLiterals": true,
       "ignoreRegExpLiterals": true
-    }]
+    }],
+    "react/jsx-uses-react": "off",
+    "react/react-in-jsx-scope": "off"
   }
 }
diff --git a/__tests__/src/components/AccessTokenSender.test.js b/__tests__/src/components/AccessTokenSender.test.js
index d14f10a55..0281b4efb 100644
--- a/__tests__/src/components/AccessTokenSender.test.js
+++ b/__tests__/src/components/AccessTokenSender.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { AccessTokenSender } from '../../../src/components/AccessTokenSender';
 
diff --git a/__tests__/src/components/AnnotationSettings.test.js b/__tests__/src/components/AnnotationSettings.test.js
index 5c3de53e8..d15a537ec 100644
--- a/__tests__/src/components/AnnotationSettings.test.js
+++ b/__tests__/src/components/AnnotationSettings.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
 import { AnnotationSettings } from '../../../src/components/AnnotationSettings';
diff --git a/__tests__/src/components/AnnotationsOverlay.test.js b/__tests__/src/components/AnnotationsOverlay.test.js
index 834592810..4766b19e9 100644
--- a/__tests__/src/components/AnnotationsOverlay.test.js
+++ b/__tests__/src/components/AnnotationsOverlay.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import OpenSeadragon from 'openseadragon';
 import { Utils } from 'manifesto.js';
diff --git a/__tests__/src/components/App.test.js b/__tests__/src/components/App.test.js
index 504676512..2d758ec57 100644
--- a/__tests__/src/components/App.test.js
+++ b/__tests__/src/components/App.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import PluginProvider from '../../../src/extend/PluginProvider';
 import AppProviders from '../../../src/containers/AppProviders';
diff --git a/__tests__/src/components/AppProviders.test.js b/__tests__/src/components/AppProviders.test.js
index 8f8edbed9..1ce84d264 100644
--- a/__tests__/src/components/AppProviders.test.js
+++ b/__tests__/src/components/AppProviders.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { ThemeProvider, StylesProvider } from '@material-ui/core/styles';
 import { DndContext, DndProvider } from 'react-dnd';
diff --git a/__tests__/src/components/AttributionPanel.test.js b/__tests__/src/components/AttributionPanel.test.js
index b8ed56bf2..af822aa54 100644
--- a/__tests__/src/components/AttributionPanel.test.js
+++ b/__tests__/src/components/AttributionPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import Link from '@material-ui/core/Link';
diff --git a/__tests__/src/components/AudioViewer.test.js b/__tests__/src/components/AudioViewer.test.js
index cca67ee5d..a74b8bfc3 100644
--- a/__tests__/src/components/AudioViewer.test.js
+++ b/__tests__/src/components/AudioViewer.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { AudioViewer } from '../../../src/components/AudioViewer';
 
diff --git a/__tests__/src/components/BackgroundPluginArea.test.js b/__tests__/src/components/BackgroundPluginArea.test.js
index 974603b81..bbe31fd5d 100644
--- a/__tests__/src/components/BackgroundPluginArea.test.js
+++ b/__tests__/src/components/BackgroundPluginArea.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { BackgroundPluginArea } from '../../../src/components/BackgroundPluginArea';
 import { PluginHook } from '../../../src/components/PluginHook';
diff --git a/__tests__/src/components/Branding.test.js b/__tests__/src/components/Branding.test.js
index 661145873..fbbfc6c7d 100644
--- a/__tests__/src/components/Branding.test.js
+++ b/__tests__/src/components/Branding.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import IconButton from '@material-ui/core/IconButton';
diff --git a/__tests__/src/components/CanvasAnnotations.test.js b/__tests__/src/components/CanvasAnnotations.test.js
index 63f0674dd..a51a744c9 100644
--- a/__tests__/src/components/CanvasAnnotations.test.js
+++ b/__tests__/src/components/CanvasAnnotations.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import Chip from '@material-ui/core/Chip';
diff --git a/__tests__/src/components/CanvasInfo.test.js b/__tests__/src/components/CanvasInfo.test.js
index 0b816741f..ba8309730 100644
--- a/__tests__/src/components/CanvasInfo.test.js
+++ b/__tests__/src/components/CanvasInfo.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import { CanvasInfo } from '../../../src/components/CanvasInfo';
diff --git a/__tests__/src/components/CanvasLayers.test.js b/__tests__/src/components/CanvasLayers.test.js
index b5eed71c8..fd5f337b7 100644
--- a/__tests__/src/components/CanvasLayers.test.js
+++ b/__tests__/src/components/CanvasLayers.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Input from '@material-ui/core/Input';
 import Slider from '@material-ui/core/Slider';
diff --git a/__tests__/src/components/ChangeThemeDialog.test.js b/__tests__/src/components/ChangeThemeDialog.test.js
index 3585e08f2..f2bf0d268 100644
--- a/__tests__/src/components/ChangeThemeDialog.test.js
+++ b/__tests__/src/components/ChangeThemeDialog.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Dialog from '@material-ui/core/Dialog';
 import ListItemText from '@material-ui/core/ListItemText';
diff --git a/__tests__/src/components/CollapsibleSection.test.js b/__tests__/src/components/CollapsibleSection.test.js
index c1d62d69f..1db02cd18 100644
--- a/__tests__/src/components/CollapsibleSection.test.js
+++ b/__tests__/src/components/CollapsibleSection.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
diff --git a/__tests__/src/components/CollectionDialog.test.js b/__tests__/src/components/CollectionDialog.test.js
index 2b057a7d1..693282f65 100644
--- a/__tests__/src/components/CollectionDialog.test.js
+++ b/__tests__/src/components/CollectionDialog.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Dialog from '@material-ui/core/Dialog';
 import DialogActions from '@material-ui/core/DialogActions';
diff --git a/__tests__/src/components/CollectionInfo.test.js b/__tests__/src/components/CollectionInfo.test.js
index b990a49f7..d76843203 100644
--- a/__tests__/src/components/CollectionInfo.test.js
+++ b/__tests__/src/components/CollectionInfo.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import { CollectionInfo } from '../../../src/components/CollectionInfo';
diff --git a/__tests__/src/components/CompanionArea.test.js b/__tests__/src/components/CompanionArea.test.js
index 6e390ad13..9e7981b0b 100644
--- a/__tests__/src/components/CompanionArea.test.js
+++ b/__tests__/src/components/CompanionArea.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Slide from '@material-ui/core/Slide';
 import ArrowLeftIcon from '@material-ui/icons/ArrowLeftSharp';
diff --git a/__tests__/src/components/CompanionWindow.test.js b/__tests__/src/components/CompanionWindow.test.js
index c14bfaecf..99c5b8583 100644
--- a/__tests__/src/components/CompanionWindow.test.js
+++ b/__tests__/src/components/CompanionWindow.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Rnd } from 'react-rnd';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
diff --git a/__tests__/src/components/CompanionWindowFactory.test.js b/__tests__/src/components/CompanionWindowFactory.test.js
index 1babf7564..acf0d3971 100644
--- a/__tests__/src/components/CompanionWindowFactory.test.js
+++ b/__tests__/src/components/CompanionWindowFactory.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import WindowSideBarInfoPanel from '../../../src/containers/WindowSideBarInfoPanel';
 import WindowSideBarCanvasPanel from '../../../src/containers/WindowSideBarCanvasPanel';
diff --git a/__tests__/src/components/ErrorDialog.test.js b/__tests__/src/components/ErrorDialog.test.js
index 73eb88bb0..64a32a1e5 100644
--- a/__tests__/src/components/ErrorDialog.test.js
+++ b/__tests__/src/components/ErrorDialog.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import Dialog from '@material-ui/core/Dialog';
diff --git a/__tests__/src/components/FullScreenButton.test.js b/__tests__/src/components/FullScreenButton.test.js
index cd7023164..b15f28aa3 100644
--- a/__tests__/src/components/FullScreenButton.test.js
+++ b/__tests__/src/components/FullScreenButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import FullscreenIcon from '@material-ui/icons/FullscreenSharp';
 import FullscreenExitIcon from '@material-ui/icons/FullscreenExitSharp';
diff --git a/__tests__/src/components/GalleryView.test.js b/__tests__/src/components/GalleryView.test.js
index 4a15795c4..3cb9b7434 100644
--- a/__tests__/src/components/GalleryView.test.js
+++ b/__tests__/src/components/GalleryView.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import Paper from '@material-ui/core/Paper';
diff --git a/__tests__/src/components/GalleryViewThumbnail.test.js b/__tests__/src/components/GalleryViewThumbnail.test.js
index 3fbcc227c..c15632938 100644
--- a/__tests__/src/components/GalleryViewThumbnail.test.js
+++ b/__tests__/src/components/GalleryViewThumbnail.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import Chip from '@material-ui/core/Chip';
diff --git a/__tests__/src/components/IIIFAuthentication.test.js b/__tests__/src/components/IIIFAuthentication.test.js
index 38599d353..c8f7261ff 100644
--- a/__tests__/src/components/IIIFAuthentication.test.js
+++ b/__tests__/src/components/IIIFAuthentication.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import WindowAuthenticationBar from '../../../src/containers/WindowAuthenticationBar';
 import { NewWindow } from '../../../src/components/NewWindow';
diff --git a/__tests__/src/components/IIIFThumbnail.test.js b/__tests__/src/components/IIIFThumbnail.test.js
index 8b2d31442..bc6ee9410 100644
--- a/__tests__/src/components/IIIFThumbnail.test.js
+++ b/__tests__/src/components/IIIFThumbnail.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { InView } from 'react-intersection-observer';
 import Typography from '@material-ui/core/Typography';
diff --git a/__tests__/src/components/LabelValueMetadata.test.js b/__tests__/src/components/LabelValueMetadata.test.js
index 2e3178bab..a53a3f01c 100644
--- a/__tests__/src/components/LabelValueMetadata.test.js
+++ b/__tests__/src/components/LabelValueMetadata.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import { LabelValueMetadata } from '../../../src/components/LabelValueMetadata';
diff --git a/__tests__/src/components/LanguageSettings.test.js b/__tests__/src/components/LanguageSettings.test.js
index ff1731013..e4e5462cc 100644
--- a/__tests__/src/components/LanguageSettings.test.js
+++ b/__tests__/src/components/LanguageSettings.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import ListItemText from '@material-ui/core/ListItemText';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/__tests__/src/components/LayersPanel.test.js b/__tests__/src/components/LayersPanel.test.js
index 769bde8c9..9439ae81b 100644
--- a/__tests__/src/components/LayersPanel.test.js
+++ b/__tests__/src/components/LayersPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import CanvasLayers from '../../../src/containers/CanvasLayers';
 import { LayersPanel } from '../../../src/components/LayersPanel';
diff --git a/__tests__/src/components/LocalePicker.test.js b/__tests__/src/components/LocalePicker.test.js
index e12431caf..4babd052f 100644
--- a/__tests__/src/components/LocalePicker.test.js
+++ b/__tests__/src/components/LocalePicker.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MenuItem from '@material-ui/core/MenuItem';
 import Select from '@material-ui/core/Select';
diff --git a/__tests__/src/components/ManifestForm.test.js b/__tests__/src/components/ManifestForm.test.js
index 4d170be7a..543aa66d7 100644
--- a/__tests__/src/components/ManifestForm.test.js
+++ b/__tests__/src/components/ManifestForm.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { mount } from 'enzyme';
 import { ManifestForm } from '../../../src/components/ManifestForm';
 
diff --git a/__tests__/src/components/ManifestInfo.test.js b/__tests__/src/components/ManifestInfo.test.js
index 543a2da4c..eda171cca 100644
--- a/__tests__/src/components/ManifestInfo.test.js
+++ b/__tests__/src/components/ManifestInfo.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import { ManifestInfo } from '../../../src/components/ManifestInfo';
diff --git a/__tests__/src/components/ManifestListItem.test.js b/__tests__/src/components/ManifestListItem.test.js
index bd75e02b3..3b80d03a2 100644
--- a/__tests__/src/components/ManifestListItem.test.js
+++ b/__tests__/src/components/ManifestListItem.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import ButtonBase from '@material-ui/core/ButtonBase';
 import ListItem from '@material-ui/core/ListItem';
diff --git a/__tests__/src/components/ManifestListItemError.test.js b/__tests__/src/components/ManifestListItemError.test.js
index 4bd6c599b..c70ec7948 100644
--- a/__tests__/src/components/ManifestListItemError.test.js
+++ b/__tests__/src/components/ManifestListItemError.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import Typography from '@material-ui/core/Typography';
diff --git a/__tests__/src/components/ManifestRelatedLinks.test.js b/__tests__/src/components/ManifestRelatedLinks.test.js
index 4bf7994f7..270608bff 100644
--- a/__tests__/src/components/ManifestRelatedLinks.test.js
+++ b/__tests__/src/components/ManifestRelatedLinks.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import Link from '@material-ui/core/Link';
diff --git a/__tests__/src/components/MiradorMenuButton.test.js b/__tests__/src/components/MiradorMenuButton.test.js
index ad865d63d..4e3783f71 100644
--- a/__tests__/src/components/MiradorMenuButton.test.js
+++ b/__tests__/src/components/MiradorMenuButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Badge from '@material-ui/core/Badge';
 import IconButton from '@material-ui/core/IconButton';
diff --git a/__tests__/src/components/MosaicRenderPreview.test.js b/__tests__/src/components/MosaicRenderPreview.test.js
index f65a4a76d..929e492fc 100644
--- a/__tests__/src/components/MosaicRenderPreview.test.js
+++ b/__tests__/src/components/MosaicRenderPreview.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MinimalWindow from '../../../src/containers/MinimalWindow';
 import { MosaicRenderPreview } from '../../../src/components/MosaicRenderPreview';
diff --git a/__tests__/src/components/NestedMenu.test.js b/__tests__/src/components/NestedMenu.test.js
index 6db2b464c..e0849fe8c 100644
--- a/__tests__/src/components/NestedMenu.test.js
+++ b/__tests__/src/components/NestedMenu.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import ListItemIcon from '@material-ui/core/ListItemIcon';
 import ListItemText from '@material-ui/core/ListItemText';
diff --git a/__tests__/src/components/NewWindow.test.js b/__tests__/src/components/NewWindow.test.js
index 2b1e67ef3..1d09dd502 100644
--- a/__tests__/src/components/NewWindow.test.js
+++ b/__tests__/src/components/NewWindow.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { NewWindow } from '../../../src/components/NewWindow';
 
diff --git a/__tests__/src/components/OpenSeadragonViewer.test.js b/__tests__/src/components/OpenSeadragonViewer.test.js
index 1c957824c..39dc6cbd9 100644
--- a/__tests__/src/components/OpenSeadragonViewer.test.js
+++ b/__tests__/src/components/OpenSeadragonViewer.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import OpenSeadragon from 'openseadragon';
 import { Utils } from 'manifesto.js';
diff --git a/__tests__/src/components/PluginHook.test.js b/__tests__/src/components/PluginHook.test.js
index 091781368..bda3c70e0 100644
--- a/__tests__/src/components/PluginHook.test.js
+++ b/__tests__/src/components/PluginHook.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { PluginHook } from '../../../src/components/PluginHook';
 
diff --git a/__tests__/src/components/PrimaryWindow.test.js b/__tests__/src/components/PrimaryWindow.test.js
index 47c41be28..7f706545f 100644
--- a/__tests__/src/components/PrimaryWindow.test.js
+++ b/__tests__/src/components/PrimaryWindow.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { PrimaryWindow } from '../../../src/components/PrimaryWindow';
 import WindowSideBar from '../../../src/containers/WindowSideBar';
diff --git a/__tests__/src/components/SanitizedHtml.test.js b/__tests__/src/components/SanitizedHtml.test.js
index 76104761f..c3bcf3e74 100644
--- a/__tests__/src/components/SanitizedHtml.test.js
+++ b/__tests__/src/components/SanitizedHtml.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { SanitizedHtml } from '../../../src/components/SanitizedHtml';
 
diff --git a/__tests__/src/components/ScrollIndicatedDialogContent.test.js b/__tests__/src/components/ScrollIndicatedDialogContent.test.js
index 5cc43d547..0f39735c9 100644
--- a/__tests__/src/components/ScrollIndicatedDialogContent.test.js
+++ b/__tests__/src/components/ScrollIndicatedDialogContent.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import DialogContent from '@material-ui/core/DialogContent';
 import { ScrollIndicatedDialogContent } from '../../../src/components/ScrollIndicatedDialogContent';
diff --git a/__tests__/src/components/ScrollTo.test.js b/__tests__/src/components/ScrollTo.test.js
index ecb4a6d3f..c412e525f 100644
--- a/__tests__/src/components/ScrollTo.test.js
+++ b/__tests__/src/components/ScrollTo.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { ScrollTo } from '../../../src/components/ScrollTo';
 
diff --git a/__tests__/src/components/SearchHit.test.js b/__tests__/src/components/SearchHit.test.js
index 2be8074e5..9fd9fdbf7 100644
--- a/__tests__/src/components/SearchHit.test.js
+++ b/__tests__/src/components/SearchHit.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { SearchHit } from '../../../src/components/SearchHit';
 import { ScrollTo } from '../../../src/components/ScrollTo';
diff --git a/__tests__/src/components/SearchPanel.test.js b/__tests__/src/components/SearchPanel.test.js
index ce33f8e88..2d8f7eeb1 100644
--- a/__tests__/src/components/SearchPanel.test.js
+++ b/__tests__/src/components/SearchPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import CompanionWindow from '../../../src/containers/CompanionWindow';
diff --git a/__tests__/src/components/SearchPanelControls.test.js b/__tests__/src/components/SearchPanelControls.test.js
index 64c57780c..aa147c12e 100644
--- a/__tests__/src/components/SearchPanelControls.test.js
+++ b/__tests__/src/components/SearchPanelControls.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Autocomplete from '@material-ui/lab/Autocomplete';
 import CircularProgress from '@material-ui/core/CircularProgress';
diff --git a/__tests__/src/components/SearchPanelNavigation.test.js b/__tests__/src/components/SearchPanelNavigation.test.js
index bec2c1b63..50b005fdf 100644
--- a/__tests__/src/components/SearchPanelNavigation.test.js
+++ b/__tests__/src/components/SearchPanelNavigation.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { SearchPanelNavigation } from '../../../src/components/SearchPanelNavigation';
 
diff --git a/__tests__/src/components/SearchResults.test.js b/__tests__/src/components/SearchResults.test.js
index 2ceaaba79..ce0603bc1 100644
--- a/__tests__/src/components/SearchResults.test.js
+++ b/__tests__/src/components/SearchResults.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import { SearchResults } from '../../../src/components/SearchResults';
diff --git a/__tests__/src/components/SidebarIndexItem.test.js b/__tests__/src/components/SidebarIndexItem.test.js
index fb4295ffe..23adb0a16 100644
--- a/__tests__/src/components/SidebarIndexItem.test.js
+++ b/__tests__/src/components/SidebarIndexItem.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import { SidebarIndexItem } from '../../../src/components/SidebarIndexItem';
diff --git a/__tests__/src/components/SidebarIndexList.test.js b/__tests__/src/components/SidebarIndexList.test.js
index 364a7646a..b65bbab10 100644
--- a/__tests__/src/components/SidebarIndexList.test.js
+++ b/__tests__/src/components/SidebarIndexList.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MenuList from '@material-ui/core/MenuList';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/__tests__/src/components/SidebarIndexTableOfContents.test.js b/__tests__/src/components/SidebarIndexTableOfContents.test.js
index c30044db7..76565846a 100644
--- a/__tests__/src/components/SidebarIndexTableOfContents.test.js
+++ b/__tests__/src/components/SidebarIndexTableOfContents.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import TreeItem from '@material-ui/lab/TreeItem';
diff --git a/__tests__/src/components/SidebarIndexThumbnail.test.js b/__tests__/src/components/SidebarIndexThumbnail.test.js
index 316bc8565..b2e356396 100644
--- a/__tests__/src/components/SidebarIndexThumbnail.test.js
+++ b/__tests__/src/components/SidebarIndexThumbnail.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import { Utils } from 'manifesto.js';
diff --git a/__tests__/src/components/ThumbnailCanvasGrouping.test.js b/__tests__/src/components/ThumbnailCanvasGrouping.test.js
index 23208396e..1442a8784 100644
--- a/__tests__/src/components/ThumbnailCanvasGrouping.test.js
+++ b/__tests__/src/components/ThumbnailCanvasGrouping.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import { ThumbnailCanvasGrouping } from '../../../src/components/ThumbnailCanvasGrouping';
diff --git a/__tests__/src/components/ThumbnailNavigation.test.js b/__tests__/src/components/ThumbnailNavigation.test.js
index 671738378..cfeaa4621 100644
--- a/__tests__/src/components/ThumbnailNavigation.test.js
+++ b/__tests__/src/components/ThumbnailNavigation.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import { ThumbnailNavigation } from '../../../src/components/ThumbnailNavigation';
diff --git a/__tests__/src/components/VideoViewer.test.js b/__tests__/src/components/VideoViewer.test.js
index 7b3521c08..7802ccb3b 100644
--- a/__tests__/src/components/VideoViewer.test.js
+++ b/__tests__/src/components/VideoViewer.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { VideoViewer } from '../../../src/components/VideoViewer';
 
diff --git a/__tests__/src/components/ViewerInfo.test.js b/__tests__/src/components/ViewerInfo.test.js
index d1abda258..2700970c4 100644
--- a/__tests__/src/components/ViewerInfo.test.js
+++ b/__tests__/src/components/ViewerInfo.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Typography } from '@material-ui/core';
 import { ViewerInfo } from '../../../src/components/ViewerInfo';
diff --git a/__tests__/src/components/ViewerNavigation.test.js b/__tests__/src/components/ViewerNavigation.test.js
index 36ffe068b..1c4efd3c4 100644
--- a/__tests__/src/components/ViewerNavigation.test.js
+++ b/__tests__/src/components/ViewerNavigation.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import NavigationIcon from '@material-ui/icons/PlayCircleOutlineSharp';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
diff --git a/__tests__/src/components/Window.test.js b/__tests__/src/components/Window.test.js
index 78bd9f388..cfb492011 100644
--- a/__tests__/src/components/Window.test.js
+++ b/__tests__/src/components/Window.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Window } from '../../../src/components/Window';
 import WindowTopBar from '../../../src/containers/WindowTopBar';
diff --git a/__tests__/src/components/WindowAuthenticationBar.test.js b/__tests__/src/components/WindowAuthenticationBar.test.js
index bab84214d..a75e46d4a 100644
--- a/__tests__/src/components/WindowAuthenticationBar.test.js
+++ b/__tests__/src/components/WindowAuthenticationBar.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Button from '@material-ui/core/Button';
 import Collapse from '@material-ui/core/Collapse';
diff --git a/__tests__/src/components/WindowCanvasNavigationControls.test.js b/__tests__/src/components/WindowCanvasNavigationControls.test.js
index 3ef2240be..16a7f1154 100644
--- a/__tests__/src/components/WindowCanvasNavigationControls.test.js
+++ b/__tests__/src/components/WindowCanvasNavigationControls.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Paper from '@material-ui/core/Paper';
 import Typography from '@material-ui/core/Typography';
diff --git a/__tests__/src/components/WindowList.test.js b/__tests__/src/components/WindowList.test.js
index 116217093..35818ccb7 100644
--- a/__tests__/src/components/WindowList.test.js
+++ b/__tests__/src/components/WindowList.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Menu from '@material-ui/core/Menu';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/__tests__/src/components/WindowListButton.test.js b/__tests__/src/components/WindowListButton.test.js
index 6bdebd882..0cba161d6 100644
--- a/__tests__/src/components/WindowListButton.test.js
+++ b/__tests__/src/components/WindowListButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
 import WindowList from '../../../src/containers/WindowList';
diff --git a/__tests__/src/components/WindowSideBar.test.js b/__tests__/src/components/WindowSideBar.test.js
index 167de0ec0..95eb09ff4 100644
--- a/__tests__/src/components/WindowSideBar.test.js
+++ b/__tests__/src/components/WindowSideBar.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Drawer from '@material-ui/core/Drawer';
 import { WindowSideBar } from '../../../src/components/WindowSideBar';
diff --git a/__tests__/src/components/WindowSideBarAnnotationsPanel.test.js b/__tests__/src/components/WindowSideBarAnnotationsPanel.test.js
index 0ed166195..b07a4c4da 100644
--- a/__tests__/src/components/WindowSideBarAnnotationsPanel.test.js
+++ b/__tests__/src/components/WindowSideBarAnnotationsPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import CanvasAnnotations from '../../../src/containers/CanvasAnnotations';
diff --git a/__tests__/src/components/WindowSideBarButtons.test.js b/__tests__/src/components/WindowSideBarButtons.test.js
index abcb15d04..7fb8a94f8 100644
--- a/__tests__/src/components/WindowSideBarButtons.test.js
+++ b/__tests__/src/components/WindowSideBarButtons.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { mount } from 'enzyme';
 import Badge from '@material-ui/core/Badge';
 import Tabs from '@material-ui/core/Tabs';
diff --git a/__tests__/src/components/WindowSideBarCanvasPanel.test.js b/__tests__/src/components/WindowSideBarCanvasPanel.test.js
index 12ed93e36..3a9951f73 100644
--- a/__tests__/src/components/WindowSideBarCanvasPanel.test.js
+++ b/__tests__/src/components/WindowSideBarCanvasPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Utils } from 'manifesto.js';
 import compact from 'lodash/compact';
diff --git a/__tests__/src/components/WindowSideBarInfoPanel.test.js b/__tests__/src/components/WindowSideBarInfoPanel.test.js
index a986abb29..d830bd1a3 100644
--- a/__tests__/src/components/WindowSideBarInfoPanel.test.js
+++ b/__tests__/src/components/WindowSideBarInfoPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { WindowSideBarInfoPanel } from '../../../src/components/WindowSideBarInfoPanel';
 import CanvasInfo from '../../../src/containers/CanvasInfo';
diff --git a/__tests__/src/components/WindowThumbnailSettings.test.js b/__tests__/src/components/WindowThumbnailSettings.test.js
index 5a6c5282d..4d1605640 100644
--- a/__tests__/src/components/WindowThumbnailSettings.test.js
+++ b/__tests__/src/components/WindowThumbnailSettings.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import ListSubheader from '@material-ui/core/ListSubheader';
diff --git a/__tests__/src/components/WindowTopBar.test.js b/__tests__/src/components/WindowTopBar.test.js
index 92c832beb..69bf35bf2 100644
--- a/__tests__/src/components/WindowTopBar.test.js
+++ b/__tests__/src/components/WindowTopBar.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 
 import Toolbar from '@material-ui/core/Toolbar';
diff --git a/__tests__/src/components/WindowTopBarPluginArea.test.js b/__tests__/src/components/WindowTopBarPluginArea.test.js
index 31e9e2d33..1b9feb8be 100644
--- a/__tests__/src/components/WindowTopBarPluginArea.test.js
+++ b/__tests__/src/components/WindowTopBarPluginArea.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { WindowTopBarPluginArea } from '../../../src/components/WindowTopBarPluginArea';
 import { PluginHook } from '../../../src/components/PluginHook';
diff --git a/__tests__/src/components/WindowTopBarPluginMenu.test.js b/__tests__/src/components/WindowTopBarPluginMenu.test.js
index c27ef214d..f41e301d4 100644
--- a/__tests__/src/components/WindowTopBarPluginMenu.test.js
+++ b/__tests__/src/components/WindowTopBarPluginMenu.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Menu from '@material-ui/core/Menu';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
diff --git a/__tests__/src/components/WindowTopBarTitle.test.js b/__tests__/src/components/WindowTopBarTitle.test.js
index f3b01c10e..282b31673 100644
--- a/__tests__/src/components/WindowTopBarTitle.test.js
+++ b/__tests__/src/components/WindowTopBarTitle.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Skeleton from '@material-ui/lab/Skeleton';
 
diff --git a/__tests__/src/components/WindowTopMenu.test.js b/__tests__/src/components/WindowTopMenu.test.js
index 3eacc72fb..147240de3 100644
--- a/__tests__/src/components/WindowTopMenu.test.js
+++ b/__tests__/src/components/WindowTopMenu.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Menu from '@material-ui/core/Menu';
 import WindowThumbnailSettings from '../../../src/containers/WindowThumbnailSettings';
diff --git a/__tests__/src/components/WindowTopMenuButton.test.js b/__tests__/src/components/WindowTopMenuButton.test.js
index 37c147c04..2dc7c9501 100644
--- a/__tests__/src/components/WindowTopMenuButton.test.js
+++ b/__tests__/src/components/WindowTopMenuButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import WindowTopMenu from '../../../src/containers/WindowTopMenu';
 import { WindowTopMenuButton } from '../../../src/components/WindowTopMenuButton';
diff --git a/__tests__/src/components/WindowViewSettings.test.js b/__tests__/src/components/WindowViewSettings.test.js
index 51886769e..61c11a2bc 100644
--- a/__tests__/src/components/WindowViewSettings.test.js
+++ b/__tests__/src/components/WindowViewSettings.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { mount } from 'enzyme';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import ListSubheader from '@material-ui/core/ListSubheader';
diff --git a/__tests__/src/components/WindowViewer.test.js b/__tests__/src/components/WindowViewer.test.js
index 7535e7437..6c7af5c44 100644
--- a/__tests__/src/components/WindowViewer.test.js
+++ b/__tests__/src/components/WindowViewer.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { WindowViewer } from '../../../src/components/WindowViewer';
 import WindowCanvasNavigationControls from '../../../src/containers/WindowCanvasNavigationControls';
diff --git a/__tests__/src/components/Workspace.test.js b/__tests__/src/components/Workspace.test.js
index 8852772d7..fc71c76c8 100644
--- a/__tests__/src/components/Workspace.test.js
+++ b/__tests__/src/components/Workspace.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
 import WorkspaceMosaic from '../../../src/containers/WorkspaceMosaic';
diff --git a/__tests__/src/components/WorkspaceAdd.test.js b/__tests__/src/components/WorkspaceAdd.test.js
index 9398f7e13..ce61aa599 100644
--- a/__tests__/src/components/WorkspaceAdd.test.js
+++ b/__tests__/src/components/WorkspaceAdd.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import AppBar from '@material-ui/core/AppBar';
 import Drawer from '@material-ui/core/Drawer';
diff --git a/__tests__/src/components/WorkspaceAddButton.test.js b/__tests__/src/components/WorkspaceAddButton.test.js
index cd1a65c0d..820906f0a 100644
--- a/__tests__/src/components/WorkspaceAddButton.test.js
+++ b/__tests__/src/components/WorkspaceAddButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Fab from '@material-ui/core/Fab';
 import Typography from '@material-ui/core/Typography';
diff --git a/__tests__/src/components/WorkspaceArea.test.js b/__tests__/src/components/WorkspaceArea.test.js
index 462385e1d..679439458 100644
--- a/__tests__/src/components/WorkspaceArea.test.js
+++ b/__tests__/src/components/WorkspaceArea.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import WorkspaceControlPanel from '../../../src/containers/WorkspaceControlPanel';
 import Workspace from '../../../src/containers/Workspace';
diff --git a/__tests__/src/components/WorkspaceControlPanel.test.js b/__tests__/src/components/WorkspaceControlPanel.test.js
index 591ca3650..5da5dae95 100644
--- a/__tests__/src/components/WorkspaceControlPanel.test.js
+++ b/__tests__/src/components/WorkspaceControlPanel.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import AppBar from '@material-ui/core/AppBar';
 import createStore from '../../../src/state/createStore';
diff --git a/__tests__/src/components/WorkspaceControlPanelButtons.test.js b/__tests__/src/components/WorkspaceControlPanelButtons.test.js
index c94ecdd0d..5f0125072 100644
--- a/__tests__/src/components/WorkspaceControlPanelButtons.test.js
+++ b/__tests__/src/components/WorkspaceControlPanelButtons.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import WorkspaceMenuButton from '../../../src/containers/WorkspaceMenuButton';
 import FullScreenButton from '../../../src/containers/FullScreenButton';
diff --git a/__tests__/src/components/WorkspaceElastic.test.js b/__tests__/src/components/WorkspaceElastic.test.js
index 5a0e59ca7..0d436f7d4 100644
--- a/__tests__/src/components/WorkspaceElastic.test.js
+++ b/__tests__/src/components/WorkspaceElastic.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Rnd } from 'react-rnd';
 import ResizeObserver from 'react-resize-observer';
diff --git a/__tests__/src/components/WorkspaceElasticWindow.test.js b/__tests__/src/components/WorkspaceElasticWindow.test.js
index eda0e2bc7..3a5673a32 100644
--- a/__tests__/src/components/WorkspaceElasticWindow.test.js
+++ b/__tests__/src/components/WorkspaceElasticWindow.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { Rnd } from 'react-rnd';
 import WorkspaceElasticWindow from '../../../src/components/WorkspaceElasticWindow';
diff --git a/__tests__/src/components/WorkspaceExport.test.js b/__tests__/src/components/WorkspaceExport.test.js
index 94450b516..f8392f249 100644
--- a/__tests__/src/components/WorkspaceExport.test.js
+++ b/__tests__/src/components/WorkspaceExport.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Dialog from '@material-ui/core/Dialog';
 import Button from '@material-ui/core/Button';
diff --git a/__tests__/src/components/WorkspaceImport.test.js b/__tests__/src/components/WorkspaceImport.test.js
index e750a2bd4..02b54e126 100644
--- a/__tests__/src/components/WorkspaceImport.test.js
+++ b/__tests__/src/components/WorkspaceImport.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Dialog from '@material-ui/core/Dialog';
 import TextField from '@material-ui/core/TextField';
diff --git a/__tests__/src/components/WorkspaceMenu.test.js b/__tests__/src/components/WorkspaceMenu.test.js
index ab0087528..a8c56fe50 100644
--- a/__tests__/src/components/WorkspaceMenu.test.js
+++ b/__tests__/src/components/WorkspaceMenu.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Menu from '@material-ui/core/Menu';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/__tests__/src/components/WorkspaceMenuButton.test.js b/__tests__/src/components/WorkspaceMenuButton.test.js
index 219c39b10..3e8a1a0fd 100644
--- a/__tests__/src/components/WorkspaceMenuButton.test.js
+++ b/__tests__/src/components/WorkspaceMenuButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
 import { WorkspaceMenuButton } from '../../../src/components/WorkspaceMenuButton';
diff --git a/__tests__/src/components/WorkspaceMosaic.test.js b/__tests__/src/components/WorkspaceMosaic.test.js
index 868a37e93..9fde83e67 100644
--- a/__tests__/src/components/WorkspaceMosaic.test.js
+++ b/__tests__/src/components/WorkspaceMosaic.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import { MosaicWithoutDragDropContext } from 'react-mosaic-component';
 import MosaicRenderPreview from '../../../src/containers/MosaicRenderPreview';
diff --git a/__tests__/src/components/WorkspaceOptionsButton.test.js b/__tests__/src/components/WorkspaceOptionsButton.test.js
index ad88119b4..d9b20cd02 100644
--- a/__tests__/src/components/WorkspaceOptionsButton.test.js
+++ b/__tests__/src/components/WorkspaceOptionsButton.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
 import WorkspaceOptionsMenu from '../../../src/containers/WorkspaceOptionsMenu';
diff --git a/__tests__/src/components/WorkspaceOptionsMenu.test.js b/__tests__/src/components/WorkspaceOptionsMenu.test.js
index ec1401c90..5f60cbf35 100644
--- a/__tests__/src/components/WorkspaceOptionsMenu.test.js
+++ b/__tests__/src/components/WorkspaceOptionsMenu.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MenuItem from '@material-ui/core/MenuItem';
 import WorkspaceExport from '../../../src/containers/WorkspaceExport';
diff --git a/__tests__/src/components/WorkspaceSelectionDialog.test.js b/__tests__/src/components/WorkspaceSelectionDialog.test.js
index bd40f59ea..895a4a68f 100644
--- a/__tests__/src/components/WorkspaceSelectionDialog.test.js
+++ b/__tests__/src/components/WorkspaceSelectionDialog.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import Dialog from '@material-ui/core/Dialog';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/__tests__/src/components/ZoomControls.test.js b/__tests__/src/components/ZoomControls.test.js
index 2b77fc3f7..e7e49671b 100644
--- a/__tests__/src/components/ZoomControls.test.js
+++ b/__tests__/src/components/ZoomControls.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import { shallow } from 'enzyme';
 import MiradorMenuButton from '../../../src/containers/MiradorMenuButton';
 import { ZoomControls } from '../../../src/components/ZoomControls';
diff --git a/__tests__/src/extend/withPlugins.test.js b/__tests__/src/extend/withPlugins.test.js
index 7fdda8ce5..cbf623334 100644
--- a/__tests__/src/extend/withPlugins.test.js
+++ b/__tests__/src/extend/withPlugins.test.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import { mount } from 'enzyme';
 import { withPlugins } from '../../../src/extend/withPlugins';
diff --git a/babel.config.js b/babel.config.js
index fc7376053..eb0b0f586 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -23,7 +23,6 @@ module.exports = function (api) {
           node: 'current',
         },
       },
-      '@babel/preset-react',
     ],
     (isProductionEnv || isDevelopmentEnv) && [
       '@babel/preset-env',
@@ -39,6 +38,7 @@ module.exports = function (api) {
       '@babel/preset-react',
       {
         development: isDevelopmentEnv || isTestEnv,
+        runtime: 'automatic',
         useBuiltIns: true,
       },
     ],
diff --git a/package.json b/package.json
index 84b34eb94..f607acfe4 100644
--- a/package.json
+++ b/package.json
@@ -115,8 +115,8 @@
     "jest-puppeteer": "^6.1.0",
     "jsdom": "^21.0.0",
     "puppeteer": "^13.5.1",
-    "react": "^16.8.6",
-    "react-dom": "^16.8.6",
+    "react": "^16.14.0",
+    "react-dom": "^16.14.0",
     "react-refresh": "^0.14.0",
     "redux-mock-store": "^1.5.1",
     "redux-saga-test-plan": "^4.0.0-rc.3",
@@ -128,7 +128,7 @@
     "webpack-dev-server": "^4.7.4"
   },
   "peerDependencies": {
-    "react": "^16.8.3",
-    "react-dom": "^16.8.3"
+    "react": "^16.14.0",
+    "react-dom": "^16.14.0"
   }
 }
diff --git a/src/components/AccessTokenSender.js b/src/components/AccessTokenSender.js
index 90a731d6c..99a396fea 100644
--- a/src/components/AccessTokenSender.js
+++ b/src/components/AccessTokenSender.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import IComCom from 'icomcom-react';
 
diff --git a/src/components/AnnotationSettings.js b/src/components/AnnotationSettings.js
index 29ec4a843..dd91bdc75 100644
--- a/src/components/AnnotationSettings.js
+++ b/src/components/AnnotationSettings.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import VisibilityIcon from '@material-ui/icons/VisibilitySharp';
 import VisibilityOffIcon from '@material-ui/icons/VisibilityOffSharp';
diff --git a/src/components/AnnotationsOverlay.js b/src/components/AnnotationsOverlay.js
index 454d407ec..f68ced247 100644
--- a/src/components/AnnotationsOverlay.js
+++ b/src/components/AnnotationsOverlay.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import ReactDOM from 'react-dom';
 import PropTypes from 'prop-types';
 import isEqual from 'lodash/isEqual';
@@ -50,7 +50,7 @@ export class AnnotationsOverlay extends Component {
   constructor(props) {
     super(props);
 
-    this.ref = React.createRef();
+    this.ref = createRef();
     this.osdCanvasOverlay = null;
     // An initial value for the updateCanvas method
     this.updateCanvas = () => {};
diff --git a/src/components/App.js b/src/components/App.js
index ed42b7aab..9c12117fc 100644
--- a/src/components/App.js
+++ b/src/components/App.js
@@ -1,4 +1,4 @@
-import React, { Component, lazy, Suspense } from 'react';
+import { Component, lazy, Suspense } from 'react';
 import PropTypes from 'prop-types';
 import PluginProvider from '../extend/PluginProvider';
 import AppProviders from '../containers/AppProviders';
diff --git a/src/components/AppProviders.js b/src/components/AppProviders.js
index 25b6cb13b..aab7a26ed 100644
--- a/src/components/AppProviders.js
+++ b/src/components/AppProviders.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import { FullScreen, useFullScreenHandle } from 'react-full-screen';
 import { I18nextProvider } from 'react-i18next';
diff --git a/src/components/AttributionPanel.js b/src/components/AttributionPanel.js
index dc6e2462e..c2d8cc697 100644
--- a/src/components/AttributionPanel.js
+++ b/src/components/AttributionPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import Link from '@material-ui/core/Link';
diff --git a/src/components/AudioViewer.js b/src/components/AudioViewer.js
index 15d51c3d1..ab7b9d688 100644
--- a/src/components/AudioViewer.js
+++ b/src/components/AudioViewer.js
@@ -1,4 +1,4 @@
-import React, { Component, Fragment } from 'react';
+import { Component, Fragment } from 'react';
 import PropTypes from 'prop-types';
 
 /** */
diff --git a/src/components/BackgroundPluginArea.js b/src/components/BackgroundPluginArea.js
index 0972993b2..c59c745e6 100644
--- a/src/components/BackgroundPluginArea.js
+++ b/src/components/BackgroundPluginArea.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import ns from '../config/css-ns';
 import { PluginHook } from './PluginHook';
diff --git a/src/components/Branding.js b/src/components/Branding.js
index 6c9b2b15f..d2f4d4f9e 100644
--- a/src/components/Branding.js
+++ b/src/components/Branding.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import IconButton from '@material-ui/core/IconButton';
 import Typography from '@material-ui/core/Typography';
diff --git a/src/components/CanvasAnnotations.js b/src/components/CanvasAnnotations.js
index 37263106c..5d5b53793 100644
--- a/src/components/CanvasAnnotations.js
+++ b/src/components/CanvasAnnotations.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import clsx from 'clsx';
 import Chip from '@material-ui/core/Chip';
diff --git a/src/components/CanvasInfo.js b/src/components/CanvasInfo.js
index fb735316e..93f4b3124 100644
--- a/src/components/CanvasInfo.js
+++ b/src/components/CanvasInfo.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import CollapsibleSection from '../containers/CollapsibleSection';
diff --git a/src/components/CanvasLayers.js b/src/components/CanvasLayers.js
index 7847eefbf..99e400ca2 100644
--- a/src/components/CanvasLayers.js
+++ b/src/components/CanvasLayers.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import clsx from 'clsx';
 import { v4 as uuid } from 'uuid';
diff --git a/src/components/ChangeThemeDialog.js b/src/components/ChangeThemeDialog.js
index e5bb6102d..c01da4ce8 100644
--- a/src/components/ChangeThemeDialog.js
+++ b/src/components/ChangeThemeDialog.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import {
   Dialog,
   DialogTitle,
diff --git a/src/components/CollapsibleSection.js b/src/components/CollapsibleSection.js
index eca0a2ff3..8773c9b6d 100644
--- a/src/components/CollapsibleSection.js
+++ b/src/components/CollapsibleSection.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import KeyboardArrowDown from '@material-ui/icons/KeyboardArrowDownSharp';
diff --git a/src/components/CollectionDialog.js b/src/components/CollectionDialog.js
index df4d90124..71ecb472e 100644
--- a/src/components/CollectionDialog.js
+++ b/src/components/CollectionDialog.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import {
   Button,
diff --git a/src/components/CollectionInfo.js b/src/components/CollectionInfo.js
index 15670b1c9..4cd3d3961 100644
--- a/src/components/CollectionInfo.js
+++ b/src/components/CollectionInfo.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import Typography from '@material-ui/core/Typography';
diff --git a/src/components/CompanionArea.js b/src/components/CompanionArea.js
index fbdaf0c73..bdf7610b6 100644
--- a/src/components/CompanionArea.js
+++ b/src/components/CompanionArea.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Slide from '@material-ui/core/Slide';
 import ArrowLeftIcon from '@material-ui/icons/ArrowLeftSharp';
diff --git a/src/components/CompanionWindow.js b/src/components/CompanionWindow.js
index 702655582..9cf4fe29a 100644
--- a/src/components/CompanionWindow.js
+++ b/src/components/CompanionWindow.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Children, cloneElement, Component } from 'react';
 import PropTypes from 'prop-types';
 import CloseIcon from '@material-ui/icons/CloseSharp';
 import OpenInNewIcon from '@material-ui/icons/OpenInNewSharp';
@@ -74,9 +74,9 @@ export class CompanionWindow extends Component {
 
     const isBottom = (position === 'bottom' || position === 'far-bottom');
 
-    const childrenWithAdditionalProps = React.Children.map(children, (child) => {
+    const childrenWithAdditionalProps = Children.map(children, (child) => {
       if (!child) return null;
-      return React.cloneElement(
+      return cloneElement(
         child,
         {
           parentactions: {
diff --git a/src/components/CompanionWindowFactory.js b/src/components/CompanionWindowFactory.js
index 7bc32d1e8..9676af994 100644
--- a/src/components/CompanionWindowFactory.js
+++ b/src/components/CompanionWindowFactory.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createElement, Component } from 'react';
 import PropTypes from 'prop-types';
 import CompanionWindowRegistry from '../lib/CompanionWindowRegistry';
 import CompanionWindow from '../containers/CompanionWindow';
@@ -62,7 +62,7 @@ export class CompanionWindowFactory extends Component {
 
     if (!type) return null;
 
-    return React.createElement(type, { id, windowId });
+    return createElement(type, { id, windowId });
   }
 }
 
diff --git a/src/components/CustomPanel.js b/src/components/CustomPanel.js
index 5d0dcc0ce..cf80b1d49 100644
--- a/src/components/CustomPanel.js
+++ b/src/components/CustomPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import CompanionWindow from '../containers/CompanionWindow';
 
diff --git a/src/components/ErrorContent.js b/src/components/ErrorContent.js
index f122e0c22..d6e996ece 100644
--- a/src/components/ErrorContent.js
+++ b/src/components/ErrorContent.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Accordion from '@material-ui/core/Accordion';
 import AccordionSummary from '@material-ui/core/AccordionSummary';
diff --git a/src/components/ErrorDialog.js b/src/components/ErrorDialog.js
index fcd83eaa3..89336efea 100644
--- a/src/components/ErrorDialog.js
+++ b/src/components/ErrorDialog.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Dialog from '@material-ui/core/Dialog';
 import DialogContent from '@material-ui/core/DialogContent';
 import DialogTitle from '@material-ui/core/DialogTitle';
diff --git a/src/components/FullScreenButton.js b/src/components/FullScreenButton.js
index 40361176c..3e6b8a868 100644
--- a/src/components/FullScreenButton.js
+++ b/src/components/FullScreenButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import FullscreenIcon from '@material-ui/icons/FullscreenSharp';
 import FullscreenExitIcon from '@material-ui/icons/FullscreenExitSharp';
 import PropTypes from 'prop-types';
diff --git a/src/components/GalleryView.js b/src/components/GalleryView.js
index 3cd865608..3dc9cfd52 100644
--- a/src/components/GalleryView.js
+++ b/src/components/GalleryView.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Paper from '@material-ui/core/Paper';
 import GalleryViewThumbnail from '../containers/GalleryViewThumbnail';
diff --git a/src/components/GalleryViewThumbnail.js b/src/components/GalleryViewThumbnail.js
index 5ea6d433e..961c38af9 100644
--- a/src/components/GalleryViewThumbnail.js
+++ b/src/components/GalleryViewThumbnail.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import Avatar from '@material-ui/core/Avatar';
 import Chip from '@material-ui/core/Chip';
@@ -18,7 +18,7 @@ export class GalleryViewThumbnail extends Component {
   constructor(props) {
     super(props);
 
-    this.myRef = React.createRef();
+    this.myRef = createRef();
     this.state = { requestedAnnotations: false };
 
     this.handleSelect = this.handleSelect.bind(this);
diff --git a/src/components/IIIFAuthentication.js b/src/components/IIIFAuthentication.js
index c7d4c3ec6..c804e6971 100644
--- a/src/components/IIIFAuthentication.js
+++ b/src/components/IIIFAuthentication.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import { AccessTokenSender } from './AccessTokenSender';
 import { NewWindow } from './NewWindow';
diff --git a/src/components/IIIFDropTarget.js b/src/components/IIIFDropTarget.js
index 8bbbc77ff..8b48beefc 100644
--- a/src/components/IIIFDropTarget.js
+++ b/src/components/IIIFDropTarget.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import Backdrop from '@material-ui/core/Backdrop';
 import InsertDriveFileSharpIcon from '@material-ui/icons/InsertDriveFileSharp';
diff --git a/src/components/IIIFThumbnail.js b/src/components/IIIFThumbnail.js
index a4f036f6d..de2aa4317 100644
--- a/src/components/IIIFThumbnail.js
+++ b/src/components/IIIFThumbnail.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import { InView } from 'react-intersection-observer';
diff --git a/src/components/LabelValueMetadata.js b/src/components/LabelValueMetadata.js
index 91fd0b40d..d68650f40 100644
--- a/src/components/LabelValueMetadata.js
+++ b/src/components/LabelValueMetadata.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import SanitizedHtml from '../containers/SanitizedHtml';
diff --git a/src/components/LanguageSettings.js b/src/components/LanguageSettings.js
index 5296dee06..7901c4e44 100644
--- a/src/components/LanguageSettings.js
+++ b/src/components/LanguageSettings.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import ListItemIcon from '@material-ui/core/ListItemIcon';
 import ListItemText from '@material-ui/core/ListItemText';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/src/components/LayersPanel.js b/src/components/LayersPanel.js
index 09cda41e9..9575b9f8e 100644
--- a/src/components/LayersPanel.js
+++ b/src/components/LayersPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import CompanionWindow from '../containers/CompanionWindow';
 import CanvasLayers from '../containers/CanvasLayers';
diff --git a/src/components/LocalePicker.js b/src/components/LocalePicker.js
index 24cf3bd7b..beb212324 100644
--- a/src/components/LocalePicker.js
+++ b/src/components/LocalePicker.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import MenuItem from '@material-ui/core/MenuItem';
 import FormControl from '@material-ui/core/FormControl';
diff --git a/src/components/ManifestForm.js b/src/components/ManifestForm.js
index 19702f071..18d304cd6 100644
--- a/src/components/ManifestForm.js
+++ b/src/components/ManifestForm.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import Grid from '@material-ui/core/Grid';
diff --git a/src/components/ManifestInfo.js b/src/components/ManifestInfo.js
index d597983c1..a66be288b 100644
--- a/src/components/ManifestInfo.js
+++ b/src/components/ManifestInfo.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import CollapsibleSection from '../containers/CollapsibleSection';
diff --git a/src/components/ManifestListItem.js b/src/components/ManifestListItem.js
index edf14971b..accd5ede5 100644
--- a/src/components/ManifestListItem.js
+++ b/src/components/ManifestListItem.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import ListItem from '@material-ui/core/ListItem';
 import ButtonBase from '@material-ui/core/ButtonBase';
@@ -16,7 +16,7 @@ import ns from '../config/css-ns';
  */
 
 /** */
-export class ManifestListItem extends React.Component {
+export class ManifestListItem extends Component {
   /** */
   constructor(props) {
     super(props);
diff --git a/src/components/ManifestListItemError.js b/src/components/ManifestListItemError.js
index a6a3fb43a..3d63e48af 100644
--- a/src/components/ManifestListItemError.js
+++ b/src/components/ManifestListItemError.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import ErrorIcon from '@material-ui/icons/ErrorOutlineSharp';
diff --git a/src/components/ManifestRelatedLinks.js b/src/components/ManifestRelatedLinks.js
index 943d287ff..62436ea79 100644
--- a/src/components/ManifestRelatedLinks.js
+++ b/src/components/ManifestRelatedLinks.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import Link from '@material-ui/core/Link';
diff --git a/src/components/MinimalWindow.js b/src/components/MinimalWindow.js
index 79ecf36ea..f19b35385 100644
--- a/src/components/MinimalWindow.js
+++ b/src/components/MinimalWindow.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import MenuIcon from '@material-ui/icons/MenuSharp';
 import cn from 'classnames';
diff --git a/src/components/MiradorMenuButton.js b/src/components/MiradorMenuButton.js
index 83c13b261..d528a7aef 100644
--- a/src/components/MiradorMenuButton.js
+++ b/src/components/MiradorMenuButton.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import Badge from '@material-ui/core/Badge';
 import IconButton from '@material-ui/core/IconButton';
diff --git a/src/components/MosaicRenderPreview.js b/src/components/MosaicRenderPreview.js
index 3957f5008..201a650a3 100644
--- a/src/components/MosaicRenderPreview.js
+++ b/src/components/MosaicRenderPreview.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import MinimalWindow from '../containers/MinimalWindow';
 
diff --git a/src/components/NestedMenu.js b/src/components/NestedMenu.js
index 6831c4de3..65fcfeec5 100644
--- a/src/components/NestedMenu.js
+++ b/src/components/NestedMenu.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import ListItemIcon from '@material-ui/core/ListItemIcon';
 import ListItemText from '@material-ui/core/ListItemText';
diff --git a/src/components/OpenSeadragonViewer.js b/src/components/OpenSeadragonViewer.js
index 3f352eddd..5103f6994 100644
--- a/src/components/OpenSeadragonViewer.js
+++ b/src/components/OpenSeadragonViewer.js
@@ -1,4 +1,6 @@
-import React, { Component } from 'react';
+import {
+  createRef, Children, cloneElement, Component,
+} from 'react';
 import PropTypes from 'prop-types';
 import debounce from 'lodash/debounce';
 import isEqual from 'lodash/isEqual';
@@ -22,8 +24,8 @@ export class OpenSeadragonViewer extends Component {
     super(props);
 
     this.state = { viewer: undefined };
-    this.ref = React.createRef();
-    this.apiRef = React.createRef();
+    this.ref = createRef();
+    this.apiRef = createRef();
     OSDReferences.set(props.windowId, this.apiRef);
     this.onCanvasMouseMove = debounce(this.onCanvasMouseMove.bind(this), 10);
     this.onViewportChange = this.onViewportChange.bind(this);
@@ -345,8 +347,8 @@ export class OpenSeadragonViewer extends Component {
     } = this.props;
     const { viewer } = this.state;
 
-    const enhancedChildren = React.Children.map(children, child => (
-      React.cloneElement(
+    const enhancedChildren = Children.map(children, child => (
+      cloneElement(
         child,
         {
           zoomToWorld: this.zoomToWorld,
diff --git a/src/components/PluginHook.js b/src/components/PluginHook.js
index 5c16c579c..0119fcf08 100644
--- a/src/components/PluginHook.js
+++ b/src/components/PluginHook.js
@@ -1,13 +1,13 @@
-import React from 'react';
+import { forwardRef, isValidElement, cloneElement } from 'react';
 
 /** Renders plugins */
-export const PluginHook = React.forwardRef((props, ref) => {
+export const PluginHook = forwardRef((props, ref) => {
   const { PluginComponents } = props; // eslint-disable-line react/prop-types
   const { classes, ...otherProps } = props; // eslint-disable-line react/prop-types
   return PluginComponents ? (
     PluginComponents.map((PluginComponent, index) => ( // eslint-disable-line react/prop-types
-      React.isValidElement(PluginComponent)
-        ? React.cloneElement(PluginComponent, { ...otherProps, ref })
+      isValidElement(PluginComponent)
+        ? cloneElement(PluginComponent, { ...otherProps, ref })
         : (
           <PluginComponent
             ref={ref}
diff --git a/src/components/PrimaryWindow.js b/src/components/PrimaryWindow.js
index 05cecad9b..988b6784a 100644
--- a/src/components/PrimaryWindow.js
+++ b/src/components/PrimaryWindow.js
@@ -1,4 +1,4 @@
-import React, { Component, lazy, Suspense } from 'react';
+import { Component, lazy, Suspense } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import WindowSideBar from '../containers/WindowSideBar';
diff --git a/src/components/SanitizedHtml.js b/src/components/SanitizedHtml.js
index c1dcd5fa0..da9bcd702 100644
--- a/src/components/SanitizedHtml.js
+++ b/src/components/SanitizedHtml.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import DOMPurify from 'dompurify';
 import ns from '../config/css-ns';
diff --git a/src/components/ScrollIndicatedDialogContent.js b/src/components/ScrollIndicatedDialogContent.js
index 4fd3cb5f5..a8de5229d 100644
--- a/src/components/ScrollIndicatedDialogContent.js
+++ b/src/components/ScrollIndicatedDialogContent.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 import DialogContent from '@material-ui/core/DialogContent';
 
diff --git a/src/components/ScrollTo.js b/src/components/ScrollTo.js
index d69f91d1d..7d7f8a82c 100644
--- a/src/components/ScrollTo.js
+++ b/src/components/ScrollTo.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 
 /**
@@ -9,7 +9,7 @@ export class ScrollTo extends Component {
   constructor(props) {
     super(props);
 
-    this.scrollToRef = React.createRef();
+    this.scrollToRef = createRef();
   }
 
   /** */
diff --git a/src/components/SearchHit.js b/src/components/SearchHit.js
index f27228fe1..7feac2d97 100644
--- a/src/components/SearchHit.js
+++ b/src/components/SearchHit.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import clsx from 'clsx';
 import Button from '@material-ui/core/Button';
diff --git a/src/components/SearchPanel.js b/src/components/SearchPanel.js
index c3430660b..375e39951 100644
--- a/src/components/SearchPanel.js
+++ b/src/components/SearchPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import Chip from '@material-ui/core/Chip';
@@ -13,7 +13,7 @@ export class SearchPanel extends Component {
   constructor(props) {
     super(props);
 
-    this.containerRef = React.createRef();
+    this.containerRef = createRef();
   }
 
   /** */
diff --git a/src/components/SearchPanelControls.js b/src/components/SearchPanelControls.js
index 391f57bca..af2e53f3f 100644
--- a/src/components/SearchPanelControls.js
+++ b/src/components/SearchPanelControls.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import deburr from 'lodash/deburr';
 import debounce from 'lodash/debounce';
diff --git a/src/components/SearchPanelNavigation.js b/src/components/SearchPanelNavigation.js
index 21c76dda1..72eb84e1f 100644
--- a/src/components/SearchPanelNavigation.js
+++ b/src/components/SearchPanelNavigation.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import ChevronLeftIcon from '@material-ui/icons/ChevronLeftSharp';
 import ChevronRightIcon from '@material-ui/icons/ChevronRightSharp';
diff --git a/src/components/SearchResults.js b/src/components/SearchResults.js
index bb75972a8..912f90847 100644
--- a/src/components/SearchResults.js
+++ b/src/components/SearchResults.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import List from '@material-ui/core/List';
diff --git a/src/components/SelectCollection.js b/src/components/SelectCollection.js
index aeb98e712..c3d275a17 100644
--- a/src/components/SelectCollection.js
+++ b/src/components/SelectCollection.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import Grid from '@material-ui/core/Grid';
diff --git a/src/components/SidebarIndexItem.js b/src/components/SidebarIndexItem.js
index b880e180a..d6b1a9666 100644
--- a/src/components/SidebarIndexItem.js
+++ b/src/components/SidebarIndexItem.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import classNames from 'classnames';
diff --git a/src/components/SidebarIndexList.js b/src/components/SidebarIndexList.js
index ba88ee4ae..104019bed 100644
--- a/src/components/SidebarIndexList.js
+++ b/src/components/SidebarIndexList.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import MenuList from '@material-ui/core/MenuList';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/src/components/SidebarIndexTableOfContents.js b/src/components/SidebarIndexTableOfContents.js
index badc3e77f..bfcf61bff 100644
--- a/src/components/SidebarIndexTableOfContents.js
+++ b/src/components/SidebarIndexTableOfContents.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import TreeView from '@material-ui/lab/TreeView';
 import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
diff --git a/src/components/SidebarIndexThumbnail.js b/src/components/SidebarIndexThumbnail.js
index 5ac21782e..7abd1973d 100644
--- a/src/components/SidebarIndexThumbnail.js
+++ b/src/components/SidebarIndexThumbnail.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import classNames from 'classnames';
diff --git a/src/components/ThumbnailCanvasGrouping.js b/src/components/ThumbnailCanvasGrouping.js
index 72f08bb4a..6e8902339 100644
--- a/src/components/ThumbnailCanvasGrouping.js
+++ b/src/components/ThumbnailCanvasGrouping.js
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import IIIFThumbnail from '../containers/IIIFThumbnail';
diff --git a/src/components/ThumbnailNavigation.js b/src/components/ThumbnailNavigation.js
index e7c6db294..4dda633c9 100644
--- a/src/components/ThumbnailNavigation.js
+++ b/src/components/ThumbnailNavigation.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import Paper from '@material-ui/core/Paper';
 import AutoSizer from 'react-virtualized-auto-sizer';
@@ -23,7 +23,7 @@ export class ThumbnailNavigation extends Component {
     this.handleKeyUp = this.handleKeyUp.bind(this);
     this.nextCanvas = this.nextCanvas.bind(this);
     this.previousCanvas = this.previousCanvas.bind(this);
-    this.gridRef = React.createRef();
+    this.gridRef = createRef();
   }
 
   /**
diff --git a/src/components/VideoViewer.js b/src/components/VideoViewer.js
index bb1d03270..e8a3d617d 100644
--- a/src/components/VideoViewer.js
+++ b/src/components/VideoViewer.js
@@ -1,4 +1,4 @@
-import React, { Component, Fragment } from 'react';
+import { Component, Fragment } from 'react';
 import PropTypes from 'prop-types';
 
 /** */
diff --git a/src/components/ViewerInfo.js b/src/components/ViewerInfo.js
index e9ec8a817..595ed37d0 100644
--- a/src/components/ViewerInfo.js
+++ b/src/components/ViewerInfo.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Typography from '@material-ui/core/Typography';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
diff --git a/src/components/ViewerNavigation.js b/src/components/ViewerNavigation.js
index b03a6946a..0253cefa5 100644
--- a/src/components/ViewerNavigation.js
+++ b/src/components/ViewerNavigation.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import NavigationIcon from '@material-ui/icons/PlayCircleOutlineSharp';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
diff --git a/src/components/Window.js b/src/components/Window.js
index 30462d2e7..6033c7691 100644
--- a/src/components/Window.js
+++ b/src/components/Window.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import cn from 'classnames';
 import Paper from '@material-ui/core/Paper';
diff --git a/src/components/WindowAuthenticationBar.js b/src/components/WindowAuthenticationBar.js
index 97a54f87d..bbfbd5a53 100644
--- a/src/components/WindowAuthenticationBar.js
+++ b/src/components/WindowAuthenticationBar.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Button from '@material-ui/core/Button';
 import Paper from '@material-ui/core/Paper';
diff --git a/src/components/WindowCanvasNavigationControls.js b/src/components/WindowCanvasNavigationControls.js
index 39e662db8..eaee4dc15 100644
--- a/src/components/WindowCanvasNavigationControls.js
+++ b/src/components/WindowCanvasNavigationControls.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import Paper from '@material-ui/core/Paper';
diff --git a/src/components/WindowList.js b/src/components/WindowList.js
index 5e45ad037..6b3adfcb9 100644
--- a/src/components/WindowList.js
+++ b/src/components/WindowList.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Menu from '@material-ui/core/Menu';
 import MenuItem from '@material-ui/core/MenuItem';
 import ListItemText from '@material-ui/core/ListItemText';
diff --git a/src/components/WindowListButton.js b/src/components/WindowListButton.js
index 7baa53f1b..68a9bd2ac 100644
--- a/src/components/WindowListButton.js
+++ b/src/components/WindowListButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import BookmarksIcon from '@material-ui/icons/BookmarksSharp';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
diff --git a/src/components/WindowSideBar.js b/src/components/WindowSideBar.js
index eaeceaae4..c6fbc6ef3 100644
--- a/src/components/WindowSideBar.js
+++ b/src/components/WindowSideBar.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import Drawer from '@material-ui/core/Drawer';
diff --git a/src/components/WindowSideBarAnnotationsPanel.js b/src/components/WindowSideBarAnnotationsPanel.js
index f5a131892..f5182e644 100644
--- a/src/components/WindowSideBarAnnotationsPanel.js
+++ b/src/components/WindowSideBarAnnotationsPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import AnnotationSettings from '../containers/AnnotationSettings';
@@ -14,7 +14,7 @@ export class WindowSideBarAnnotationsPanel extends Component {
   constructor(props) {
     super(props);
 
-    this.containerRef = React.createRef();
+    this.containerRef = createRef();
   }
 
   /**
diff --git a/src/components/WindowSideBarButtons.js b/src/components/WindowSideBarButtons.js
index fd4c717f3..edff59c2e 100644
--- a/src/components/WindowSideBarButtons.js
+++ b/src/components/WindowSideBarButtons.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Badge from '@material-ui/core/Badge';
 import Tabs from '@material-ui/core/Tabs';
diff --git a/src/components/WindowSideBarCanvasPanel.js b/src/components/WindowSideBarCanvasPanel.js
index 9d4e988f7..948fd4408 100644
--- a/src/components/WindowSideBarCanvasPanel.js
+++ b/src/components/WindowSideBarCanvasPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import Tabs from '@material-ui/core/Tabs';
 import Tab from '@material-ui/core/Tab';
@@ -26,7 +26,7 @@ export class WindowSideBarCanvasPanel extends Component {
     this.handleSequenceChange = this.handleSequenceChange.bind(this);
     this.handleVariantChange = this.handleVariantChange.bind(this);
 
-    this.containerRef = React.createRef();
+    this.containerRef = createRef();
   }
 
   /** */
diff --git a/src/components/WindowSideBarCollectionPanel.js b/src/components/WindowSideBarCollectionPanel.js
index cf58cccff..a6964ca77 100644
--- a/src/components/WindowSideBarCollectionPanel.js
+++ b/src/components/WindowSideBarCollectionPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import List from '@material-ui/core/List';
 import ListItem from '@material-ui/core/ListItem';
diff --git a/src/components/WindowSideBarInfoPanel.js b/src/components/WindowSideBarInfoPanel.js
index 8136fc66a..e2931f70e 100644
--- a/src/components/WindowSideBarInfoPanel.js
+++ b/src/components/WindowSideBarInfoPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import CompanionWindow from '../containers/CompanionWindow';
 import CanvasInfo from '../containers/CanvasInfo';
diff --git a/src/components/WindowThumbnailSettings.js b/src/components/WindowThumbnailSettings.js
index 9db790fc9..22b7eb57d 100644
--- a/src/components/WindowThumbnailSettings.js
+++ b/src/components/WindowThumbnailSettings.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import ListSubheader from '@material-ui/core/ListSubheader';
 import MenuItem from '@material-ui/core/MenuItem';
diff --git a/src/components/WindowTopBar.js b/src/components/WindowTopBar.js
index 6bb4cbd62..31795b9b9 100644
--- a/src/components/WindowTopBar.js
+++ b/src/components/WindowTopBar.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import MenuIcon from '@material-ui/icons/MenuSharp';
 import CloseIcon from '@material-ui/icons/CloseSharp';
diff --git a/src/components/WindowTopBarPluginArea.js b/src/components/WindowTopBarPluginArea.js
index 63e32ac03..f70e21e7e 100644
--- a/src/components/WindowTopBarPluginArea.js
+++ b/src/components/WindowTopBarPluginArea.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import { PluginHook } from './PluginHook';
 
 /**
diff --git a/src/components/WindowTopBarPluginMenu.js b/src/components/WindowTopBarPluginMenu.js
index f19331c03..a44ddf9d1 100644
--- a/src/components/WindowTopBarPluginMenu.js
+++ b/src/components/WindowTopBarPluginMenu.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import MoreVertIcon from '@material-ui/icons/MoreVertSharp';
 import Menu from '@material-ui/core/Menu';
diff --git a/src/components/WindowTopBarTitle.js b/src/components/WindowTopBarTitle.js
index bc2c46682..b47f00c2c 100644
--- a/src/components/WindowTopBarTitle.js
+++ b/src/components/WindowTopBarTitle.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Typography from '@material-ui/core/Typography';
 import Skeleton from '@material-ui/lab/Skeleton';
diff --git a/src/components/WindowTopMenu.js b/src/components/WindowTopMenu.js
index 6148f94d2..99e89f0d2 100644
--- a/src/components/WindowTopMenu.js
+++ b/src/components/WindowTopMenu.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Menu from '@material-ui/core//Menu';
 import ListSubheader from '@material-ui/core/ListSubheader';
 import PropTypes from 'prop-types';
diff --git a/src/components/WindowTopMenuButton.js b/src/components/WindowTopMenuButton.js
index 1ff393ae7..8fee77043 100644
--- a/src/components/WindowTopMenuButton.js
+++ b/src/components/WindowTopMenuButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import WindowTopMenu from '../containers/WindowTopMenu';
 import MiradorMenuButton from '../containers/MiradorMenuButton';
diff --git a/src/components/WindowViewSettings.js b/src/components/WindowViewSettings.js
index 547656f06..90c56b823 100644
--- a/src/components/WindowViewSettings.js
+++ b/src/components/WindowViewSettings.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import MenuItem from '@material-ui/core/MenuItem';
 import ListSubheader from '@material-ui/core/ListSubheader';
diff --git a/src/components/WindowViewer.js b/src/components/WindowViewer.js
index 91257b42a..c099945b7 100644
--- a/src/components/WindowViewer.js
+++ b/src/components/WindowViewer.js
@@ -1,4 +1,4 @@
-import React, { Component, lazy, Suspense } from 'react';
+import { Component, lazy, Suspense } from 'react';
 import PropTypes from 'prop-types';
 import WindowCanvasNavigationControls from '../containers/WindowCanvasNavigationControls';
 
diff --git a/src/components/Workspace.js b/src/components/Workspace.js
index 951b23539..f99f61d4e 100644
--- a/src/components/Workspace.js
+++ b/src/components/Workspace.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import Grid from '@material-ui/core/Grid';
@@ -14,7 +14,7 @@ import { IIIFDropTarget } from './IIIFDropTarget';
  * @memberof Workspace
  * @private
  */
-export class Workspace extends React.Component {
+export class Workspace extends Component {
   /** */
   constructor(props) {
     super(props);
diff --git a/src/components/WorkspaceAdd.js b/src/components/WorkspaceAdd.js
index f1676e47a..172c8d347 100644
--- a/src/components/WorkspaceAdd.js
+++ b/src/components/WorkspaceAdd.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { createRef, Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import AddIcon from '@material-ui/icons/AddSharp';
@@ -23,13 +23,13 @@ import { PluginHook } from './PluginHook';
  * @memberof Workspace
  * @private
  */
-export class WorkspaceAdd extends React.Component {
+export class WorkspaceAdd extends Component {
   /** */
   constructor(props) {
     super(props);
 
     this.state = { addResourcesOpen: false };
-    this.ref = React.createRef();
+    this.ref = createRef();
 
     this.onSubmit = this.onSubmit.bind(this);
     this.setAddResourcesVisibility = this.setAddResourcesVisibility.bind(this);
diff --git a/src/components/WorkspaceAddButton.js b/src/components/WorkspaceAddButton.js
index e3fdeb2f7..b80ec8136 100644
--- a/src/components/WorkspaceAddButton.js
+++ b/src/components/WorkspaceAddButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import Fab from '@material-ui/core/Fab';
 import Tooltip from '@material-ui/core/Tooltip';
diff --git a/src/components/WorkspaceArea.js b/src/components/WorkspaceArea.js
index 3203d39d9..9650158cb 100644
--- a/src/components/WorkspaceArea.js
+++ b/src/components/WorkspaceArea.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import ErrorDialog from '../containers/ErrorDialog';
diff --git a/src/components/WorkspaceControlPanel.js b/src/components/WorkspaceControlPanel.js
index de849c8fb..f6703ff88 100644
--- a/src/components/WorkspaceControlPanel.js
+++ b/src/components/WorkspaceControlPanel.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import AppBar from '@material-ui/core/AppBar';
diff --git a/src/components/WorkspaceControlPanelButtons.js b/src/components/WorkspaceControlPanelButtons.js
index cc0fdb2ab..b07adfc54 100644
--- a/src/components/WorkspaceControlPanelButtons.js
+++ b/src/components/WorkspaceControlPanelButtons.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import FullScreenButton from '../containers/FullScreenButton';
 import WorkspaceMenuButton from '../containers/WorkspaceMenuButton';
diff --git a/src/components/WorkspaceElastic.js b/src/components/WorkspaceElastic.js
index 263b48d1a..a79219ac1 100644
--- a/src/components/WorkspaceElastic.js
+++ b/src/components/WorkspaceElastic.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import { Rnd } from 'react-rnd';
 import ResizeObserver from 'react-resize-observer';
@@ -11,7 +11,7 @@ import ns from '../config/css-ns';
  * @memberof Workspace
  * @private
  */
-class WorkspaceElastic extends React.Component {
+class WorkspaceElastic extends Component {
   /**
    */
   render() {
diff --git a/src/components/WorkspaceElasticWindow.js b/src/components/WorkspaceElasticWindow.js
index afe006ebc..169b5d5fd 100644
--- a/src/components/WorkspaceElasticWindow.js
+++ b/src/components/WorkspaceElasticWindow.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import { Rnd } from 'react-rnd';
 import Window from '../containers/Window';
@@ -9,7 +9,7 @@ import ns from '../config/css-ns';
  * @memberof Workspace
  * @private
  */
-class WorkspaceElasticWindow extends React.Component {
+class WorkspaceElasticWindow extends Component {
   /**
    */
   render() {
diff --git a/src/components/WorkspaceExport.js b/src/components/WorkspaceExport.js
index 2a7ff7e0c..0ee2f72a8 100644
--- a/src/components/WorkspaceExport.js
+++ b/src/components/WorkspaceExport.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Button from '@material-ui/core/Button';
 import Dialog from '@material-ui/core/Dialog';
 import DialogActions from '@material-ui/core/DialogActions';
diff --git a/src/components/WorkspaceImport.js b/src/components/WorkspaceImport.js
index 4a19c42f4..7adf4838d 100644
--- a/src/components/WorkspaceImport.js
+++ b/src/components/WorkspaceImport.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Dialog from '@material-ui/core/Dialog';
 import DialogTitle from '@material-ui/core/DialogTitle';
 import PropTypes from 'prop-types';
diff --git a/src/components/WorkspaceMenu.js b/src/components/WorkspaceMenu.js
index 0d526491c..4bc9963f9 100644
--- a/src/components/WorkspaceMenu.js
+++ b/src/components/WorkspaceMenu.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Menu from '@material-ui/core/Menu';
 import MenuItem from '@material-ui/core/MenuItem';
 import Typography from '@material-ui/core/Typography';
diff --git a/src/components/WorkspaceMenuButton.js b/src/components/WorkspaceMenuButton.js
index 327a50ffd..b1e4fe3dc 100644
--- a/src/components/WorkspaceMenuButton.js
+++ b/src/components/WorkspaceMenuButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import SettingsIcon from '@material-ui/icons/SettingsSharp';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
diff --git a/src/components/WorkspaceMosaic.js b/src/components/WorkspaceMosaic.js
index 275ac7952..620a8f601 100644
--- a/src/components/WorkspaceMosaic.js
+++ b/src/components/WorkspaceMosaic.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import {
   MosaicWithoutDragDropContext, MosaicWindow, getLeaves, createBalancedTreeFromLeaves,
@@ -15,7 +15,7 @@ import MosaicLayout from '../lib/MosaicLayout';
  * @memberof Workspace
  * @private
  */
-export class WorkspaceMosaic extends React.Component {
+export class WorkspaceMosaic extends Component {
   /**
    */
   constructor(props) {
diff --git a/src/components/WorkspaceOptionsButton.js b/src/components/WorkspaceOptionsButton.js
index 302de5f38..f82691e43 100644
--- a/src/components/WorkspaceOptionsButton.js
+++ b/src/components/WorkspaceOptionsButton.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import classNames from 'classnames';
 import MoreHorizontalIcon from '@material-ui/icons/MoreHorizSharp';
diff --git a/src/components/WorkspaceOptionsMenu.js b/src/components/WorkspaceOptionsMenu.js
index cba05a3fc..bcd482d1e 100644
--- a/src/components/WorkspaceOptionsMenu.js
+++ b/src/components/WorkspaceOptionsMenu.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import PropTypes from 'prop-types';
 import ImportIcon from '@material-ui/icons/Input';
 import SaveAltIcon from '@material-ui/icons/SaveAltSharp';
diff --git a/src/components/WorkspaceSelectionDialog.js b/src/components/WorkspaceSelectionDialog.js
index e0cb67910..839c227ef 100644
--- a/src/components/WorkspaceSelectionDialog.js
+++ b/src/components/WorkspaceSelectionDialog.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import Dialog from '@material-ui/core/Dialog';
 import DialogTitle from '@material-ui/core/DialogTitle';
 import {
diff --git a/src/components/ZoomControls.js b/src/components/ZoomControls.js
index 566cc1939..133c9950a 100644
--- a/src/components/ZoomControls.js
+++ b/src/components/ZoomControls.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
 import AddCircleIcon from '@material-ui/icons/AddCircleOutlineSharp';
 import RemoveCircleIcon from '@material-ui/icons/RemoveCircleOutlineSharp';
 import PropTypes from 'prop-types';
diff --git a/src/components/icons/BookViewIcon.js b/src/components/icons/BookViewIcon.js
index 3d38ba934..a6668b1f3 100644
--- a/src/components/icons/BookViewIcon.js
+++ b/src/components/icons/BookViewIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/CanvasIndexIcon.js b/src/components/icons/CanvasIndexIcon.js
index c977716bd..8d5af98b1 100644
--- a/src/components/icons/CanvasIndexIcon.js
+++ b/src/components/icons/CanvasIndexIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/GalleryViewIcon.js b/src/components/icons/GalleryViewIcon.js
index 5caa1d5d2..9a4100334 100644
--- a/src/components/icons/GalleryViewIcon.js
+++ b/src/components/icons/GalleryViewIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/MiradorIcon.js b/src/components/icons/MiradorIcon.js
index 1c70c3475..920256dd9 100644
--- a/src/components/icons/MiradorIcon.js
+++ b/src/components/icons/MiradorIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/RestoreZoomIcon.js b/src/components/icons/RestoreZoomIcon.js
index a9c6ba4a3..2005e6e89 100644
--- a/src/components/icons/RestoreZoomIcon.js
+++ b/src/components/icons/RestoreZoomIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/ThumbnailNavigationBottomIcon.js b/src/components/icons/ThumbnailNavigationBottomIcon.js
index 012b801ec..5c7080a78 100644
--- a/src/components/icons/ThumbnailNavigationBottomIcon.js
+++ b/src/components/icons/ThumbnailNavigationBottomIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/ThumbnailNavigationRightIcon.js b/src/components/icons/ThumbnailNavigationRightIcon.js
index 707ea3236..8f22b31d0 100644
--- a/src/components/icons/ThumbnailNavigationRightIcon.js
+++ b/src/components/icons/ThumbnailNavigationRightIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/WindowMaxIcon.js b/src/components/icons/WindowMaxIcon.js
index 4e7239cf5..9590bbb18 100644
--- a/src/components/icons/WindowMaxIcon.js
+++ b/src/components/icons/WindowMaxIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/WindowMinIcon.js b/src/components/icons/WindowMinIcon.js
index f441b602e..7a2ef3be9 100644
--- a/src/components/icons/WindowMinIcon.js
+++ b/src/components/icons/WindowMinIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/WindowOptionsIcon.js b/src/components/icons/WindowOptionsIcon.js
index 7b55ad378..3e365c293 100644
--- a/src/components/icons/WindowOptionsIcon.js
+++ b/src/components/icons/WindowOptionsIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/WorkspaceTypeElasticIcon.js b/src/components/icons/WorkspaceTypeElasticIcon.js
index 64428c37c..c81733089 100644
--- a/src/components/icons/WorkspaceTypeElasticIcon.js
+++ b/src/components/icons/WorkspaceTypeElasticIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/components/icons/WorkspaceTypeMosaicIcon.js b/src/components/icons/WorkspaceTypeMosaicIcon.js
index 529426e4c..5cdb0c34a 100644
--- a/src/components/icons/WorkspaceTypeMosaicIcon.js
+++ b/src/components/icons/WorkspaceTypeMosaicIcon.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import SvgIcon from '@material-ui/core/SvgIcon';
 
 /**
diff --git a/src/extend/PluginContext.js b/src/extend/PluginContext.js
index 1c138010e..954daf425 100644
--- a/src/extend/PluginContext.js
+++ b/src/extend/PluginContext.js
@@ -1,5 +1,5 @@
-import React from 'react';
+import { createContext } from 'react';
 
-const PluginContext = React.createContext();
+const PluginContext = createContext();
 
 export default PluginContext;
diff --git a/src/extend/PluginProvider.js b/src/extend/PluginProvider.js
index 784191184..b840bcf3c 100644
--- a/src/extend/PluginProvider.js
+++ b/src/extend/PluginProvider.js
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
 import PropTypes from 'prop-types';
 import PluginContext from './PluginContext';
 import {
diff --git a/src/extend/withPlugins.js b/src/extend/withPlugins.js
index 11320b1b7..9de3a699b 100644
--- a/src/extend/withPlugins.js
+++ b/src/extend/withPlugins.js
@@ -1,4 +1,4 @@
-import React, { useContext } from 'react';
+import { forwardRef, useContext } from 'react';
 import curry from 'lodash/curry';
 import isEmpty from 'lodash/isEmpty';
 import PluginContext from './PluginContext';
@@ -46,7 +46,7 @@ function _withPlugins(targetName, TargetComponent) { // eslint-disable-line no-u
     return plugins.wrap.slice().reverse()
       .reduce(pluginWrapper, <TargetComponent {...passDownProps} />);
   }
-  const whatever = React.forwardRef(PluginHoc);
+  const whatever = forwardRef(PluginHoc);
 
   whatever.displayName = `WithPlugins(${targetName})`;
   return whatever;
diff --git a/src/extend/withRef.js b/src/extend/withRef.js
index 7e1bc667b..3048a34bf 100644
--- a/src/extend/withRef.js
+++ b/src/extend/withRef.js
@@ -1,4 +1,4 @@
-import React, { forwardRef } from 'react';
+import { forwardRef } from 'react';
 
 /** */
 export const withRef = () => (Component) => {
diff --git a/src/lib/MiradorViewer.js b/src/lib/MiradorViewer.js
index cd825870d..c6fcf583e 100644
--- a/src/lib/MiradorViewer.js
+++ b/src/lib/MiradorViewer.js
@@ -1,4 +1,3 @@
-import React from 'react';
 import ReactDOM from 'react-dom';
 import { Provider } from 'react-redux';
 import HotApp from '../components/App';
diff --git a/webpack.config.js b/webpack.config.js
index 8c4e2eaf0..d33c34832 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -48,6 +48,8 @@ const baseConfig = mode => ({
     alias: {
       // needs shared global state for context to work
       'react-dnd': path.resolve(path.join(__dirname, 'node_modules', 'react-dnd')),
+      'react/jsx-dev-runtime': 'react/jsx-dev-runtime.js',
+      'react/jsx-runtime': 'react/jsx-runtime.js',
     },
     extensions: ['.js'],
   },
-- 
GitLab