From 09ca9b6a6a9f220ca8c11d97ecbcdc14c2a6aeb0 Mon Sep 17 00:00:00 2001
From: Christopher Hanna Johnson <chjohnson39@gmail.com>
Date: Tue, 26 Feb 2019 11:10:55 +0100
Subject: [PATCH] 1625 named exports (#1960)

* removes default export from components
adds component dir export index

* closes #1625
use named exports for all components
adds config option to opt out of plugin system
adds components, actions and reducers as module exports

* removes plugin override

* changes #1954 added components to named exports
---
 __tests__/src/components/App.test.js          |  2 +-
 .../src/components/CanvasThumbnail.test.js    |  2 +-
 .../src/components/CompanionWindow.test.js    |  2 +-
 .../src/components/LabelValueMetadata.test.js |  4 +-
 .../src/components/LanguageSettings.test.js   |  2 +-
 __tests__/src/components/ManifestForm.test.js |  2 +-
 .../src/components/ManifestListItem.test.js   |  2 +-
 .../components/ManifestListItemError.test.js  |  2 +-
 __tests__/src/components/NestedMenu.test.js   |  2 +-
 .../components/OpenSeadragonViewer.test.js    |  2 +-
 .../src/components/SanitizedHtml.test.js      |  2 +-
 .../components/ThumbnailNavigation.test.js    |  2 +-
 .../src/components/ViewerNavigation.test.js   |  2 +-
 __tests__/src/components/Window.test.js       | 15 ++++---
 __tests__/src/components/WindowList.test.js   |  2 +-
 .../components/WindowMiddleContent.test.js    |  2 +-
 .../src/components/WindowSideBar.test.js      |  2 +-
 .../components/WindowSideBarButtons.test.js   |  2 +-
 .../WindowSideBarCanvasPanel.test.js          |  4 +-
 .../components/WindowSideBarInfoPanel.test.js |  6 +--
 .../src/components/WindowSideBarPanel.test.js |  2 +-
 .../WindowThumbnailSettings.test.js           |  2 +-
 __tests__/src/components/WindowTopBar.test.js |  2 +-
 .../components/WindowTopBarButtons.test.js    |  2 +-
 .../src/components/WindowTopMenu.test.js      |  2 +-
 .../components/WindowTopMenuButton.test.js    |  2 +-
 .../src/components/WindowViewSettings.test.js |  2 +-
 __tests__/src/components/WindowViewer.test.js |  2 +-
 __tests__/src/components/Workspace.test.js    |  2 +-
 __tests__/src/components/WorkspaceAdd.test.js |  2 +-
 .../src/components/WorkspaceAddButton.test.js |  2 +-
 .../components/WorkspaceControlPanel.test.js  |  2 +-
 .../WorkspaceControlPanelButtons.test.js      |  2 +-
 .../src/components/WorkspaceExport.test.js    |  2 +-
 .../WorkspaceFullScreenButton.test.js         |  2 +-
 .../src/components/WorkspaceMenu.test.js      |  2 +-
 .../components/WorkspaceMenuButton.test.js    |  2 +-
 .../src/components/WorkspaceMosaic.test.js    |  2 +-
 .../src/components/WorkspaceSettings.test.js  |  2 +-
 __tests__/src/components/ZoomControls.test.js |  2 +-
 src/components/App.js                         |  5 +--
 src/components/CanvasThumbnail.js             |  2 +-
 src/components/CompanionWindow.js             |  4 +-
 src/components/LabelValueMetadata.js          |  6 +--
 src/components/LanguageSettings.js            |  2 +-
 src/components/ManifestForm.js                |  4 +-
 src/components/ManifestListItem.js            |  4 +-
 src/components/ManifestListItemError.js       |  4 +-
 src/components/NestedMenu.js                  |  2 +-
 src/components/OpenSeadragonViewer.js         |  4 +-
 src/components/SanitizedHtml.js               |  4 +-
 src/components/ThumbnailNavigation.js         |  6 +--
 src/components/ValidationCanvas.js            |  2 +-
 src/components/ViewerNavigation.js            |  4 +-
 src/components/Window.js                      |  4 +-
 src/components/WindowList.js                  |  4 +-
 src/components/WindowMiddleContent.js         |  4 +-
 src/components/WindowSideBar.js               |  4 +-
 src/components/WindowSideBarButtons.js        |  4 +-
 src/components/WindowSideBarCanvasPanel.js    |  8 ++--
 src/components/WindowSideBarInfoPanel.js      |  8 ++--
 src/components/WindowSideBarPanel.js          |  4 +-
 src/components/WindowThumbnailSettings.js     |  2 +-
 src/components/WindowTopBar.js                |  4 +-
 src/components/WindowTopBarButtons.js         |  4 +-
 src/components/WindowTopMenu.js               |  4 +-
 src/components/WindowTopMenuButton.js         |  4 +-
 src/components/WindowViewSettings.js          |  2 +-
 src/components/WindowViewer.js                |  4 +-
 src/components/Workspace.js                   |  4 +-
 src/components/WorkspaceAdd.js                |  4 +-
 src/components/WorkspaceAddButton.js          |  4 +-
 src/components/WorkspaceControlPanel.js       |  4 +-
 .../WorkspaceControlPanelButtons.js           |  4 +-
 src/components/WorkspaceExport.js             |  4 +-
 src/components/WorkspaceFullScreenButton.js   |  4 +-
 src/components/WorkspaceMenu.js               |  6 +--
 src/components/WorkspaceMenuButton.js         |  4 +-
 src/components/WorkspaceMosaic.js             |  5 +--
 src/components/WorkspaceSettings.js           |  4 +-
 src/components/ZoomControls.js                |  4 +-
 src/components/index.js                       | 41 +++++++++++++++++++
 src/containers/App.js                         |  2 +-
 src/containers/CompanionWindow.js             |  2 +-
 src/containers/LanguageSettings.js            |  2 +-
 src/containers/ManifestForm.js                |  2 +-
 src/containers/ManifestListItem.js            |  2 +-
 src/containers/ManifestListItemError.js       |  2 +-
 src/containers/OpenSeadragonViewer.js         |  2 +-
 src/containers/ThumbnailNavigation.js         |  2 +-
 src/containers/ViewerNavigation.js            |  2 +-
 src/containers/Window.js                      |  3 +-
 src/containers/WindowList.js                  |  2 +-
 src/containers/WindowMiddleContent.js         |  2 +-
 src/containers/WindowSideBar.js               |  2 +-
 src/containers/WindowSideBarButtons.js        |  2 +-
 src/containers/WindowSideBarCanvasPanel.js    |  2 +-
 src/containers/WindowSideBarInfoPanel.js      |  2 +-
 src/containers/WindowSideBarPanel.js          |  2 +-
 src/containers/WindowThumbnailSettings.js     |  2 +-
 src/containers/WindowTopBar.js                |  2 +-
 src/containers/WindowTopBarButtons.js         |  2 +-
 src/containers/WindowTopMenu.js               |  2 +-
 src/containers/WindowTopMenuButton.js         |  2 +-
 src/containers/WindowViewSettings.js          |  2 +-
 src/containers/WindowViewer.js                |  2 +-
 src/containers/Workspace.js                   |  2 +-
 src/containers/WorkspaceAdd.js                |  2 +-
 src/containers/WorkspaceAddButton.js          |  2 +-
 src/containers/WorkspaceControlPanel.js       |  2 +-
 .../WorkspaceControlPanelButtons.js           |  2 +-
 src/containers/WorkspaceExport.js             |  2 +-
 src/containers/WorkspaceFullScreenButton.js   |  2 +-
 src/containers/WorkspaceMenu.js               |  2 +-
 src/containers/WorkspaceMenuButton.js         |  2 +-
 src/containers/WorkspaceMosaic.js             |  2 +-
 src/containers/WorkspaceSettings.js           |  2 +-
 src/containers/ZoomControls.js                |  2 +-
 src/index.js                                  |  4 ++
 src/lib/miradorWithPlugins.js                 |  5 +--
 120 files changed, 183 insertions(+), 209 deletions(-)
 create mode 100644 src/components/index.js

diff --git a/__tests__/src/components/App.test.js b/__tests__/src/components/App.test.js
index 2a246c7a4..4a9b93966 100644
--- a/__tests__/src/components/App.test.js
+++ b/__tests__/src/components/App.test.js
@@ -5,7 +5,7 @@ import Fullscreen from 'react-fullscreen-crossbrowser';
 import WorkspaceControlPanel from '../../../src/containers/WorkspaceControlPanel';
 import Workspace from '../../../src/containers/Workspace';
 import WorkspaceAdd from '../../../src/containers/WorkspaceAdd';
-import App from '../../../src/components/App';
+import { App } from '../../../src/components/App';
 import settings from '../../../src/config/settings';
 import i18n from '../../../src/i18n';
 
diff --git a/__tests__/src/components/CanvasThumbnail.test.js b/__tests__/src/components/CanvasThumbnail.test.js
index afc3798f4..f3fa0904a 100644
--- a/__tests__/src/components/CanvasThumbnail.test.js
+++ b/__tests__/src/components/CanvasThumbnail.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import IntersectionObserver from '@researchgate/react-intersection-observer';
-import CanvasThumbnail from '../../../src/components/CanvasThumbnail';
+import { CanvasThumbnail } from '../../../src/components/CanvasThumbnail';
 
 describe('CanvasThumbnail', () => {
   let wrapper;
diff --git a/__tests__/src/components/CompanionWindow.test.js b/__tests__/src/components/CompanionWindow.test.js
index 13ba8c1de..c67b60fc3 100644
--- a/__tests__/src/components/CompanionWindow.test.js
+++ b/__tests__/src/components/CompanionWindow.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import CompanionWindow from '../../../src/components/CompanionWindow';
+import { CompanionWindow } from '../../../src/components/CompanionWindow';
 import WindowSideBarInfoPanel from '../../../src/containers/WindowSideBarInfoPanel';
 
 /** create wrapper */
diff --git a/__tests__/src/components/LabelValueMetadata.test.js b/__tests__/src/components/LabelValueMetadata.test.js
index 24d4d0ce2..8e8f777c6 100644
--- a/__tests__/src/components/LabelValueMetadata.test.js
+++ b/__tests__/src/components/LabelValueMetadata.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import SanitizedHtml from '../../../src/components/SanitizedHtml';
-import LabelValueMetadata from '../../../src/components/LabelValueMetadata';
+import { LabelValueMetadata } from '../../../src/components/LabelValueMetadata';
+import { SanitizedHtml } from '../../../src/components/SanitizedHtml';
 
 describe('LabelValueMetadata', () => {
   let wrapper;
diff --git a/__tests__/src/components/LanguageSettings.test.js b/__tests__/src/components/LanguageSettings.test.js
index 8ae798ec8..ca216cb5f 100644
--- a/__tests__/src/components/LanguageSettings.test.js
+++ b/__tests__/src/components/LanguageSettings.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import LanguageSettings from '../../../src/components/LanguageSettings';
+import { LanguageSettings } from '../../../src/components/LanguageSettings';
 
 /**
  * Helper function to create a shallow wrapper around LanguageSettings
diff --git a/__tests__/src/components/ManifestForm.test.js b/__tests__/src/components/ManifestForm.test.js
index 6da90f81a..9808c4ebf 100644
--- a/__tests__/src/components/ManifestForm.test.js
+++ b/__tests__/src/components/ManifestForm.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import ManifestForm from '../../../src/components/ManifestForm';
+import { ManifestForm } from '../../../src/components/ManifestForm';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/ManifestListItem.test.js b/__tests__/src/components/ManifestListItem.test.js
index 142af43e4..2e269269a 100644
--- a/__tests__/src/components/ManifestListItem.test.js
+++ b/__tests__/src/components/ManifestListItem.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import ManifestListItem from '../../../src/components/ManifestListItem';
+import { ManifestListItem } from '../../../src/components/ManifestListItem';
 import ManifestListItemError from '../../../src/containers/ManifestListItemError';
 
 /** */
diff --git a/__tests__/src/components/ManifestListItemError.test.js b/__tests__/src/components/ManifestListItemError.test.js
index 5d84fd79a..9edcdbc5a 100644
--- a/__tests__/src/components/ManifestListItemError.test.js
+++ b/__tests__/src/components/ManifestListItemError.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
-import ManifestListItemError from '../../../src/components/ManifestListItemError';
+import { ManifestListItemError } from '../../../src/components/ManifestListItemError';
 
 /**
  * Helper function to wrap creating a ManifestListItemError component
diff --git a/__tests__/src/components/NestedMenu.test.js b/__tests__/src/components/NestedMenu.test.js
index 422b947ec..0ba34a7c4 100644
--- a/__tests__/src/components/NestedMenu.test.js
+++ b/__tests__/src/components/NestedMenu.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import NestedMenu from '../../../src/components/NestedMenu';
+import { NestedMenu } from '../../../src/components/NestedMenu';
 
 /**
  * Helper function to wrap creating a NestedMenu component
diff --git a/__tests__/src/components/OpenSeadragonViewer.test.js b/__tests__/src/components/OpenSeadragonViewer.test.js
index 58f96bbe4..1b387e1cf 100644
--- a/__tests__/src/components/OpenSeadragonViewer.test.js
+++ b/__tests__/src/components/OpenSeadragonViewer.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import OpenSeadragon from 'openseadragon';
-import OpenSeadragonViewer from '../../../src/components/OpenSeadragonViewer';
+import { OpenSeadragonViewer } from '../../../src/components/OpenSeadragonViewer';
 
 jest.mock('openseadragon');
 
diff --git a/__tests__/src/components/SanitizedHtml.test.js b/__tests__/src/components/SanitizedHtml.test.js
index 9d62c9e02..541aa50a2 100644
--- a/__tests__/src/components/SanitizedHtml.test.js
+++ b/__tests__/src/components/SanitizedHtml.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import SanitizedHtml from '../../../src/components/SanitizedHtml';
+import { SanitizedHtml } from '../../../src/components/SanitizedHtml';
 
 const wrapper = shallow(
   <SanitizedHtml
diff --git a/__tests__/src/components/ThumbnailNavigation.test.js b/__tests__/src/components/ThumbnailNavigation.test.js
index f479471c3..133465a26 100644
--- a/__tests__/src/components/ThumbnailNavigation.test.js
+++ b/__tests__/src/components/ThumbnailNavigation.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import Grid from 'react-virtualized/dist/commonjs/Grid';
 import manifesto from 'manifesto.js';
-import ThumbnailNavigation from '../../../src/components/ThumbnailNavigation';
+import { ThumbnailNavigation } from '../../../src/components/ThumbnailNavigation';
 import CanvasGroupings from '../../../src/lib/CanvasGroupings';
 import manifestJson from '../../fixtures/version-2/019.json';
 
diff --git a/__tests__/src/components/ViewerNavigation.test.js b/__tests__/src/components/ViewerNavigation.test.js
index fdcee7d86..5e6408cdd 100644
--- a/__tests__/src/components/ViewerNavigation.test.js
+++ b/__tests__/src/components/ViewerNavigation.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import ViewerNavigation from '../../../src/components/ViewerNavigation';
+import { ViewerNavigation } from '../../../src/components/ViewerNavigation';
 
 describe('ViewerNavigation', () => {
   let wrapper;
diff --git a/__tests__/src/components/Window.test.js b/__tests__/src/components/Window.test.js
index 9a2e2587c..2f7928581 100644
--- a/__tests__/src/components/Window.test.js
+++ b/__tests__/src/components/Window.test.js
@@ -1,9 +1,14 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import Window from '../../../src/components/Window';
+import { Window } from '../../../src/components/Window';
 import WindowTopBar from '../../../src/containers/WindowTopBar';
 import WindowMiddleContent from '../../../src/containers/WindowMiddleContent';
 
+/** create wrapper */
+function createWrapper(window) {
+  return shallow(<Window window={window} />);
+}
+
 describe('Window', () => {
   let wrapper;
   const window = { id: 123, xywh: [0, 0, 400, 500] };
@@ -12,19 +17,19 @@ describe('Window', () => {
     expect(wrapper.find('.mirador-window')).toHaveLength(0);
   });
   it('should render outer element', () => {
-    wrapper = shallow(<Window window={window} />);
+    wrapper = createWrapper(window);
     expect(wrapper.find('.mirador-window')).toHaveLength(1);
   });
   it('should render <WindowTopBar>', () => {
-    wrapper = shallow(<Window window={window} />);
+    wrapper = createWrapper(window);
     expect(wrapper.find(WindowTopBar)).toHaveLength(1);
   });
   it('should render <WindowMiddleContent>', () => {
-    wrapper = shallow(<Window window={window} />);
+    wrapper = createWrapper(window);
     expect(wrapper.find(WindowMiddleContent)).toHaveLength(1);
   });
   it('should render bottom companions window areas', () => {
-    wrapper = shallow(<Window window={window} />);
+    wrapper = createWrapper(window);
     expect(wrapper.find('.mirador-companion-bottom')).toHaveLength(1);
   });
 });
diff --git a/__tests__/src/components/WindowList.test.js b/__tests__/src/components/WindowList.test.js
index 0bc7a7e14..06c65b65d 100644
--- a/__tests__/src/components/WindowList.test.js
+++ b/__tests__/src/components/WindowList.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import MenuItem from '@material-ui/core/MenuItem';
-import WindowList from '../../../src/components/WindowList';
+import { WindowList } from '../../../src/components/WindowList';
 
 describe('WindowList', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowMiddleContent.test.js b/__tests__/src/components/WindowMiddleContent.test.js
index 64da2c84b..17a56c1b6 100644
--- a/__tests__/src/components/WindowMiddleContent.test.js
+++ b/__tests__/src/components/WindowMiddleContent.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WindowMiddleContent from '../../../src/components/WindowMiddleContent';
+import { WindowMiddleContent } from '../../../src/components/WindowMiddleContent';
 import CompanionWindow from '../../../src/containers/CompanionWindow';
 import WindowSideBar from '../../../src/containers/WindowSideBar';
 import WindowViewer from '../../../src/containers/WindowViewer';
diff --git a/__tests__/src/components/WindowSideBar.test.js b/__tests__/src/components/WindowSideBar.test.js
index be0694041..8f7acc8b6 100644
--- a/__tests__/src/components/WindowSideBar.test.js
+++ b/__tests__/src/components/WindowSideBar.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WindowSideBar from '../../../src/components/WindowSideBar';
+import { WindowSideBar } from '../../../src/components/WindowSideBar';
 
 describe('WindowSideBar', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowSideBarButtons.test.js b/__tests__/src/components/WindowSideBarButtons.test.js
index b57978af8..6c1a53272 100644
--- a/__tests__/src/components/WindowSideBarButtons.test.js
+++ b/__tests__/src/components/WindowSideBarButtons.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WindowSideBarButtons from '../../../src/components/WindowSideBarButtons';
+import { WindowSideBarButtons } from '../../../src/components/WindowSideBarButtons';
 
 describe('WindowSideBarButtons', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowSideBarCanvasPanel.test.js b/__tests__/src/components/WindowSideBarCanvasPanel.test.js
index 3ca22f646..14bbf8444 100644
--- a/__tests__/src/components/WindowSideBarCanvasPanel.test.js
+++ b/__tests__/src/components/WindowSideBarCanvasPanel.test.js
@@ -4,8 +4,8 @@ import List from '@material-ui/core/List';
 import ListItem from '@material-ui/core/ListItem';
 import Typography from '@material-ui/core/Typography';
 import manifesto from 'manifesto.js';
-import WindowSideBarCanvasPanel from '../../../src/components/WindowSideBarCanvasPanel';
-import CanvasThumbnail from '../../../src/components/CanvasThumbnail';
+import { CanvasThumbnail } from '../../../src/components/CanvasThumbnail';
+import { WindowSideBarCanvasPanel } from '../../../src/components/WindowSideBarCanvasPanel';
 import manifestJson from '../../fixtures/version-2/019.json';
 import { getIdAndLabelOfCanvases } from '../../../src/state/selectors';
 
diff --git a/__tests__/src/components/WindowSideBarInfoPanel.test.js b/__tests__/src/components/WindowSideBarInfoPanel.test.js
index 4fdf5f8b9..a6c69f1a4 100644
--- a/__tests__/src/components/WindowSideBarInfoPanel.test.js
+++ b/__tests__/src/components/WindowSideBarInfoPanel.test.js
@@ -1,9 +1,9 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import Typography from '@material-ui/core/Typography';
-import WindowSideBarInfoPanel from '../../../src/components/WindowSideBarInfoPanel';
-import SanitizedHtml from '../../../src/components/SanitizedHtml';
-import LabelValueMetadata from '../../../src/components/LabelValueMetadata';
+import { WindowSideBarInfoPanel } from '../../../src/components/WindowSideBarInfoPanel';
+import { LabelValueMetadata } from '../../../src/components/LabelValueMetadata';
+import { SanitizedHtml } from '../../../src/components/SanitizedHtml';
 
 describe('WindowSideBarInfoPanel', () => {
   const metadata = [{ label: {}, value: {} }];
diff --git a/__tests__/src/components/WindowSideBarPanel.test.js b/__tests__/src/components/WindowSideBarPanel.test.js
index db8fcece7..3381b62c7 100644
--- a/__tests__/src/components/WindowSideBarPanel.test.js
+++ b/__tests__/src/components/WindowSideBarPanel.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WindowSideBarPanel from '../../../src/components/WindowSideBarPanel';
+import { WindowSideBarPanel } from '../../../src/components/WindowSideBarPanel';
 import WindowSideBarInfoPanel from '../../../src/containers/WindowSideBarInfoPanel';
 
 describe('WindowSideBarPanel', () => {
diff --git a/__tests__/src/components/WindowThumbnailSettings.test.js b/__tests__/src/components/WindowThumbnailSettings.test.js
index 7b835555a..4227beee5 100644
--- a/__tests__/src/components/WindowThumbnailSettings.test.js
+++ b/__tests__/src/components/WindowThumbnailSettings.test.js
@@ -3,7 +3,7 @@ import { shallow } from 'enzyme';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import RadioGroup from '@material-ui/core/RadioGroup';
 import Typography from '@material-ui/core/Typography';
-import WindowThumbnailSettings from '../../../src/components/WindowThumbnailSettings';
+import { WindowThumbnailSettings } from '../../../src/components/WindowThumbnailSettings';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WindowTopBar.test.js b/__tests__/src/components/WindowTopBar.test.js
index 94c0c0f2d..d2ac3dc29 100644
--- a/__tests__/src/components/WindowTopBar.test.js
+++ b/__tests__/src/components/WindowTopBar.test.js
@@ -10,7 +10,7 @@ import AppBar from '@material-ui/core/AppBar';
 import WindowTopMenuButton from '../../../src/containers/WindowTopMenuButton';
 import WindowTopBarButtons from '../../../src/containers/WindowTopBarButtons';
 import WindowIcon from '../../../src/containers/WindowIcon';
-import WindowTopBar from '../../../src/components/WindowTopBar';
+import { WindowTopBar } from '../../../src/components/WindowTopBar';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WindowTopBarButtons.test.js b/__tests__/src/components/WindowTopBarButtons.test.js
index cf4cf3436..2f9f39f62 100644
--- a/__tests__/src/components/WindowTopBarButtons.test.js
+++ b/__tests__/src/components/WindowTopBarButtons.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WindowTopBarButtons from '../../../src/components/WindowTopBarButtons';
+import { WindowTopBarButtons } from '../../../src/components/WindowTopBarButtons';
 
 describe('WindowTopBarButtons', () => {
   let wrapper;
diff --git a/__tests__/src/components/WindowTopMenu.test.js b/__tests__/src/components/WindowTopMenu.test.js
index 0ad076767..db9671e41 100644
--- a/__tests__/src/components/WindowTopMenu.test.js
+++ b/__tests__/src/components/WindowTopMenu.test.js
@@ -5,7 +5,7 @@ import Menu from '@material-ui/core/Menu';
 import Divider from '@material-ui/core/Divider';
 import WindowThumbnailSettings from '../../../src/containers/WindowThumbnailSettings';
 import WindowViewSettings from '../../../src/containers/WindowViewSettings';
-import WindowTopMenu from '../../../src/components/WindowTopMenu';
+import { WindowTopMenu } from '../../../src/components/WindowTopMenu';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WindowTopMenuButton.test.js b/__tests__/src/components/WindowTopMenuButton.test.js
index 7da21e820..498a65f0d 100644
--- a/__tests__/src/components/WindowTopMenuButton.test.js
+++ b/__tests__/src/components/WindowTopMenuButton.test.js
@@ -3,7 +3,7 @@ import { shallow } from 'enzyme';
 import IconButton from '@material-ui/core/IconButton';
 import MoreVertIcon from '@material-ui/icons/MoreVert';
 import WindowTopMenu from '../../../src/containers/WindowTopMenu';
-import WindowTopMenuButton from '../../../src/components/WindowTopMenuButton';
+import { WindowTopMenuButton } from '../../../src/components/WindowTopMenuButton';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WindowViewSettings.test.js b/__tests__/src/components/WindowViewSettings.test.js
index cf3318c18..7900f5123 100644
--- a/__tests__/src/components/WindowViewSettings.test.js
+++ b/__tests__/src/components/WindowViewSettings.test.js
@@ -3,7 +3,7 @@ import { shallow } from 'enzyme';
 import FormControlLabel from '@material-ui/core/FormControlLabel';
 import RadioGroup from '@material-ui/core/RadioGroup';
 import Typography from '@material-ui/core/Typography';
-import WindowViewSettings from '../../../src/components/WindowViewSettings';
+import { WindowViewSettings } from '../../../src/components/WindowViewSettings';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WindowViewer.test.js b/__tests__/src/components/WindowViewer.test.js
index 0d0e21f59..3950378fc 100644
--- a/__tests__/src/components/WindowViewer.test.js
+++ b/__tests__/src/components/WindowViewer.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import manifesto from 'manifesto.js';
-import WindowViewer from '../../../src/components/WindowViewer';
+import { WindowViewer } from '../../../src/components/WindowViewer';
 import OSDViewer from '../../../src/containers/OpenSeadragonViewer';
 import ViewerNavigation from '../../../src/containers/ViewerNavigation';
 import fixture from '../../fixtures/version-2/019.json';
diff --git a/__tests__/src/components/Workspace.test.js b/__tests__/src/components/Workspace.test.js
index 9a9ce3af5..83ff8808f 100644
--- a/__tests__/src/components/Workspace.test.js
+++ b/__tests__/src/components/Workspace.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import WorkspaceMosaic from '../../../src/containers/WorkspaceMosaic';
 import Window from '../../../src/containers/Window';
-import Workspace from '../../../src/components/Workspace';
+import { Workspace } from '../../../src/components/Workspace';
 
 const windows = { 1: { id: 1 }, 2: { id: 2 } };
 
diff --git a/__tests__/src/components/WorkspaceAdd.test.js b/__tests__/src/components/WorkspaceAdd.test.js
index cd0c32b0e..12e873a13 100644
--- a/__tests__/src/components/WorkspaceAdd.test.js
+++ b/__tests__/src/components/WorkspaceAdd.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceAdd from '../../../src/components/WorkspaceAdd';
+import { WorkspaceAdd } from '../../../src/components/WorkspaceAdd';
 import ManifestListItem from '../../../src/containers/ManifestListItem';
 import fixture from '../../fixtures/version-2/002.json';
 import ManifestForm from '../../../src/containers/ManifestForm';
diff --git a/__tests__/src/components/WorkspaceAddButton.test.js b/__tests__/src/components/WorkspaceAddButton.test.js
index 9c1fea083..2e1df73ef 100644
--- a/__tests__/src/components/WorkspaceAddButton.test.js
+++ b/__tests__/src/components/WorkspaceAddButton.test.js
@@ -3,7 +3,7 @@ import { shallow } from 'enzyme';
 import Fab from '@material-ui/core/Fab';
 import AddIcon from '@material-ui/icons/Add';
 import ClearIcon from '@material-ui/icons/Clear';
-import WorkspaceAddButton from '../../../src/components/WorkspaceAddButton';
+import { WorkspaceAddButton } from '../../../src/components/WorkspaceAddButton';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WorkspaceControlPanel.test.js b/__tests__/src/components/WorkspaceControlPanel.test.js
index 31e59d0a4..1533a6f22 100644
--- a/__tests__/src/components/WorkspaceControlPanel.test.js
+++ b/__tests__/src/components/WorkspaceControlPanel.test.js
@@ -2,7 +2,7 @@ import React from 'react';
 import { shallow } from 'enzyme';
 import createStore from '../../../src/state/createStore';
 import * as actions from '../../../src/state/actions';
-import WorkspaceControlPanel from '../../../src/components/WorkspaceControlPanel';
+import { WorkspaceControlPanel } from '../../../src/components/WorkspaceControlPanel';
 import fixture from '../../fixtures/version-2/002.json';
 
 describe('WorkspaceControlPanel', () => {
diff --git a/__tests__/src/components/WorkspaceControlPanelButtons.test.js b/__tests__/src/components/WorkspaceControlPanelButtons.test.js
index a66c8dcb5..c9de36d09 100644
--- a/__tests__/src/components/WorkspaceControlPanelButtons.test.js
+++ b/__tests__/src/components/WorkspaceControlPanelButtons.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import WorkspaceFullScreenButton from '../../../src/containers/WorkspaceFullScreenButton';
-import WorkspaceControlPanelButtons
+import { WorkspaceControlPanelButtons }
   from '../../../src/components/WorkspaceControlPanelButtons';
 
 describe('WorkspaceControlPanelButtons', () => {
diff --git a/__tests__/src/components/WorkspaceExport.test.js b/__tests__/src/components/WorkspaceExport.test.js
index 17ea78605..bf2a890c9 100644
--- a/__tests__/src/components/WorkspaceExport.test.js
+++ b/__tests__/src/components/WorkspaceExport.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceExport from '../../../src/components/WorkspaceExport';
+import { WorkspaceExport } from '../../../src/components/WorkspaceExport';
 
 describe('WorkspaceExport', () => {
   let wrapper;
diff --git a/__tests__/src/components/WorkspaceFullScreenButton.test.js b/__tests__/src/components/WorkspaceFullScreenButton.test.js
index 88598ae50..15b788865 100644
--- a/__tests__/src/components/WorkspaceFullScreenButton.test.js
+++ b/__tests__/src/components/WorkspaceFullScreenButton.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceFullScreenButton from '../../../src/components/WorkspaceFullScreenButton';
+import { WorkspaceFullScreenButton } from '../../../src/components/WorkspaceFullScreenButton';
 
 describe('WorkspaceFullScreenButton', () => {
   let wrapper;
diff --git a/__tests__/src/components/WorkspaceMenu.test.js b/__tests__/src/components/WorkspaceMenu.test.js
index c7b76b661..0dbfcd067 100644
--- a/__tests__/src/components/WorkspaceMenu.test.js
+++ b/__tests__/src/components/WorkspaceMenu.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceMenu from '../../../src/components/WorkspaceMenu';
+import { WorkspaceMenu } from '../../../src/components/WorkspaceMenu';
 import WindowList from '../../../src/containers/WindowList';
 
 describe('WorkspaceMenu', () => {
diff --git a/__tests__/src/components/WorkspaceMenuButton.test.js b/__tests__/src/components/WorkspaceMenuButton.test.js
index ba48a869e..a1ab0da00 100644
--- a/__tests__/src/components/WorkspaceMenuButton.test.js
+++ b/__tests__/src/components/WorkspaceMenuButton.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceMenuButton from '../../../src/components/WorkspaceMenuButton';
+import { WorkspaceMenuButton } from '../../../src/components/WorkspaceMenuButton';
 
 describe('WorkspaceMenuButton', () => {
   let wrapper;
diff --git a/__tests__/src/components/WorkspaceMosaic.test.js b/__tests__/src/components/WorkspaceMosaic.test.js
index ea11f8390..01bfd5a25 100644
--- a/__tests__/src/components/WorkspaceMosaic.test.js
+++ b/__tests__/src/components/WorkspaceMosaic.test.js
@@ -1,7 +1,7 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 import { Mosaic } from 'react-mosaic-component';
-import WorkspaceMosaic from '../../../src/components/WorkspaceMosaic';
+import { WorkspaceMosaic } from '../../../src/components/WorkspaceMosaic';
 
 /** create wrapper */
 function createWrapper(props) {
diff --git a/__tests__/src/components/WorkspaceSettings.test.js b/__tests__/src/components/WorkspaceSettings.test.js
index 13e168191..8f1ffa434 100644
--- a/__tests__/src/components/WorkspaceSettings.test.js
+++ b/__tests__/src/components/WorkspaceSettings.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import WorkspaceSettings from '../../../src/components/WorkspaceSettings';
+import { WorkspaceSettings } from '../../../src/components/WorkspaceSettings';
 import settings from '../../../src/config/settings';
 
 describe('WorkspaceSettings', () => {
diff --git a/__tests__/src/components/ZoomControls.test.js b/__tests__/src/components/ZoomControls.test.js
index 1b8efb89d..f76ce271d 100644
--- a/__tests__/src/components/ZoomControls.test.js
+++ b/__tests__/src/components/ZoomControls.test.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { shallow } from 'enzyme';
-import ZoomControls from '../../../src/components/ZoomControls';
+import { ZoomControls } from '../../../src/components/ZoomControls';
 
 describe('ZoomControls', () => {
   let wrapper;
diff --git a/src/components/App.js b/src/components/App.js
index 55bb715b5..41712e1e7 100644
--- a/src/components/App.js
+++ b/src/components/App.js
@@ -14,7 +14,7 @@ import i18n from '../i18n';
  * This is the top level Mirador component.
  * @prop {Object} manifests
  */
-class App extends Component {
+export class App extends Component {
   /** */
   constructor(props) {
     super(props);
@@ -96,6 +96,3 @@ App.defaultProps = {
   isFullscreenEnabled: false,
   isWorkspaceAddVisible: false,
 };
-
-
-export default App;
diff --git a/src/components/CanvasThumbnail.js b/src/components/CanvasThumbnail.js
index d60f95594..833c4e128 100644
--- a/src/components/CanvasThumbnail.js
+++ b/src/components/CanvasThumbnail.js
@@ -6,7 +6,7 @@ import IntersectionObserver from '@researchgate/react-intersection-observer';
 /**
  * Uses InteractionObserver to "lazy" load canvas thumbnails that are in view.
  */
-export default class CanvasThumbnail extends Component {
+export class CanvasThumbnail extends Component {
   /**
    */
   constructor(props) {
diff --git a/src/components/CompanionWindow.js b/src/components/CompanionWindow.js
index 4e373821a..5ec80ef2d 100644
--- a/src/components/CompanionWindow.js
+++ b/src/components/CompanionWindow.js
@@ -10,7 +10,7 @@ import WindowSideBarCanvasPanel from '../containers/WindowSideBarCanvasPanel';
 /**
  * CompanionWindow
  */
-class CompanionWindow extends Component {
+export class CompanionWindow extends Component {
   /**
    * activePanelComponent
    * @return React Component
@@ -74,5 +74,3 @@ CompanionWindow.defaultProps = {
   position: null,
   t: key => key,
 };
-
-export default CompanionWindow;
diff --git a/src/components/LabelValueMetadata.js b/src/components/LabelValueMetadata.js
index df1c26765..cefe0a32b 100644
--- a/src/components/LabelValueMetadata.js
+++ b/src/components/LabelValueMetadata.js
@@ -1,12 +1,12 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import SanitizedHtml from './SanitizedHtml';
+import { SanitizedHtml } from './SanitizedHtml';
 
 /**
  * Renders label/value pair metadata in a dl
  * @prop {object} labelValuePair
  */
-class LabelValueMetadata extends Component {
+export class LabelValueMetadata extends Component {
   /**
    * render
    * @return {String} - HTML markup for the component
@@ -41,5 +41,3 @@ class LabelValueMetadata extends Component {
 LabelValueMetadata.propTypes = {
   labelValuePairs: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types,
 };
-
-export default LabelValueMetadata;
diff --git a/src/components/LanguageSettings.js b/src/components/LanguageSettings.js
index ebe77d427..29efea8b7 100644
--- a/src/components/LanguageSettings.js
+++ b/src/components/LanguageSettings.js
@@ -11,7 +11,7 @@ import PropTypes from 'prop-types';
  * LanguageSettings ~ the workspace sub menu to change the language
  * of the application
 */
-export default class LanguageSettings extends Component {
+export class LanguageSettings extends Component {
   /**
    * Returns the rendered component
   */
diff --git a/src/components/ManifestForm.js b/src/components/ManifestForm.js
index 659f7eb55..7aa210075 100644
--- a/src/components/ManifestForm.js
+++ b/src/components/ManifestForm.js
@@ -8,7 +8,7 @@ import TextField from '@material-ui/core/TextField';
  * Provides a form for user input of a manifest url
  * @prop {Function} fetchManifest
  */
-class ManifestForm extends Component {
+export class ManifestForm extends Component {
   /**
    * constructor -
    */
@@ -95,5 +95,3 @@ ManifestForm.defaultProps = {
   t: key => key,
   onCancel: null,
 };
-
-export default ManifestForm;
diff --git a/src/components/ManifestListItem.js b/src/components/ManifestListItem.js
index d778cd556..8ebcad834 100644
--- a/src/components/ManifestListItem.js
+++ b/src/components/ManifestListItem.js
@@ -24,7 +24,7 @@ const handleOpenButtonClick = (event, manifest, addWindow) => {
  */
 
 /** */
-class ManifestListItem extends React.Component {
+export class ManifestListItem extends React.Component {
   /** */
   componentDidMount() {
     const {
@@ -159,5 +159,3 @@ ManifestListItem.defaultProps = {
   error: null,
   isFetching: false,
 };
-
-export default ManifestListItem;
diff --git a/src/components/ManifestListItemError.js b/src/components/ManifestListItemError.js
index 24c1f419e..038427370 100644
--- a/src/components/ManifestListItemError.js
+++ b/src/components/ManifestListItemError.js
@@ -9,7 +9,7 @@ import Typography from '@material-ui/core/Typography';
  * ManifestListItemError renders a component displaying a
  * message to the user about a problem loading a manifest
 */
-class ManifestListItemError extends Component {
+export class ManifestListItemError extends Component {
   /**
    * Returns the rendered component
   */
@@ -59,5 +59,3 @@ ManifestListItemError.propTypes = {
   onTryAgainClick: PropTypes.func.isRequired,
   t: PropTypes.func.isRequired,
 };
-
-export default ManifestListItemError;
diff --git a/src/components/NestedMenu.js b/src/components/NestedMenu.js
index 1ced10fde..b576d629a 100644
--- a/src/components/NestedMenu.js
+++ b/src/components/NestedMenu.js
@@ -12,7 +12,7 @@ import ExpandMore from '@material-ui/icons/ExpandMoreSharp';
  * NestedMenu ~ A presentation component to render a menu item and have
  * it control the visibility of the MUI List passed in as the children
 */
-export default class NestedMenu extends Component {
+export class NestedMenu extends Component {
   /**
    * constructor -
    */
diff --git a/src/components/OpenSeadragonViewer.js b/src/components/OpenSeadragonViewer.js
index 0160ea131..df58c9911 100644
--- a/src/components/OpenSeadragonViewer.js
+++ b/src/components/OpenSeadragonViewer.js
@@ -9,7 +9,7 @@ import ZoomControls from '../containers/ZoomControls';
  * Represents a OpenSeadragonViewer in the mirador workspace. Responsible for mounting
  * and rendering OSD.
  */
-class OpenSeadragonViewer extends Component {
+export class OpenSeadragonViewer extends Component {
   /**
    * @param {Object} props
    */
@@ -229,5 +229,3 @@ OpenSeadragonViewer.propTypes = {
   updateViewport: PropTypes.func.isRequired,
   windowId: PropTypes.string.isRequired,
 };
-
-export default OpenSeadragonViewer;
diff --git a/src/components/SanitizedHtml.js b/src/components/SanitizedHtml.js
index 299bf2eab..50ceb4ecf 100644
--- a/src/components/SanitizedHtml.js
+++ b/src/components/SanitizedHtml.js
@@ -6,7 +6,7 @@ import htmlRules from '../lib/htmlRules';
 
 /**
 */
-class SanitizedHtml extends Component {
+export class SanitizedHtml extends Component {
   /**
   */
   render() {
@@ -26,5 +26,3 @@ SanitizedHtml.propTypes = {
   ruleSet: PropTypes.string.isRequired,
   htmlString: PropTypes.string.isRequired,
 };
-
-export default SanitizedHtml;
diff --git a/src/components/ThumbnailNavigation.js b/src/components/ThumbnailNavigation.js
index 468d8da81..b79404d53 100644
--- a/src/components/ThumbnailNavigation.js
+++ b/src/components/ThumbnailNavigation.js
@@ -2,14 +2,14 @@ import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';
 import Grid from 'react-virtualized/dist/commonjs/Grid';
-import CanvasThumbnail from './CanvasThumbnail';
+import { CanvasThumbnail } from './CanvasThumbnail';
 import ManifestoCanvas from '../lib/ManifestoCanvas';
 import ns from '../config/css-ns';
 import 'react-virtualized/styles.css';
 
 /**
  */
-class ThumbnailNavigation extends Component {
+export class ThumbnailNavigation extends Component {
   /**
    */
   constructor(props) {
@@ -153,5 +153,3 @@ ThumbnailNavigation.propTypes = {
   setCanvas: PropTypes.func.isRequired,
   window: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default ThumbnailNavigation;
diff --git a/src/components/ValidationCanvas.js b/src/components/ValidationCanvas.js
index 67cbfe8c8..dc3ed584e 100644
--- a/src/components/ValidationCanvas.js
+++ b/src/components/ValidationCanvas.js
@@ -2,7 +2,7 @@ import ManifestoCanvas from '../lib/ManifestoCanvas';
 
 /**
  */
-export default class ValidationCanvas extends ManifestoCanvas {
+export class ValidationCanvas extends ManifestoCanvas {
   /**
    * checks whether the canvas has a valid height
    */
diff --git a/src/components/ViewerNavigation.js b/src/components/ViewerNavigation.js
index 45bf4e720..3d5ed7a06 100644
--- a/src/components/ViewerNavigation.js
+++ b/src/components/ViewerNavigation.js
@@ -7,7 +7,7 @@ import ns from '../config/css-ns';
 
 /**
  */
-class ViewerNavigation extends Component {
+export class ViewerNavigation extends Component {
   /**
    */
   constructor(props) {
@@ -76,5 +76,3 @@ ViewerNavigation.propTypes = {
   previousCanvas: PropTypes.func.isRequired,
   window: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default ViewerNavigation;
diff --git a/src/components/Window.js b/src/components/Window.js
index af4819da8..d22e44b5b 100644
--- a/src/components/Window.js
+++ b/src/components/Window.js
@@ -9,7 +9,7 @@ import ThumbnailNavigation from '../containers/ThumbnailNavigation';
  * Represents a Window in the mirador workspace
  * @param {object} window
  */
-class Window extends Component {
+export class Window extends Component {
   /**
    * Renders things
    */
@@ -48,5 +48,3 @@ Window.defaultProps = {
   window: null,
   manifest: null,
 };
-
-export default Window;
diff --git a/src/components/WindowList.js b/src/components/WindowList.js
index 99d5c8fc7..921b11c3a 100644
--- a/src/components/WindowList.js
+++ b/src/components/WindowList.js
@@ -7,7 +7,7 @@ import PropTypes from 'prop-types';
 
 /**
  */
-class WindowList extends Component {
+export class WindowList extends Component {
   /**
    * Get the title for a window from its manifest title
    * @private
@@ -67,5 +67,3 @@ WindowList.defaultProps = {
   anchorEl: null,
   t: key => key,
 };
-
-export default WindowList;
diff --git a/src/components/WindowMiddleContent.js b/src/components/WindowMiddleContent.js
index b2817e6b6..aae3cc789 100644
--- a/src/components/WindowMiddleContent.js
+++ b/src/components/WindowMiddleContent.js
@@ -9,7 +9,7 @@ import ns from '../config/css-ns';
  * WindowMiddleContent - component that renders the "middle" area of the
  * Mirador Window
  */
-class WindowMiddleContent extends Component {
+export class WindowMiddleContent extends Component {
   /**
    * renderViewer
    *
@@ -52,5 +52,3 @@ WindowMiddleContent.propTypes = {
 WindowMiddleContent.defaultProps = {
   manifest: null,
 };
-
-export default WindowMiddleContent;
diff --git a/src/components/WindowSideBar.js b/src/components/WindowSideBar.js
index 77dba007c..0ada1def2 100644
--- a/src/components/WindowSideBar.js
+++ b/src/components/WindowSideBar.js
@@ -10,7 +10,7 @@ import ns from '../config/css-ns';
 /**
  * WindowSideBar
  */
-class WindowSideBar extends Component {
+export class WindowSideBar extends Component {
   /**
    * render
    * @return
@@ -72,5 +72,3 @@ WindowSideBar.defaultProps = {
   sideBarOpen: false,
   sideBarPanel: 'closed',
 };
-
-export default WindowSideBar;
diff --git a/src/components/WindowSideBarButtons.js b/src/components/WindowSideBarButtons.js
index 949a468a4..80ba4886c 100644
--- a/src/components/WindowSideBarButtons.js
+++ b/src/components/WindowSideBarButtons.js
@@ -7,7 +7,7 @@ import ListIcon from '@material-ui/icons/FormatAlignJustify';
 /**
  *
  */
-class WindowSideBarButtons extends Component {
+export class WindowSideBarButtons extends Component {
   /**
    * sideBarPanelCurrentlySelected - return if the given sideBarPanel is currently selected
    * @return Boolean
@@ -67,5 +67,3 @@ WindowSideBarButtons.defaultProps = {
   sideBarPanel: 'closed',
   t: key => key,
 };
-
-export default WindowSideBarButtons;
diff --git a/src/components/WindowSideBarCanvasPanel.js b/src/components/WindowSideBarCanvasPanel.js
index b77714480..2575b83fb 100644
--- a/src/components/WindowSideBarCanvasPanel.js
+++ b/src/components/WindowSideBarCanvasPanel.js
@@ -4,14 +4,14 @@ import classNames from 'classnames';
 import Typography from '@material-ui/core/Typography';
 import List from '@material-ui/core/List';
 import ListItem from '@material-ui/core/ListItem';
-import ValidationCanvas from './ValidationCanvas';
-import CanvasThumbnail from './CanvasThumbnail';
+import { CanvasThumbnail } from './CanvasThumbnail';
+import { ValidationCanvas } from './ValidationCanvas';
 import { getIdAndLabelOfCanvases } from '../state/selectors';
 
 /**
  * a panel showing the canvases for a given manifest
  */
-class WindowSideBarCanvasPanel extends Component {
+export class WindowSideBarCanvasPanel extends Component {
   /**
    * calculateScaledWidth - calculates the scaled width according to the given width and aspectRatio
    */
@@ -81,5 +81,3 @@ WindowSideBarCanvasPanel.propTypes = {
   t: PropTypes.func.isRequired,
   windowId: PropTypes.string.isRequired,
 };
-
-export default WindowSideBarCanvasPanel;
diff --git a/src/components/WindowSideBarInfoPanel.js b/src/components/WindowSideBarInfoPanel.js
index e767d2648..bcf3a89a7 100644
--- a/src/components/WindowSideBarInfoPanel.js
+++ b/src/components/WindowSideBarInfoPanel.js
@@ -2,15 +2,15 @@ import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import Divider from '@material-ui/core/Divider';
 import Typography from '@material-ui/core/Typography';
-import LabelValueMetadata from './LabelValueMetadata';
-import SanitizedHtml from './SanitizedHtml';
+import { SanitizedHtml } from './SanitizedHtml';
+import { LabelValueMetadata } from './LabelValueMetadata';
 import ns from '../config/css-ns';
 
 
 /**
  * WindowSideBarInfoPanel
  */
-class WindowSideBarInfoPanel extends Component {
+export class WindowSideBarInfoPanel extends Component {
   /**
    * render
    * @return
@@ -98,5 +98,3 @@ WindowSideBarInfoPanel.defaultProps = {
   manifestMetadata: [],
   t: key => key,
 };
-
-export default WindowSideBarInfoPanel;
diff --git a/src/components/WindowSideBarPanel.js b/src/components/WindowSideBarPanel.js
index 16d45c411..659e484d6 100644
--- a/src/components/WindowSideBarPanel.js
+++ b/src/components/WindowSideBarPanel.js
@@ -9,7 +9,7 @@ import WindowSideBarCanvasPanel from '../containers/WindowSideBarCanvasPanel';
  * WindowSideBarPanel - the panel that pops out from the sidebar
  * when various icons are clicked such as Info, Search, etc.
  */
-class WindowSideBarPanel extends Component {
+export class WindowSideBarPanel extends Component {
   /**
    * activePanelComponent
    * @return React Component
@@ -60,5 +60,3 @@ WindowSideBarPanel.defaultProps = {
   sideBarPanel: 'closed', // Closed will fall out to the default null case for the actiuve panel
   t: key => key,
 };
-
-export default WindowSideBarPanel;
diff --git a/src/components/WindowThumbnailSettings.js b/src/components/WindowThumbnailSettings.js
index 518a74cd2..7f2a84520 100644
--- a/src/components/WindowThumbnailSettings.js
+++ b/src/components/WindowThumbnailSettings.js
@@ -10,7 +10,7 @@ import PropTypes from 'prop-types';
 /**
  *
  */
-export default class WindowThumbnailSettings extends Component {
+export class WindowThumbnailSettings extends Component {
   /**
    * constructor -
    */
diff --git a/src/components/WindowTopBar.js b/src/components/WindowTopBar.js
index 61d1942c0..bab19df9f 100644
--- a/src/components/WindowTopBar.js
+++ b/src/components/WindowTopBar.js
@@ -16,7 +16,7 @@ import ns from '../config/css-ns';
 /**
  * WindowTopBar
  */
-class WindowTopBar extends Component {
+export class WindowTopBar extends Component {
   /**
    * render
    * @return
@@ -68,5 +68,3 @@ WindowTopBar.defaultProps = {
   manifestTitle: '',
   t: key => key,
 };
-
-export default WindowTopBar;
diff --git a/src/components/WindowTopBarButtons.js b/src/components/WindowTopBarButtons.js
index 26f90a522..d9ee5ef96 100644
--- a/src/components/WindowTopBarButtons.js
+++ b/src/components/WindowTopBarButtons.js
@@ -3,7 +3,7 @@ import React, { Component } from 'react';
 /**
  *
  */
-class WindowTopBarButtons extends Component {
+export class WindowTopBarButtons extends Component {
   /**
    * render
    *
@@ -13,5 +13,3 @@ class WindowTopBarButtons extends Component {
     return (<></>);
   }
 }
-
-export default WindowTopBarButtons;
diff --git a/src/components/WindowTopMenu.js b/src/components/WindowTopMenu.js
index b5d5b9f7d..d19e3c14c 100644
--- a/src/components/WindowTopMenu.js
+++ b/src/components/WindowTopMenu.js
@@ -8,7 +8,7 @@ import WindowViewSettings from '../containers/WindowViewSettings';
 
 /**
  */
-class WindowTopMenu extends Component {
+export class WindowTopMenu extends Component {
   /**
    * render
    * @return
@@ -43,5 +43,3 @@ WindowTopMenu.propTypes = {
 WindowTopMenu.defaultProps = {
   anchorEl: null,
 };
-
-export default WindowTopMenu;
diff --git a/src/components/WindowTopMenuButton.js b/src/components/WindowTopMenuButton.js
index bbef7d000..4af5dc32d 100644
--- a/src/components/WindowTopMenuButton.js
+++ b/src/components/WindowTopMenuButton.js
@@ -6,7 +6,7 @@ import WindowTopMenu from '../containers/WindowTopMenu';
 
 /**
  */
-class WindowTopMenuButton extends Component {
+export class WindowTopMenuButton extends Component {
   /**
    * constructor -
    */
@@ -76,5 +76,3 @@ WindowTopMenuButton.propTypes = {
 WindowTopMenuButton.defaultProps = {
   t: key => key,
 };
-
-export default WindowTopMenuButton;
diff --git a/src/components/WindowViewSettings.js b/src/components/WindowViewSettings.js
index c3f5faa0e..61f5d899e 100644
--- a/src/components/WindowViewSettings.js
+++ b/src/components/WindowViewSettings.js
@@ -10,7 +10,7 @@ import PropTypes from 'prop-types';
 /**
  *
  */
-export default class WindowViewSettings extends Component {
+export class WindowViewSettings extends Component {
   /**
    * constructor -
    */
diff --git a/src/components/WindowViewer.js b/src/components/WindowViewer.js
index b833a101f..4ecbb8f58 100644
--- a/src/components/WindowViewer.js
+++ b/src/components/WindowViewer.js
@@ -9,7 +9,7 @@ import CanvasGroupings from '../lib/CanvasGroupings';
  * Represents a WindowViewer in the mirador workspace. Responsible for mounting
  * OSD and Navigation
  */
-class WindowViewer extends Component {
+export class WindowViewer extends Component {
   /**
    * @param {Object} props
    */
@@ -127,5 +127,3 @@ WindowViewer.propTypes = {
   manifest: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
   window: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default WindowViewer;
diff --git a/src/components/Workspace.js b/src/components/Workspace.js
index 72613eab6..8de5b4976 100644
--- a/src/components/Workspace.js
+++ b/src/components/Workspace.js
@@ -10,7 +10,7 @@ import ns from '../config/css-ns';
  * @memberof Workspace
  * @private
  */
-class Workspace extends React.Component {
+export class Workspace extends React.Component {
   /**
    * Determine which workspace to render by configured type
    */
@@ -55,5 +55,3 @@ Workspace.propTypes = {
   windows: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
   workspaceType: PropTypes.string.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default Workspace;
diff --git a/src/components/WorkspaceAdd.js b/src/components/WorkspaceAdd.js
index 256581132..8be99d002 100644
--- a/src/components/WorkspaceAdd.js
+++ b/src/components/WorkspaceAdd.js
@@ -18,7 +18,7 @@ import ManifestListItem from '../containers/ManifestListItem';
  * @memberof Workspace
  * @private
  */
-class WorkspaceAdd extends React.Component {
+export class WorkspaceAdd extends React.Component {
   /** */
   constructor(props) {
     super(props);
@@ -104,5 +104,3 @@ WorkspaceAdd.defaultProps = {
   classes: {},
   t: key => key,
 };
-
-export default WorkspaceAdd;
diff --git a/src/components/WorkspaceAddButton.js b/src/components/WorkspaceAddButton.js
index 027326832..12dd32b86 100644
--- a/src/components/WorkspaceAddButton.js
+++ b/src/components/WorkspaceAddButton.js
@@ -7,7 +7,7 @@ import ClearIcon from '@material-ui/icons/Clear';
 
 /**
  */
-class WorkspaceAddButton extends Component {
+export class WorkspaceAddButton extends Component {
   /**
    * render
    * @return
@@ -47,5 +47,3 @@ WorkspaceAddButton.defaultProps = {
   t: key => key,
   isWorkspaceAddVisible: false,
 };
-
-export default WorkspaceAddButton;
diff --git a/src/components/WorkspaceControlPanel.js b/src/components/WorkspaceControlPanel.js
index 59a89b7d8..86c86273b 100644
--- a/src/components/WorkspaceControlPanel.js
+++ b/src/components/WorkspaceControlPanel.js
@@ -9,7 +9,7 @@ import ns from '../config/css-ns';
 /**
  * Provides the panel responsible for controlling the entire workspace
  */
-class WorkspaceControlPanel extends Component {
+export class WorkspaceControlPanel extends Component {
   /**
    * render
    * @return {String} - HTML markup for the component
@@ -34,5 +34,3 @@ class WorkspaceControlPanel extends Component {
 WorkspaceControlPanel.propTypes = {
   classes: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default WorkspaceControlPanel;
diff --git a/src/components/WorkspaceControlPanelButtons.js b/src/components/WorkspaceControlPanelButtons.js
index a9f75a68f..4290b3cd2 100644
--- a/src/components/WorkspaceControlPanelButtons.js
+++ b/src/components/WorkspaceControlPanelButtons.js
@@ -8,7 +8,7 @@ import WorkspaceMenuButton from '../containers/WorkspaceMenuButton';
 /**
  *
  */
-class WorkspaceControlPanelButtons extends Component {
+export class WorkspaceControlPanelButtons extends Component {
   /**
    * render
    *
@@ -34,5 +34,3 @@ WorkspaceControlPanelButtons.propTypes = {
 WorkspaceControlPanelButtons.defaultProps = {
   children: null,
 };
-
-export default WorkspaceControlPanelButtons;
diff --git a/src/components/WorkspaceExport.js b/src/components/WorkspaceExport.js
index 9407576c5..047f77d46 100644
--- a/src/components/WorkspaceExport.js
+++ b/src/components/WorkspaceExport.js
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
 
 /**
  */
-class WorkspaceExport extends Component {
+export class WorkspaceExport extends Component {
   /**
    * @private
    */
@@ -55,5 +55,3 @@ WorkspaceExport.defaultProps = {
   children: null,
   t: key => key,
 };
-
-export default WorkspaceExport;
diff --git a/src/components/WorkspaceFullScreenButton.js b/src/components/WorkspaceFullScreenButton.js
index 66867963d..008de38d3 100644
--- a/src/components/WorkspaceFullScreenButton.js
+++ b/src/components/WorkspaceFullScreenButton.js
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
 
 /**
  */
-class WorkspaceFullScreenButton extends Component {
+export class WorkspaceFullScreenButton extends Component {
   /**
    * render
    * @return
@@ -32,5 +32,3 @@ WorkspaceFullScreenButton.propTypes = {
 WorkspaceFullScreenButton.defaultProps = {
   t: key => key,
 };
-
-export default WorkspaceFullScreenButton;
diff --git a/src/components/WorkspaceMenu.js b/src/components/WorkspaceMenu.js
index facbe4fbd..361a21337 100644
--- a/src/components/WorkspaceMenu.js
+++ b/src/components/WorkspaceMenu.js
@@ -11,14 +11,14 @@ import SettingsIcon from '@material-ui/icons/Settings';
 import ViewHeadlineIcon from '@material-ui/icons/ViewHeadline';
 import PropTypes from 'prop-types';
 import LanguageSettings from '../containers/LanguageSettings';
-import NestedMenu from './NestedMenu';
+import { NestedMenu } from './NestedMenu';
 import WindowList from '../containers/WindowList';
 import WorkspaceSettings from '../containers/WorkspaceSettings';
 import WorkspaceExport from '../containers/WorkspaceExport';
 
 /**
  */
-class WorkspaceMenu extends Component {
+export class WorkspaceMenu extends Component {
   /**
    * constructor -
    */
@@ -171,5 +171,3 @@ WorkspaceMenu.defaultProps = {
   showZoomControls: false,
   toggleZoomControls: () => {},
 };
-
-export default WorkspaceMenu;
diff --git a/src/components/WorkspaceMenuButton.js b/src/components/WorkspaceMenuButton.js
index 3daaa8970..43948b517 100644
--- a/src/components/WorkspaceMenuButton.js
+++ b/src/components/WorkspaceMenuButton.js
@@ -7,7 +7,7 @@ import WorkspaceMenu from '../containers/WorkspaceMenu';
 
 /**
  */
-class WorkspaceMenuButton extends Component {
+export class WorkspaceMenuButton extends Component {
   /**
    * constructor -
    */
@@ -78,5 +78,3 @@ WorkspaceMenuButton.propTypes = {
 WorkspaceMenuButton.defaultProps = {
   t: key => key,
 };
-
-export default WorkspaceMenuButton;
diff --git a/src/components/WorkspaceMosaic.js b/src/components/WorkspaceMosaic.js
index 15006a5ee..629081a2c 100644
--- a/src/components/WorkspaceMosaic.js
+++ b/src/components/WorkspaceMosaic.js
@@ -11,7 +11,7 @@ import Window from '../containers/Window';
  * @memberof Workspace
  * @private
  */
-class WorkspaceMosaic extends React.Component {
+export class WorkspaceMosaic extends React.Component {
   /**
    */
   constructor(props) {
@@ -100,11 +100,8 @@ class WorkspaceMosaic extends React.Component {
   }
 }
 
-
 WorkspaceMosaic.propTypes = {
   updateWorkspaceMosaicLayout: PropTypes.func.isRequired,
   windows: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
   workspace: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
 };
-
-export default WorkspaceMosaic;
diff --git a/src/components/WorkspaceSettings.js b/src/components/WorkspaceSettings.js
index 925436765..f3d4dfc32 100644
--- a/src/components/WorkspaceSettings.js
+++ b/src/components/WorkspaceSettings.js
@@ -10,7 +10,7 @@ import PropTypes from 'prop-types';
 
 /**
  */
-class WorkspaceSettings extends Component {
+export class WorkspaceSettings extends Component {
   /**
    * constructor -
    */
@@ -81,5 +81,3 @@ WorkspaceSettings.defaultProps = {
   children: null,
   t: key => key,
 };
-
-export default WorkspaceSettings;
diff --git a/src/components/ZoomControls.js b/src/components/ZoomControls.js
index 1896c60ac..b50db0694 100644
--- a/src/components/ZoomControls.js
+++ b/src/components/ZoomControls.js
@@ -9,7 +9,7 @@ import PropTypes from 'prop-types';
 
 /**
  */
-class ZoomControls extends Component {
+export class ZoomControls extends Component {
   /**
    * constructor -
    */
@@ -115,5 +115,3 @@ ZoomControls.defaultProps = {
   updateViewport: () => {},
   t: key => key,
 };
-
-export default ZoomControls;
diff --git a/src/components/index.js b/src/components/index.js
new file mode 100644
index 000000000..e624b5872
--- /dev/null
+++ b/src/components/index.js
@@ -0,0 +1,41 @@
+export * from './App';
+export * from './CanvasThumbnail';
+export * from './CompanionWindow';
+export * from './LabelValueMetadata';
+export * from './LanguageSettings';
+export * from './ManifestForm';
+export * from './ManifestListItem';
+export * from './ManifestListItemError';
+export * from './NestedMenu';
+export * from './OpenSeadragonViewer';
+export * from './SanitizedHtml';
+export * from './ThumbnailNavigation';
+export * from './ValidationCanvas';
+export * from './ViewerNavigation';
+export * from './Window';
+export * from './WindowList';
+export * from './WindowMiddleContent';
+export * from './WindowSideBar';
+export * from './WindowSideBarButtons';
+export * from './WindowSideBarCanvasPanel';
+export * from './WindowSideBarInfoPanel';
+export * from './WindowSideBarPanel';
+export * from './WindowThumbnailSettings';
+export * from './WindowTopBar';
+export * from './WindowTopBarButtons';
+export * from './WindowTopMenu';
+export * from './WindowTopMenuButton';
+export * from './WindowViewer';
+export * from './WindowViewSettings';
+export * from './Workspace';
+export * from './WorkspaceAdd';
+export * from './WorkspaceAddButton';
+export * from './WorkspaceControlPanel';
+export * from './WorkspaceControlPanelButtons';
+export * from './WorkspaceExport';
+export * from './WorkspaceFullScreenButton';
+export * from './WorkspaceMenu';
+export * from './WorkspaceMenuButton';
+export * from './WorkspaceMosaic';
+export * from './WorkspaceSettings';
+export * from './ZoomControls';
diff --git a/src/containers/App.js b/src/containers/App.js
index 8136706c3..a5afdb705 100644
--- a/src/containers/App.js
+++ b/src/containers/App.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { connect } from 'react-redux';
 import { withStyles } from '@material-ui/core/styles';
 import * as actions from '../state/actions';
-import App from '../components/App';
+import { App } from '../components/App';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/CompanionWindow.js b/src/containers/CompanionWindow.js
index 6f67db4c4..8966ab3a9 100644
--- a/src/containers/CompanionWindow.js
+++ b/src/containers/CompanionWindow.js
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import CompanionWindow from '../components/CompanionWindow';
+import { CompanionWindow } from '../components/CompanionWindow';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/LanguageSettings.js b/src/containers/LanguageSettings.js
index ffd9c2147..380aa2c20 100644
--- a/src/containers/LanguageSettings.js
+++ b/src/containers/LanguageSettings.js
@@ -1,7 +1,7 @@
 import { connect } from 'react-redux';
 import * as actions from '../state/actions';
 import { getLanguagesFromConfigWithCurrent } from '../state/selectors';
-import LanguageSettings from '../components/LanguageSettings';
+import { LanguageSettings } from '../components/LanguageSettings';
 
 /**
  * Map state to props for connect
diff --git a/src/containers/ManifestForm.js b/src/containers/ManifestForm.js
index f8c68e390..d3fb3d94b 100644
--- a/src/containers/ManifestForm.js
+++ b/src/containers/ManifestForm.js
@@ -2,7 +2,7 @@ import { connect } from 'react-redux';
 import { compose } from 'redux';
 import { withNamespaces } from 'react-i18next';
 import * as actions from '../state/actions';
-import ManifestForm from '../components/ManifestForm';
+import { ManifestForm } from '../components/ManifestForm';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/ManifestListItem.js b/src/containers/ManifestListItem.js
index da4d5bfd9..f8c032e94 100644
--- a/src/containers/ManifestListItem.js
+++ b/src/containers/ManifestListItem.js
@@ -6,7 +6,7 @@ import {
   getManifestTitle, getManifestLogo, getManifestThumbnail, getManifestCanvases, getManifestProvider,
 } from '../state/selectors';
 import * as actions from '../state/actions';
-import ManifestListItem from '../components/ManifestListItem';
+import { ManifestListItem } from '../components/ManifestListItem';
 
 /** */
 const mapStateToProps = (state, { manifestId }) => {
diff --git a/src/containers/ManifestListItemError.js b/src/containers/ManifestListItemError.js
index 5aa930fd4..10f4eac5f 100644
--- a/src/containers/ManifestListItemError.js
+++ b/src/containers/ManifestListItemError.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core/styles';
 import { fetchManifest, removeManifest } from '../state/actions/manifest';
-import ManifestListItemError from '../components/ManifestListItemError';
+import { ManifestListItemError } from '../components/ManifestListItemError';
 
 /** */
 const mapDispatchToProps = {
diff --git a/src/containers/OpenSeadragonViewer.js b/src/containers/OpenSeadragonViewer.js
index 11aaad06a..bb1242dad 100644
--- a/src/containers/OpenSeadragonViewer.js
+++ b/src/containers/OpenSeadragonViewer.js
@@ -1,7 +1,7 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import OpenSeadragonViewer from '../components/OpenSeadragonViewer';
+import { OpenSeadragonViewer } from '../components/OpenSeadragonViewer';
 import * as actions from '../state/actions';
 
 /**
diff --git a/src/containers/ThumbnailNavigation.js b/src/containers/ThumbnailNavigation.js
index d0e33828d..da94c4263 100644
--- a/src/containers/ThumbnailNavigation.js
+++ b/src/containers/ThumbnailNavigation.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import CanvasGroupings from '../lib/CanvasGroupings';
 import * as actions from '../state/actions';
-import ThumbnailNavigation from '../components/ThumbnailNavigation';
+import { ThumbnailNavigation } from '../components/ThumbnailNavigation';
 import { getManifestCanvases } from '../state/selectors';
 /**
  * mapStateToProps - used to hook up state to props
diff --git a/src/containers/ViewerNavigation.js b/src/containers/ViewerNavigation.js
index 88eef70ad..82d63b924 100644
--- a/src/containers/ViewerNavigation.js
+++ b/src/containers/ViewerNavigation.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { connect } from 'react-redux';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import * as actions from '../state/actions';
-import ViewerNavigation from '../components/ViewerNavigation';
+import { ViewerNavigation } from '../components/ViewerNavigation';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/Window.js b/src/containers/Window.js
index 1532051f8..c0cbb4c53 100644
--- a/src/containers/Window.js
+++ b/src/containers/Window.js
@@ -1,6 +1,6 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
-import Window from '../components/Window';
+import { Window } from '../components/Window';
 
 /**
  * mapStateToProps - used to hook up connect to action creators
@@ -14,7 +14,6 @@ const mapStateToProps = ({ manifests, windows }, props) => ({
 
 const enhance = compose(
   connect(mapStateToProps),
-  // further HOC go here
 );
 
 export default enhance(Window);
diff --git a/src/containers/WindowList.js b/src/containers/WindowList.js
index 4679a79c7..7c9a713d1 100644
--- a/src/containers/WindowList.js
+++ b/src/containers/WindowList.js
@@ -2,7 +2,7 @@ import { connect } from 'react-redux';
 import { compose } from 'redux';
 import { withNamespaces } from 'react-i18next';
 import * as actions from '../state/actions';
-import WindowList from '../components/WindowList';
+import { WindowList } from '../components/WindowList';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/WindowMiddleContent.js b/src/containers/WindowMiddleContent.js
index 9ca434593..2165d5aec 100644
--- a/src/containers/WindowMiddleContent.js
+++ b/src/containers/WindowMiddleContent.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { connect } from 'react-redux';
 import { getCompantionWindowIds } from '../state/selectors';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowMiddleContent from '../components/WindowMiddleContent';
+import { WindowMiddleContent } from '../components/WindowMiddleContent';
 
 /** */
 const mapStateToProps = (state, { window }) => ({
diff --git a/src/containers/WindowSideBar.js b/src/containers/WindowSideBar.js
index ab74ea293..1a1731d5d 100644
--- a/src/containers/WindowSideBar.js
+++ b/src/containers/WindowSideBar.js
@@ -2,7 +2,7 @@ import { connect } from 'react-redux';
 import { compose } from 'redux';
 import { withStyles } from '@material-ui/core';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowSideBar from '../components/WindowSideBar';
+import { WindowSideBar } from '../components/WindowSideBar';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WindowSideBarButtons.js b/src/containers/WindowSideBarButtons.js
index 6347829f0..71c63bfb8 100644
--- a/src/containers/WindowSideBarButtons.js
+++ b/src/containers/WindowSideBarButtons.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowSideBarButtons from '../components/WindowSideBarButtons';
+import { WindowSideBarButtons } from '../components/WindowSideBarButtons';
 
 
 /**
diff --git a/src/containers/WindowSideBarCanvasPanel.js b/src/containers/WindowSideBarCanvasPanel.js
index dddabb541..f0a10b4f2 100644
--- a/src/containers/WindowSideBarCanvasPanel.js
+++ b/src/containers/WindowSideBarCanvasPanel.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core/styles';
 import * as actions from '../state/actions';
-import WindowSideBarCanvasPanel from '../components/WindowSideBarCanvasPanel';
+import { WindowSideBarCanvasPanel } from '../components/WindowSideBarCanvasPanel';
 import {
   getManifestCanvases,
   getWindowManifest,
diff --git a/src/containers/WindowSideBarInfoPanel.js b/src/containers/WindowSideBarInfoPanel.js
index 13b272b5f..8ada22608 100644
--- a/src/containers/WindowSideBarInfoPanel.js
+++ b/src/containers/WindowSideBarInfoPanel.js
@@ -12,7 +12,7 @@ import {
   getWindowManifest,
   getCanvasDescription,
 } from '../state/selectors';
-import WindowSideBarInfoPanel from '../components/WindowSideBarInfoPanel';
+import { WindowSideBarInfoPanel } from '../components/WindowSideBarInfoPanel';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WindowSideBarPanel.js b/src/containers/WindowSideBarPanel.js
index 8773ac5ae..6f959bb04 100644
--- a/src/containers/WindowSideBarPanel.js
+++ b/src/containers/WindowSideBarPanel.js
@@ -3,7 +3,7 @@ import { compose } from 'redux';
 import { withNamespaces } from 'react-i18next';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowSideBarPanel from '../components/WindowSideBarPanel';
+import { WindowSideBarPanel } from '../components/WindowSideBarPanel';
 
 /** */
 const mapDispatchToProps = {
diff --git a/src/containers/WindowThumbnailSettings.js b/src/containers/WindowThumbnailSettings.js
index 2f721a632..27c7b5fac 100644
--- a/src/containers/WindowThumbnailSettings.js
+++ b/src/containers/WindowThumbnailSettings.js
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import * as actions from '../state/actions';
 import { getThumbnailNavigationPosition } from '../state/selectors';
-import WindowThumbnailSettings from '../components/WindowThumbnailSettings';
+import { WindowThumbnailSettings } from '../components/WindowThumbnailSettings';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/WindowTopBar.js b/src/containers/WindowTopBar.js
index 245fca7d1..26c912aea 100644
--- a/src/containers/WindowTopBar.js
+++ b/src/containers/WindowTopBar.js
@@ -5,7 +5,7 @@ import { withStyles } from '@material-ui/core';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import { getWindowManifest, getManifestTitle } from '../state/selectors';
-import WindowTopBar from '../components/WindowTopBar';
+import { WindowTopBar } from '../components/WindowTopBar';
 
 /** mapStateToProps */
 const mapStateToProps = (state, { windowId }) => ({
diff --git a/src/containers/WindowTopBarButtons.js b/src/containers/WindowTopBarButtons.js
index dd169b0dc..fe70d52ef 100644
--- a/src/containers/WindowTopBarButtons.js
+++ b/src/containers/WindowTopBarButtons.js
@@ -1,4 +1,4 @@
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowTopBarButtons from '../components/WindowTopBarButtons';
+import { WindowTopBarButtons } from '../components/WindowTopBarButtons';
 
 export default miradorWithPlugins(WindowTopBarButtons);
diff --git a/src/containers/WindowTopMenu.js b/src/containers/WindowTopMenu.js
index cd163f2f5..5cfba2887 100644
--- a/src/containers/WindowTopMenu.js
+++ b/src/containers/WindowTopMenu.js
@@ -1,4 +1,4 @@
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowTopMenu from '../components/WindowTopMenu';
+import { WindowTopMenu } from '../components/WindowTopMenu';
 
 export default miradorWithPlugins(WindowTopMenu);
diff --git a/src/containers/WindowTopMenuButton.js b/src/containers/WindowTopMenuButton.js
index c3ea20eca..331c842a1 100644
--- a/src/containers/WindowTopMenuButton.js
+++ b/src/containers/WindowTopMenuButton.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowTopMenuButton from '../components/WindowTopMenuButton';
+import { WindowTopMenuButton } from '../components/WindowTopMenuButton';
 
 /**
  *
diff --git a/src/containers/WindowViewSettings.js b/src/containers/WindowViewSettings.js
index b7e709397..dc7be5f83 100644
--- a/src/containers/WindowViewSettings.js
+++ b/src/containers/WindowViewSettings.js
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import * as actions from '../state/actions';
 import { getWindowViewType } from '../state/selectors';
-import WindowViewSettings from '../components/WindowViewSettings';
+import { WindowViewSettings } from '../components/WindowViewSettings';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/WindowViewer.js b/src/containers/WindowViewer.js
index 037e6e2fd..61f185edf 100644
--- a/src/containers/WindowViewer.js
+++ b/src/containers/WindowViewer.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { connect } from 'react-redux';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WindowViewer from '../components/WindowViewer';
+import { WindowViewer } from '../components/WindowViewer';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/Workspace.js b/src/containers/Workspace.js
index 940214a98..ea8c5b444 100644
--- a/src/containers/Workspace.js
+++ b/src/containers/Workspace.js
@@ -1,6 +1,6 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
-import Workspace from '../components/Workspace';
+import { Workspace } from '../components/Workspace';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WorkspaceAdd.js b/src/containers/WorkspaceAdd.js
index 92a277f6f..9cb48aa06 100644
--- a/src/containers/WorkspaceAdd.js
+++ b/src/containers/WorkspaceAdd.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import * as actions from '../state/actions';
-import WorkspaceAdd from '../components/WorkspaceAdd';
+import { WorkspaceAdd } from '../components/WorkspaceAdd';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WorkspaceAddButton.js b/src/containers/WorkspaceAddButton.js
index a52d04d31..3f4ec11c3 100644
--- a/src/containers/WorkspaceAddButton.js
+++ b/src/containers/WorkspaceAddButton.js
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import * as actions from '../state/actions';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WorkspaceAddButton from '../components/WorkspaceAddButton';
+import { WorkspaceAddButton } from '../components/WorkspaceAddButton';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WorkspaceControlPanel.js b/src/containers/WorkspaceControlPanel.js
index d25f6a3e6..03fb31567 100644
--- a/src/containers/WorkspaceControlPanel.js
+++ b/src/containers/WorkspaceControlPanel.js
@@ -1,5 +1,5 @@
 import { withStyles } from '@material-ui/core/styles';
-import WorkspaceControlPanel from '../components/WorkspaceControlPanel';
+import { WorkspaceControlPanel } from '../components/WorkspaceControlPanel';
 
 /**
  *
diff --git a/src/containers/WorkspaceControlPanelButtons.js b/src/containers/WorkspaceControlPanelButtons.js
index 48a6ea89e..1535ffb5c 100644
--- a/src/containers/WorkspaceControlPanelButtons.js
+++ b/src/containers/WorkspaceControlPanelButtons.js
@@ -1,5 +1,5 @@
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WorkspaceControlPanelButtons
+import { WorkspaceControlPanelButtons }
   from '../components/WorkspaceControlPanelButtons';
 
 export default miradorWithPlugins(WorkspaceControlPanelButtons);
diff --git a/src/containers/WorkspaceExport.js b/src/containers/WorkspaceExport.js
index 5157cafc0..923941481 100644
--- a/src/containers/WorkspaceExport.js
+++ b/src/containers/WorkspaceExport.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WorkspaceExport from '../components/WorkspaceExport';
+import { WorkspaceExport } from '../components/WorkspaceExport';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WorkspaceFullScreenButton.js b/src/containers/WorkspaceFullScreenButton.js
index a274b21e2..12c48eed3 100644
--- a/src/containers/WorkspaceFullScreenButton.js
+++ b/src/containers/WorkspaceFullScreenButton.js
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import * as actions from '../state/actions';
-import WorkspaceFullScreenButton
+import { WorkspaceFullScreenButton }
   from '../components/WorkspaceFullScreenButton';
 
 /**
diff --git a/src/containers/WorkspaceMenu.js b/src/containers/WorkspaceMenu.js
index 38e36d2bb..2170058e5 100644
--- a/src/containers/WorkspaceMenu.js
+++ b/src/containers/WorkspaceMenu.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import * as actions from '../state/actions';
-import WorkspaceMenu from '../components/WorkspaceMenu';
+import { WorkspaceMenu } from '../components/WorkspaceMenu';
 
 /**
  * mapDispatchToProps - used to hook up connect to action creators
diff --git a/src/containers/WorkspaceMenuButton.js b/src/containers/WorkspaceMenuButton.js
index 1273953f2..139020ccb 100644
--- a/src/containers/WorkspaceMenuButton.js
+++ b/src/containers/WorkspaceMenuButton.js
@@ -2,7 +2,7 @@ import { compose } from 'redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
-import WorkspaceMenuButton from '../components/WorkspaceMenuButton';
+import { WorkspaceMenuButton } from '../components/WorkspaceMenuButton';
 
 /**
  *
diff --git a/src/containers/WorkspaceMosaic.js b/src/containers/WorkspaceMosaic.js
index d6b4a388c..7a1891a48 100644
--- a/src/containers/WorkspaceMosaic.js
+++ b/src/containers/WorkspaceMosaic.js
@@ -1,7 +1,7 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
 import * as actions from '../state/actions';
-import WorkspaceMosaic from '../components/WorkspaceMosaic';
+import { WorkspaceMosaic } from '../components/WorkspaceMosaic';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/containers/WorkspaceSettings.js b/src/containers/WorkspaceSettings.js
index 1250a96fa..9ded53451 100644
--- a/src/containers/WorkspaceSettings.js
+++ b/src/containers/WorkspaceSettings.js
@@ -1,7 +1,7 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
-import WorkspaceSettings from '../components/WorkspaceSettings';
+import { WorkspaceSettings } from '../components/WorkspaceSettings';
 import * as actions from '../state/actions';
 
 /**
diff --git a/src/containers/ZoomControls.js b/src/containers/ZoomControls.js
index a3640e2ff..1173a21a6 100644
--- a/src/containers/ZoomControls.js
+++ b/src/containers/ZoomControls.js
@@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 import { withNamespaces } from 'react-i18next';
 import { withStyles } from '@material-ui/core';
 import * as actions from '../state/actions';
-import ZoomControls from '../components/ZoomControls';
+import { ZoomControls } from '../components/ZoomControls';
 
 /**
  * mapStateToProps - to hook up connect
diff --git a/src/index.js b/src/index.js
index 406e2a89e..89fcbb163 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,9 @@
 import init from './init';
 
+export * from './components';
+export * from './state/actions';
+export * from './state/reducers';
+
 const exports = {
   viewer: init,
   plugins: {},
diff --git a/src/lib/miradorWithPlugins.js b/src/lib/miradorWithPlugins.js
index 407bfe25a..ab24325b3 100644
--- a/src/lib/miradorWithPlugins.js
+++ b/src/lib/miradorWithPlugins.js
@@ -37,7 +37,6 @@ export default function miradorWithPlugins(WrappedComponent) {
       return (
         <>
           <WrappedComponent {...this.props} ref={(parent) => { this.pluginParent = parent; }} />
-          { /* TODO: Refactor .name here in some way so we dont need to rely on it */}
           {componentPlugins(WrappedComponent.name, plugins)
             .map(component => React.createElement(
               connect(component.mapStateToProps, component.mapDispatchToProps)(component.component),
@@ -49,9 +48,7 @@ export default function miradorWithPlugins(WrappedComponent) {
     }
   }
 
-  const wrappedComponentName = WrappedComponent.displayName
-  || WrappedComponent.name
-  || 'Component';
+  const wrappedComponentName = WrappedComponent.name || 'Component';
 
   ConnectedComponent.displayName = `miradorWithPlugins(${wrappedComponentName})`;
 
-- 
GitLab