From 679b2cd1a4887dea325e73ecf7f08aacc31f3864 Mon Sep 17 00:00:00 2001
From: Tamlyn Rhodes <tamlyn@tamlyn.org>
Date: Thu, 14 Dec 2017 18:06:26 +0000
Subject: [PATCH] Use @pubsweet/ui and remove xpub-ui

---
 README.md                                     |   1 -
 packages/component-app/package.json           |   2 +-
 packages/component-app/src/components/App.js  |   2 +-
 .../component-authentication/package.json     |   2 +-
 .../src/components/Login.js                   |   2 +-
 .../src/components/Signup.js                  |   2 +-
 packages/component-dashboard/package.json     |   2 +-
 .../src/components/AssignEditor.js            |   3 +-
 .../src/components/Reviews.js                 |   2 +-
 .../src/components/UploadManuscript.js        |   2 +-
 .../src/components/sections/ReviewerItem.js   |   2 +-
 packages/component-review/package.json        |   2 +-
 .../src/components/decision/Decision.js       |   2 +-
 .../src/components/decision/DecisionForm.js   |   2 +-
 .../src/components/metadata/ReviewMetadata.js |   2 +-
 .../src/components/review/Review.js           |   2 +-
 .../src/components/review/ReviewForm.js       |   2 +-
 .../src/components/reviewers/Reviewer.js      |   2 +-
 .../src/components/reviewers/ReviewerForm.js  |   2 +-
 packages/component-submit/package.json        |   2 +-
 .../src/components/Confirm.js                 |   2 +-
 .../src/components/Declarations.js            |   2 +-
 .../src/components/Metadata.js                |   2 +-
 .../component-submit/src/components/Notes.js  |   2 +-
 .../component-submit/src/components/Submit.js |   2 +-
 .../src/components/Suggestions.js             |   2 +-
 .../src/components/SupplementaryFiles.js      |   2 +-
 packages/xpub-collabra/package.json           |   2 +-
 packages/xpub-theme/src/variables.css         |   2 +-
 packages/xpub-ui/.eslintrc                    |   7 -
 packages/xpub-ui/docs/colors.md               |  45 --
 packages/xpub-ui/docs/fonts.md                |  33 -
 packages/xpub-ui/package.json                 |  69 --
 packages/xpub-ui/src/atoms/Attachment.js      |  14 -
 .../xpub-ui/src/atoms/Attachment.local.scss   |  13 -
 packages/xpub-ui/src/atoms/Attachment.md      |  10 -
 packages/xpub-ui/src/atoms/Avatar.js          |  44 --
 packages/xpub-ui/src/atoms/Avatar.local.scss  | 141 ----
 packages/xpub-ui/src/atoms/Avatar.md          |  10 -
 packages/xpub-ui/src/atoms/Badge.js           |  13 -
 packages/xpub-ui/src/atoms/Badge.local.scss   |  25 -
 packages/xpub-ui/src/atoms/Badge.md           |  16 -
 packages/xpub-ui/src/atoms/Button.js          |  26 -
 packages/xpub-ui/src/atoms/Button.local.scss  | 103 ---
 packages/xpub-ui/src/atoms/Button.md          |  18 -
 packages/xpub-ui/src/atoms/Checkbox.js        |  34 -
 .../xpub-ui/src/atoms/Checkbox.local.scss     |  56 --
 packages/xpub-ui/src/atoms/Checkbox.md        |  33 -
 packages/xpub-ui/src/atoms/File.js            |  20 -
 packages/xpub-ui/src/atoms/File.local.scss    | 101 ---
 packages/xpub-ui/src/atoms/File.md            |  31 -
 packages/xpub-ui/src/atoms/Icon.js            |  16 -
 packages/xpub-ui/src/atoms/Icon.local.scss    |   3 -
 packages/xpub-ui/src/atoms/Icon.md            |  17 -
 packages/xpub-ui/src/atoms/Menu.js            |  99 ---
 packages/xpub-ui/src/atoms/Menu.local.scss    |  92 ---
 packages/xpub-ui/src/atoms/Menu.md            |  44 --
 packages/xpub-ui/src/atoms/Radio.js           |  52 --
 packages/xpub-ui/src/atoms/Radio.local.scss   |  59 --
 packages/xpub-ui/src/atoms/Radio.md           |  54 --
 packages/xpub-ui/src/atoms/Tags.js            |  59 --
 packages/xpub-ui/src/atoms/Tags.md            |  21 -
 packages/xpub-ui/src/atoms/Tags.scss          | 129 ----
 packages/xpub-ui/src/atoms/TextField.js       |  31 -
 .../xpub-ui/src/atoms/TextField.local.scss    |  35 -
 packages/xpub-ui/src/atoms/TextField.md       |  23 -
 packages/xpub-ui/src/atoms/UploadingFile.js   |  27 -
 .../src/atoms/UploadingFile.local.scss        | 113 ----
 packages/xpub-ui/src/atoms/UploadingFile.md   |  29 -
 packages/xpub-ui/src/atoms/ValidatedField.js  |  44 --
 .../src/atoms/ValidatedField.local.scss       |  28 -
 packages/xpub-ui/src/atoms/ValidatedField.md  |  33 -
 packages/xpub-ui/src/index.js                 |  23 -
 packages/xpub-ui/src/lib/animation.scss       |  29 -
 packages/xpub-ui/src/lib/colors.local.scss    |   4 -
 packages/xpub-ui/src/molecules/AppBar.js      |  40 --
 .../xpub-ui/src/molecules/AppBar.local.scss   |  43 --
 packages/xpub-ui/src/molecules/AppBar.md      |  20 -
 packages/xpub-ui/src/molecules/Attachments.js |  25 -
 .../src/molecules/Attachments.local.scss      |  13 -
 packages/xpub-ui/src/molecules/Attachments.md |  18 -
 .../xpub-ui/src/molecules/CheckboxGroup.js    |  53 --
 .../xpub-ui/src/molecules/CheckboxGroup.md    |  54 --
 packages/xpub-ui/src/molecules/Files.js       |  99 ---
 .../xpub-ui/src/molecules/Files.local.scss    |  34 -
 packages/xpub-ui/src/molecules/Files.md       |  22 -
 packages/xpub-ui/src/molecules/PlainButton.js |  25 -
 .../src/molecules/PlainButton.local.scss      |  21 -
 packages/xpub-ui/src/molecules/PlainButton.md |   5 -
 packages/xpub-ui/src/molecules/RadioGroup.js  |  44 --
 packages/xpub-ui/src/molecules/RadioGroup.md  |  48 --
 .../xpub-ui/src/molecules/Supplementary.js    |  22 -
 .../xpub-ui/src/molecules/Supplementary.md    |  18 -
 packages/xpub-ui/src/molecules/Upload.js      |  67 --
 packages/xpub-ui/src/molecules/YesOrNo.js     |  29 -
 .../xpub-ui/src/molecules/YesOrNo.local.scss  |   3 -
 packages/xpub-ui/src/molecules/YesOrNo.md     |  17 -
 packages/xpub-ui/styleguide.config.js         |  39 --
 packages/xpub-ui/test/AppBar.test.js          | 103 ---
 packages/xpub-ui/test/Menu.test.js            |  24 -
 packages/xpub-ui/test/Radio.test.js           |  31 -
 packages/xpub-ui/test/RadioGroup.test.js      | 110 ----
 packages/xpub-ui/test/YesOrNo.test.js         |  47 --
 .../test/__snapshots__/AppBar.test.js.snap    |  64 --
 .../test/__snapshots__/Menu.test.js.snap      |  33 -
 .../test/__snapshots__/Radio.test.js.snap     |  38 --
 .../__snapshots__/RadioGroup.test.js.snap     | 108 ----
 .../test/__snapshots__/YesOrNo.test.js.snap   |  74 ---
 packages/xpub-ui/test/config/transform.js     |   3 -
 packages/xpub-ui/test/setup/enzyme.js         |   4 -
 packages/xpub-ui/webpack.config.js            |   3 -
 yarn.lock                                     | 605 ++----------------
 112 files changed, 73 insertions(+), 3917 deletions(-)
 delete mode 100644 packages/xpub-ui/.eslintrc
 delete mode 100644 packages/xpub-ui/docs/colors.md
 delete mode 100644 packages/xpub-ui/docs/fonts.md
 delete mode 100644 packages/xpub-ui/package.json
 delete mode 100644 packages/xpub-ui/src/atoms/Attachment.js
 delete mode 100644 packages/xpub-ui/src/atoms/Attachment.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Attachment.md
 delete mode 100644 packages/xpub-ui/src/atoms/Avatar.js
 delete mode 100644 packages/xpub-ui/src/atoms/Avatar.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Avatar.md
 delete mode 100644 packages/xpub-ui/src/atoms/Badge.js
 delete mode 100644 packages/xpub-ui/src/atoms/Badge.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Badge.md
 delete mode 100644 packages/xpub-ui/src/atoms/Button.js
 delete mode 100644 packages/xpub-ui/src/atoms/Button.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Button.md
 delete mode 100644 packages/xpub-ui/src/atoms/Checkbox.js
 delete mode 100644 packages/xpub-ui/src/atoms/Checkbox.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Checkbox.md
 delete mode 100644 packages/xpub-ui/src/atoms/File.js
 delete mode 100644 packages/xpub-ui/src/atoms/File.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/File.md
 delete mode 100644 packages/xpub-ui/src/atoms/Icon.js
 delete mode 100644 packages/xpub-ui/src/atoms/Icon.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Icon.md
 delete mode 100644 packages/xpub-ui/src/atoms/Menu.js
 delete mode 100644 packages/xpub-ui/src/atoms/Menu.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Menu.md
 delete mode 100644 packages/xpub-ui/src/atoms/Radio.js
 delete mode 100644 packages/xpub-ui/src/atoms/Radio.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/Radio.md
 delete mode 100644 packages/xpub-ui/src/atoms/Tags.js
 delete mode 100644 packages/xpub-ui/src/atoms/Tags.md
 delete mode 100644 packages/xpub-ui/src/atoms/Tags.scss
 delete mode 100644 packages/xpub-ui/src/atoms/TextField.js
 delete mode 100644 packages/xpub-ui/src/atoms/TextField.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/TextField.md
 delete mode 100644 packages/xpub-ui/src/atoms/UploadingFile.js
 delete mode 100644 packages/xpub-ui/src/atoms/UploadingFile.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/UploadingFile.md
 delete mode 100644 packages/xpub-ui/src/atoms/ValidatedField.js
 delete mode 100644 packages/xpub-ui/src/atoms/ValidatedField.local.scss
 delete mode 100644 packages/xpub-ui/src/atoms/ValidatedField.md
 delete mode 100644 packages/xpub-ui/src/index.js
 delete mode 100644 packages/xpub-ui/src/lib/animation.scss
 delete mode 100644 packages/xpub-ui/src/lib/colors.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/AppBar.js
 delete mode 100644 packages/xpub-ui/src/molecules/AppBar.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/AppBar.md
 delete mode 100644 packages/xpub-ui/src/molecules/Attachments.js
 delete mode 100644 packages/xpub-ui/src/molecules/Attachments.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/Attachments.md
 delete mode 100644 packages/xpub-ui/src/molecules/CheckboxGroup.js
 delete mode 100644 packages/xpub-ui/src/molecules/CheckboxGroup.md
 delete mode 100644 packages/xpub-ui/src/molecules/Files.js
 delete mode 100644 packages/xpub-ui/src/molecules/Files.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/Files.md
 delete mode 100644 packages/xpub-ui/src/molecules/PlainButton.js
 delete mode 100644 packages/xpub-ui/src/molecules/PlainButton.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/PlainButton.md
 delete mode 100644 packages/xpub-ui/src/molecules/RadioGroup.js
 delete mode 100644 packages/xpub-ui/src/molecules/RadioGroup.md
 delete mode 100644 packages/xpub-ui/src/molecules/Supplementary.js
 delete mode 100644 packages/xpub-ui/src/molecules/Supplementary.md
 delete mode 100644 packages/xpub-ui/src/molecules/Upload.js
 delete mode 100644 packages/xpub-ui/src/molecules/YesOrNo.js
 delete mode 100644 packages/xpub-ui/src/molecules/YesOrNo.local.scss
 delete mode 100644 packages/xpub-ui/src/molecules/YesOrNo.md
 delete mode 100644 packages/xpub-ui/styleguide.config.js
 delete mode 100644 packages/xpub-ui/test/AppBar.test.js
 delete mode 100644 packages/xpub-ui/test/Menu.test.js
 delete mode 100644 packages/xpub-ui/test/Radio.test.js
 delete mode 100644 packages/xpub-ui/test/RadioGroup.test.js
 delete mode 100644 packages/xpub-ui/test/YesOrNo.test.js
 delete mode 100644 packages/xpub-ui/test/__snapshots__/AppBar.test.js.snap
 delete mode 100644 packages/xpub-ui/test/__snapshots__/Menu.test.js.snap
 delete mode 100644 packages/xpub-ui/test/__snapshots__/Radio.test.js.snap
 delete mode 100644 packages/xpub-ui/test/__snapshots__/RadioGroup.test.js.snap
 delete mode 100644 packages/xpub-ui/test/__snapshots__/YesOrNo.test.js.snap
 delete mode 100644 packages/xpub-ui/test/config/transform.js
 delete mode 100644 packages/xpub-ui/test/setup/enzyme.js
 delete mode 100644 packages/xpub-ui/webpack.config.js

diff --git a/README.md b/README.md
index 5c22e3415..f519a4a66 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,6 @@ Note: xpub is still _very_ new. This repository contains an initial set of compo
 * `xpub-selectors`: some useful redux selectors
 * `xpub-styleguide`: components for use in react-styleguidist
 * `xpub-theme`: fonts and styles for use in xpub applications
-* `xpub-ui`: a library of user interface elements for use in PubSweet components
 * `xpub-upload`: a helper function for file uploading
 * `xpub-validators`: validator functions for use with redux-form
 
diff --git a/packages/component-app/package.json b/packages/component-app/package.json
index 6a959c126..3307ac7ce 100644
--- a/packages/component-app/package.json
+++ b/packages/component-app/package.json
@@ -19,7 +19,7 @@
     "redux": "^3.6.0",
     "xpub-bootstrap": "^0.0.2",
     "xpub-journal": "^0.0.2",
-    "xpub-ui": "^0.0.2"
+    "@pubsweet/ui": "^0.1.1"
   },
   "peerDependencies": {
     "prop-types": "^15.5.10",
diff --git a/packages/component-app/src/components/App.js b/packages/component-app/src/components/App.js
index 35f4a9d23..a40e281af 100644
--- a/packages/component-app/src/components/App.js
+++ b/packages/component-app/src/components/App.js
@@ -3,7 +3,7 @@ import { compose } from 'recompose'
 import { connect } from 'react-redux'
 // import PropTypes from 'prop-types'
 
-import { AppBar } from 'xpub-ui'
+import { AppBar } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 import 'xpub-bootstrap'
 
diff --git a/packages/component-authentication/package.json b/packages/component-authentication/package.json
index 98e62a50d..b62bb98b2 100644
--- a/packages/component-authentication/package.json
+++ b/packages/component-authentication/package.json
@@ -20,7 +20,7 @@
     "recompose": "^0.26.0",
     "redux": "^3.6.0",
     "redux-form": "^7.0.3",
-    "xpub-ui": "^0.0.2"
+    "@pubsweet/ui": "^0.1.1"
   },
   "devDependencies": {
     "babel-core": "^6.26.0",
diff --git a/packages/component-authentication/src/components/Login.js b/packages/component-authentication/src/components/Login.js
index 7441bbd33..289d5f764 100644
--- a/packages/component-authentication/src/components/Login.js
+++ b/packages/component-authentication/src/components/Login.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { Field } from 'redux-form'
 import { Link } from 'react-router-dom'
-import { Button, TextField } from 'xpub-ui'
+import { Button, TextField } from '@pubsweet/ui'
 import classes from './Form.local.scss'
 
 const UsernameInput = props => <TextField label="Username" {...props.input} />
diff --git a/packages/component-authentication/src/components/Signup.js b/packages/component-authentication/src/components/Signup.js
index 8a95e2222..e74971775 100644
--- a/packages/component-authentication/src/components/Signup.js
+++ b/packages/component-authentication/src/components/Signup.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { Field } from 'redux-form'
 import { Link } from 'react-router-dom'
-import { Button, TextField } from 'xpub-ui'
+import { Button, TextField } from '@pubsweet/ui'
 import classes from './Form.local.scss'
 
 const UsernameInput = props => <TextField label="Username" {...props.input} />
diff --git a/packages/component-dashboard/package.json b/packages/component-dashboard/package.json
index eb86aeb32..b03081dd2 100644
--- a/packages/component-dashboard/package.json
+++ b/packages/component-dashboard/package.json
@@ -25,7 +25,7 @@
     "xpub-connect": "^0.0.2",
     "xpub-journal": "^0.0.2",
     "xpub-selectors": "^0.0.2",
-    "xpub-ui": "^0.0.2",
+    "@pubsweet/ui": "^0.1.1",
     "xpub-upload": "^0.0.2"
   },
   "devDependencies": {
diff --git a/packages/component-dashboard/src/components/AssignEditor.js b/packages/component-dashboard/src/components/AssignEditor.js
index a08077a97..95d1ae2ca 100644
--- a/packages/component-dashboard/src/components/AssignEditor.js
+++ b/packages/component-dashboard/src/components/AssignEditor.js
@@ -1,11 +1,10 @@
 import React from 'react'
 import { compose, withProps } from 'recompose'
-import { Menu } from 'xpub-ui'
+import { Menu } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 
 // TODO: select multiple editors
 const AssignEditor = ({
-  journal,
   project,
   team,
   teamName,
diff --git a/packages/component-dashboard/src/components/Reviews.js b/packages/component-dashboard/src/components/Reviews.js
index 7eb86d258..7ab111cfd 100644
--- a/packages/component-dashboard/src/components/Reviews.js
+++ b/packages/component-dashboard/src/components/Reviews.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { compose, withProps } from 'recompose'
 import { groupBy } from 'lodash'
-import { Badge } from 'xpub-ui'
+import { Badge } from '@pubsweet/ui'
 import classes from './Reviews.local.scss'
 
 const Reviews = ({ reviews }) => (
diff --git a/packages/component-dashboard/src/components/UploadManuscript.js b/packages/component-dashboard/src/components/UploadManuscript.js
index eae6ef8c3..0c66d43e0 100644
--- a/packages/component-dashboard/src/components/UploadManuscript.js
+++ b/packages/component-dashboard/src/components/UploadManuscript.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import Dropzone from 'react-dropzone'
 import classnames from 'classnames'
-import { Icon } from 'xpub-ui'
+import { Icon } from '@pubsweet/ui'
 import classes from './UploadManuscript.local.scss'
 
 const isIdle = conversion =>
diff --git a/packages/component-dashboard/src/components/sections/ReviewerItem.js b/packages/component-dashboard/src/components/sections/ReviewerItem.js
index a4e5f7f08..8ec3b7869 100644
--- a/packages/component-dashboard/src/components/sections/ReviewerItem.js
+++ b/packages/component-dashboard/src/components/sections/ReviewerItem.js
@@ -1,5 +1,5 @@
 import React from 'react'
-import { Button } from 'xpub-ui'
+import { Button } from '@pubsweet/ui'
 import { getReviewerFromUser } from 'xpub-selectors'
 import classes from './Item.local.scss'
 import ProjectLink from '../ProjectLink'
diff --git a/packages/component-review/package.json b/packages/component-review/package.json
index 42251743e..abc7d527b 100644
--- a/packages/component-review/package.json
+++ b/packages/component-review/package.json
@@ -30,7 +30,7 @@
     "xpub-edit": "^0.0.2",
     "xpub-journal": "^0.0.2",
     "xpub-selectors": "^0.0.2",
-    "xpub-ui": "^0.0.2",
+    "@pubsweet/ui": "^0.1.1",
     "xpub-upload": "^0.0.2",
     "xpub-validators": "^0.0.2"
   },
diff --git a/packages/component-review/src/components/decision/Decision.js b/packages/component-review/src/components/decision/Decision.js
index f23e1b1a5..3871d6b56 100644
--- a/packages/component-review/src/components/decision/Decision.js
+++ b/packages/component-review/src/components/decision/Decision.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import { NoteViewer } from 'xpub-edit'
-import { Attachment } from 'xpub-ui'
+import { Attachment } from '@pubsweet/ui'
 import classes from './Decision.local.scss'
 
 const Decision = ({ decision }) => (
diff --git a/packages/component-review/src/components/decision/DecisionForm.js b/packages/component-review/src/components/decision/DecisionForm.js
index ed32ac84f..9e3221b52 100644
--- a/packages/component-review/src/components/decision/DecisionForm.js
+++ b/packages/component-review/src/components/decision/DecisionForm.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
 import { NoteEditor } from 'xpub-edit'
-import { Attachments, Button, RadioGroup, ValidatedField } from 'xpub-ui'
+import { Attachments, Button, RadioGroup, ValidatedField } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 import { required } from 'xpub-validators'
 import classes from './DecisionForm.local.scss'
diff --git a/packages/component-review/src/components/metadata/ReviewMetadata.js b/packages/component-review/src/components/metadata/ReviewMetadata.js
index af1389da0..8c3912c5e 100644
--- a/packages/component-review/src/components/metadata/ReviewMetadata.js
+++ b/packages/component-review/src/components/metadata/ReviewMetadata.js
@@ -1,5 +1,5 @@
 import React from 'react'
-import { File } from 'xpub-ui'
+import { File } from '@pubsweet/ui'
 import classes from './ReviewMetadata.local.scss'
 
 const ReviewMetadata = ({ version, handlingEditors }) => (
diff --git a/packages/component-review/src/components/review/Review.js b/packages/component-review/src/components/review/Review.js
index d1dda9ad4..27bf6e2f1 100644
--- a/packages/component-review/src/components/review/Review.js
+++ b/packages/component-review/src/components/review/Review.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import { NoteViewer } from 'xpub-edit'
-import { Attachment } from 'xpub-ui'
+import { Attachment } from '@pubsweet/ui'
 import classes from './Review.local.scss'
 
 const Review = ({ review }) => (
diff --git a/packages/component-review/src/components/review/ReviewForm.js b/packages/component-review/src/components/review/ReviewForm.js
index 2beaa334a..832244780 100644
--- a/packages/component-review/src/components/review/ReviewForm.js
+++ b/packages/component-review/src/components/review/ReviewForm.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
 import { NoteEditor } from 'xpub-edit'
-import { Attachments, Button, RadioGroup, ValidatedField } from 'xpub-ui'
+import { Attachments, Button, RadioGroup, ValidatedField } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 import { required } from 'xpub-validators'
 import classes from './ReviewForm.local.scss'
diff --git a/packages/component-review/src/components/reviewers/Reviewer.js b/packages/component-review/src/components/reviewers/Reviewer.js
index 8ecc11ca0..ba71d9617 100644
--- a/packages/component-review/src/components/reviewers/Reviewer.js
+++ b/packages/component-review/src/components/reviewers/Reviewer.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { map } from 'lodash'
 import Moment from 'react-moment'
-import { Avatar, Button } from 'xpub-ui'
+import { Avatar, Button } from '@pubsweet/ui'
 
 import classes from './Reviewer.local.scss'
 
diff --git a/packages/component-review/src/components/reviewers/ReviewerForm.js b/packages/component-review/src/components/reviewers/ReviewerForm.js
index 6a94db20a..4a542367f 100644
--- a/packages/component-review/src/components/reviewers/ReviewerForm.js
+++ b/packages/component-review/src/components/reviewers/ReviewerForm.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import Select from 'react-select'
 import { Field } from 'redux-form'
-import { Button } from 'xpub-ui'
+import { Button } from '@pubsweet/ui'
 import { required } from 'xpub-validators'
 import 'react-select/dist/react-select.css'
 import classes from './ReviewerForm.local.scss'
diff --git a/packages/component-submit/package.json b/packages/component-submit/package.json
index a42558b1e..f5a2d8175 100644
--- a/packages/component-submit/package.json
+++ b/packages/component-submit/package.json
@@ -25,7 +25,7 @@
     "xpub-edit": "^0.0.2",
     "xpub-journal": "^0.0.2",
     "xpub-selectors": "^0.0.2",
-    "xpub-ui": "^0.0.2",
+    "@pubsweet/ui": "^0.1.1",
     "xpub-upload": "^0.0.2",
     "xpub-validators": "^0.0.2"
   },
diff --git a/packages/component-submit/src/components/Confirm.js b/packages/component-submit/src/components/Confirm.js
index 80042aec6..7c4799c25 100644
--- a/packages/component-submit/src/components/Confirm.js
+++ b/packages/component-submit/src/components/Confirm.js
@@ -1,5 +1,5 @@
 import React from 'react'
-import { Button, PlainButton } from 'xpub-ui'
+import { Button, PlainButton } from '@pubsweet/ui'
 import classes from './Confirm.local.scss'
 
 const Confirm = ({ toggleConfirming }) => (
diff --git a/packages/component-submit/src/components/Declarations.js b/packages/component-submit/src/components/Declarations.js
index c89e90c2f..d7d3e967f 100644
--- a/packages/component-submit/src/components/Declarations.js
+++ b/packages/component-submit/src/components/Declarations.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import classnames from 'classnames'
 import { FormSection } from 'redux-form'
-import { ValidatedField, YesOrNo } from 'xpub-ui'
+import { ValidatedField, YesOrNo } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 import { required } from 'xpub-validators'
 import classes from './Declarations.local.scss'
diff --git a/packages/component-submit/src/components/Metadata.js b/packages/component-submit/src/components/Metadata.js
index 905c557c2..a7e103a9f 100644
--- a/packages/component-submit/src/components/Metadata.js
+++ b/packages/component-submit/src/components/Metadata.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
 import { AbstractEditor, TitleEditor } from 'xpub-edit'
-import { CheckboxGroup, Menu, TextField, ValidatedField } from 'xpub-ui'
+import { CheckboxGroup, Menu, TextField, ValidatedField } from '@pubsweet/ui'
 import { withJournal } from 'xpub-journal'
 import {
   join,
diff --git a/packages/component-submit/src/components/Notes.js b/packages/component-submit/src/components/Notes.js
index b8d57f0c2..431aab266 100644
--- a/packages/component-submit/src/components/Notes.js
+++ b/packages/component-submit/src/components/Notes.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
 import { NoteEditor } from 'xpub-edit'
-import { ValidatedField } from 'xpub-ui'
+import { ValidatedField } from '@pubsweet/ui'
 import { required } from 'xpub-validators'
 import classes from './Metadata.local.scss'
 
diff --git a/packages/component-submit/src/components/Submit.js b/packages/component-submit/src/components/Submit.js
index 0126764c0..5b8bfab25 100644
--- a/packages/component-submit/src/components/Submit.js
+++ b/packages/component-submit/src/components/Submit.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import classnames from 'classnames'
 import { Link } from 'react-router-dom'
-import { Button } from 'xpub-ui'
+import { Button } from '@pubsweet/ui'
 import Metadata from './Metadata'
 import Declarations from './Declarations'
 import Suggestions from './Suggestions'
diff --git a/packages/component-submit/src/components/Suggestions.js b/packages/component-submit/src/components/Suggestions.js
index a6ec1be9d..9151eaa05 100644
--- a/packages/component-submit/src/components/Suggestions.js
+++ b/packages/component-submit/src/components/Suggestions.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
-import { TextField, ValidatedField } from 'xpub-ui'
+import { TextField, ValidatedField } from '@pubsweet/ui'
 import { join, split } from 'xpub-validators'
 import classes from './Suggestions.local.scss'
 
diff --git a/packages/component-submit/src/components/SupplementaryFiles.js b/packages/component-submit/src/components/SupplementaryFiles.js
index f875d5d01..372863741 100644
--- a/packages/component-submit/src/components/SupplementaryFiles.js
+++ b/packages/component-submit/src/components/SupplementaryFiles.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import { FormSection } from 'redux-form'
-import { Supplementary, ValidatedField } from 'xpub-ui'
+import { Supplementary, ValidatedField } from '@pubsweet/ui'
 import classes from './Metadata.local.scss'
 
 const FileInput = uploadFile => input => (
diff --git a/packages/xpub-collabra/package.json b/packages/xpub-collabra/package.json
index 5806c4a7a..aa8b1bfb7 100644
--- a/packages/xpub-collabra/package.json
+++ b/packages/xpub-collabra/package.json
@@ -39,7 +39,7 @@
     "xpub-journal": "^0.0.2",
     "xpub-selectors": "^0.0.2",
     "xpub-theme": "^0.0.2",
-    "xpub-ui": "^0.0.2"
+    "@pubsweet/ui": "^0.1.1"
   },
   "devDependencies": {
     "babel-core": "^6.26.0",
diff --git a/packages/xpub-theme/src/variables.css b/packages/xpub-theme/src/variables.css
index fb261f0b2..a36415dd7 100644
--- a/packages/xpub-theme/src/variables.css
+++ b/packages/xpub-theme/src/variables.css
@@ -2,7 +2,7 @@
   /* brand colors */
   --color-primary: #0d78f2;
 
-  /* colors for interactions */
+  /* colors for inte./ractions */
   --color-danger: #ff2d1a;
   --color-warning: #ee7600;
   --color-valid: #00bf05;
diff --git a/packages/xpub-ui/.eslintrc b/packages/xpub-ui/.eslintrc
deleted file mode 100644
index db7f6d5a8..000000000
--- a/packages/xpub-ui/.eslintrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "globals": {
-    "initialState": true,
-    "state": false,
-    "setState": false
-  }
-}
diff --git a/packages/xpub-ui/docs/colors.md b/packages/xpub-ui/docs/colors.md
deleted file mode 100644
index 4f66808b4..000000000
--- a/packages/xpub-ui/docs/colors.md
+++ /dev/null
@@ -1,45 +0,0 @@
-CSS variables are used to define the theme's color scheme.
-
-## Brand colors
-
-`--color-primary`
-
-```js
-<div style={{ color: 'var(--color-primary)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-## Colors for interactions
-
-`--color-danger`
-
-```js
-<div style={{ color: 'var(--color-danger)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--color-valid`
-
-```js
-<div style={{ color: 'var(--color-valid)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--color-warning`
-
-```js
-<div style={{ color: 'var(--color-warning)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--color-pending`
-
-```js
-<div style={{ color: 'var(--color-pending)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
diff --git a/packages/xpub-ui/docs/fonts.md b/packages/xpub-ui/docs/fonts.md
deleted file mode 100644
index e3d69cb97..000000000
--- a/packages/xpub-ui/docs/fonts.md
+++ /dev/null
@@ -1,33 +0,0 @@
-CSS variables are used to define font families.
-
-`--font-author`
-
-```js
-<div style={{ fontFamily: 'var(--font-author)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--font-reviewer`
-
-```js
-<div style={{ fontFamily: 'var(--font-reviewer)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--font-interface`
-
-```js
-<div style={{ fontFamily: 'var(--font-interface)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
-
-`--font-mono`
-
-```js
-<div style={{ fontFamily: 'var(--font-mono)' }}>
-{faker.lorem.sentence(5)}
-</div>
-```
diff --git a/packages/xpub-ui/package.json b/packages/xpub-ui/package.json
deleted file mode 100644
index 13126a9fc..000000000
--- a/packages/xpub-ui/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "name": "xpub-ui",
-  "version": "0.0.2",
-  "files": [
-    "docs",
-    "dist",
-    "src"
-  ],
-  "main": "src",
-  "jsnext:main": "src",
-  "dependencies": {
-    "babel-jest": "^21.2.0",
-    "classnames": "^2.2.5",
-    "enzyme": "^3.2.0",
-    "enzyme-adapter-react-15": "^1.0.5",
-    "lodash": "^4.17.4",
-    "humps": "^2.0.1",
-    "prop-types": "^15.5.10",
-    "react": "^15.6.1",
-    "react-dom": "^15.6.1",
-    "react-feather": "^1.0.7",
-    "react-redux": "^5.0.2",
-    "react-router-dom": "^4.2.2",
-    "react-tag-autocomplete": "^5.4.1",
-    "recompose": "^0.26.0",
-    "redux": "^3.6.0",
-    "redux-form": "^7.0.3"
-  },
-  "devDependencies": {
-    "babel-core": "^6.26.0",
-    "babel-loader": "^7.1.2",
-    "babel-preset-env": "^1.6.0",
-    "babel-preset-react": "^6.24.1",
-    "babel-preset-stage-2": "^6.24.1",
-    "css-loader": "^0.28.4",
-    "faker": "^4.1.0",
-    "file-loader": "^1.1.5",
-    "identity-obj-proxy": "^3.0.0",
-    "jest": "^21.2.1",
-    "node-sass": "^4.5.3",
-    "react-styleguidist": "^6.0.8",
-    "react-test-renderer": "^15.6.1",
-    "sass-loader": "^6.0.6",
-    "style-loader": "^0.19.0",
-    "webpack": "^3.8.1",
-    "webpack-node-externals": "^1.6.0",
-    "xpub-styleguide": "^0.0.2"
-  },
-  "jest": {
-    "moduleNameMapper": {
-      "\\.s?css$": "identity-obj-proxy"
-    },
-    "setupTestFrameworkScriptFile": "<rootDir>/test/setup/enzyme.js",
-    "transform": {
-      "\\.js$": "<rootDir>/test/config/transform.js"
-    }
-  },
-  "scripts": {
-    "styleguide": "styleguidist server",
-    "styleguide:build": "styleguidist build",
-    "clean": "rimraf dist",
-    "prebuild": "npm run clean && npm run lint",
-    "build": "webpack --progress --profile",
-    "test": "jest",
-    "test:watch": "npm test -- --watch",
-    "test:cover": "npm test -- --coverage",
-    "test:u": "npm test -- --updateSnapshot"
-  }
-}
diff --git a/packages/xpub-ui/src/atoms/Attachment.js b/packages/xpub-ui/src/atoms/Attachment.js
deleted file mode 100644
index 9f9be1d49..000000000
--- a/packages/xpub-ui/src/atoms/Attachment.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react'
-import Icon from './Icon'
-import classes from './Attachment.local.scss'
-
-const Attachment = ({ value }) => (
-  <a download={value.name} href={value.url}>
-    <span className={classes.icon}>
-      <Icon color="var(--color-primary)">paperclip</Icon>
-    </span>
-    <span className={classes.filename}>{value.name}</span>
-  </a>
-)
-
-export default Attachment
diff --git a/packages/xpub-ui/src/atoms/Attachment.local.scss b/packages/xpub-ui/src/atoms/Attachment.local.scss
deleted file mode 100644
index 4a6f52020..000000000
--- a/packages/xpub-ui/src/atoms/Attachment.local.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-.icon {
-  color: var(--color-primary);
-  display: inline-flex;
-  margin-right: 10px;
-}
-
-.filename {
-  font-size: 0.7em;
-  height: 2em;
-  max-width: 25ch;
-  overflow-wrap: break-word;
-  padding: 0;
-}
diff --git a/packages/xpub-ui/src/atoms/Attachment.md b/packages/xpub-ui/src/atoms/Attachment.md
deleted file mode 100644
index 3156671c6..000000000
--- a/packages/xpub-ui/src/atoms/Attachment.md
+++ /dev/null
@@ -1,10 +0,0 @@
-A file attached to a note.
-
-```js
-const value = {
-    name: faker.system.commonFileName(),
-    url: faker.internet.url()
-};
-
-<Attachment value={value}/>
-```
diff --git a/packages/xpub-ui/src/atoms/Avatar.js b/packages/xpub-ui/src/atoms/Avatar.js
deleted file mode 100644
index d30de999d..000000000
--- a/packages/xpub-ui/src/atoms/Avatar.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react'
-import classes from './Avatar.local.scss'
-
-const Avatar = ({ status, width, height, reviewerLetter }) => {
-  const classValue =
-    status && classes[status.toLowerCase()] ? status.toLowerCase() : 'default'
-
-  return (
-    <svg
-      className={classes[classValue]}
-      height={height || '70'}
-      viewBox={`0 0 ${width ? width + 5 : '105'} ${height || '70'}`}
-      width={width || '100'}
-      xmlns="http://www.w3.org/2000/svg"
-    >
-      <path
-        className={classes.persona}
-        d=" M 47.666 50.14 C 44.947 49 41.588 47.535 41.588 46.395 L 41.588 39.07 C 45.587 35.977 47.986 31.093 47.986 26.047 L 47.986 16.279 C 47.986 7.326 40.788 0 31.991 0 C 23.193 0 15.995 7.326 15.995 16.279 L 15.995 26.047 C 15.995 31.093 18.395 36.14 22.393 39.07 L 22.393 46.395 C 22.393 47.372 19.034 48.837 16.315 50.14 C 9.757 52.907 0 57.14 0 68.372 L 0 70 L 63.981 70 L 63.981 68.372 C 63.981 57.14 54.224 52.907 47.666 50.14 Z "
-      />
-      <path
-        className={classes.check}
-        d=" M 60.106 37.467 C 59.299 36.645 58.895 35.617 58.895 34.486 C 58.895 33.458 59.299 32.43 60.106 31.608 C 60.813 30.888 61.823 30.375 62.934 30.375 C 64.045 30.375 65.055 30.888 65.762 31.608 L 74.246 40.242 L 93.132 21.021 C 93.839 20.301 94.95 19.89 95.96 19.89 C 97.071 19.89 98.081 20.301 98.788 21.021 C 99.596 21.843 100 22.871 100 24.002 C 100 25.03 99.596 26.057 98.788 26.88 L 74.246 51.857 L 60.106 37.467 Z "
-      />
-      <path
-        className={classes.x}
-        d="M 70.964 37.518 L 62.025 46.615 C 61.217 47.54 60.712 48.671 60.712 49.904 C 60.712 51.138 61.217 52.268 62.025 53.091 C 62.934 54.016 64.045 54.427 65.257 54.427 C 66.469 54.427 67.58 54.016 68.388 53.091 L 77.326 43.994 L 86.265 53.091 C 87.173 54.016 88.284 54.427 89.496 54.427 C 90.708 54.427 91.819 54.016 92.627 53.091 C 93.536 52.268 93.94 51.138 93.94 49.904 C 93.94 48.671 93.536 47.54 92.627 46.615 L 83.689 37.518 L 92.627 28.422 C 93.536 27.599 93.94 26.469 93.94 25.235 C 93.94 24.002 93.536 22.871 92.627 21.946 C 91.819 21.124 90.708 20.61 89.496 20.61 C 88.284 20.61 87.173 21.124 86.265 21.946 L 77.326 31.043 L 68.388 21.946 C 67.58 21.124 66.469 20.61 65.257 20.61 C 64.045 20.61 62.934 21.124 62.025 21.946 C 61.217 22.871 60.712 24.002 60.712 25.235 C 60.712 26.469 61.217 27.599 62.025 28.422 L 70.964 37.518 Z"
-      />
-      <path
-        className={classes['question-mark']}
-        d=" M 79.674 23.203 L 79.674 23.203 Q 83.397 23.203 85.424 25.077 L 85.424 25.077 L 85.424 25.077 Q 87.451 26.95 87.451 29.771 L 87.451 29.771 L 87.451 29.771 Q 87.451 31.75 86.728 33.14 L 86.728 33.14 L 86.728 33.14 Q 86.003 34.529 85.011 35.371 L 85.011 35.371 L 85.011 35.371 Q 84.018 36.214 82.404 37.224 L 82.404 37.224 L 82.404 37.224 Q 80.625 38.361 79.798 39.182 L 79.798 39.182 L 79.798 39.182 Q 78.97 40.003 78.97 41.308 L 78.97 41.308 L 78.97 41.308 Q 78.97 41.94 79.094 42.319 L 79.094 42.319 L 72.971 43.287 L 72.971 43.287 Q 72.64 42.024 72.64 41.098 L 72.64 41.098 L 72.64 41.098 Q 72.64 39.203 73.282 37.898 L 73.282 37.898 L 73.282 37.898 Q 73.923 36.593 74.833 35.814 L 74.833 35.814 L 74.833 35.814 Q 75.743 35.035 77.15 34.108 L 77.15 34.108 L 77.15 34.108 Q 78.681 33.056 79.405 32.298 L 79.405 32.298 L 79.405 32.298 Q 80.129 31.54 80.129 30.403 L 80.129 30.403 L 80.129 30.403 Q 80.129 29.603 79.653 29.203 L 79.653 29.203 L 79.653 29.203 Q 79.177 28.803 78.35 28.803 L 78.35 28.803 L 78.35 28.803 Q 76.405 28.803 74.006 31.245 L 74.006 31.245 L 70.282 27.708 L 70.282 27.708 Q 74.171 23.203 79.674 23.203 L 79.674 23.203 Z  M 75.371 53.94 L 75.371 53.94 Q 73.84 53.94 72.93 52.951 L 72.93 52.951 L 72.93 52.951 Q 72.02 51.961 72.02 50.445 L 72.02 50.445 L 72.02 50.445 Q 72.02 48.635 73.24 47.33 L 73.24 47.33 L 73.24 47.33 Q 74.461 46.024 76.24 46.024 L 76.24 46.024 L 76.24 46.024 Q 77.77 46.024 78.681 47.014 L 78.681 47.014 L 78.681 47.014 Q 79.591 48.003 79.591 49.561 L 79.591 49.561 L 79.591 49.561 Q 79.591 51.414 78.37 52.677 L 78.37 52.677 L 78.37 52.677 Q 77.15 53.94 75.371 53.94 L 75.371 53.94 Z "
-      />
-      <g transform="matrix(1.01,0,0,1.028,64.651,6.065)">
-        <text
-          className={classes['reviewer-number']}
-          transform="matrix(1,0,0,1,0,46.75)"
-        >
-          {reviewerLetter}
-        </text>
-      </g>
-    </svg>
-  )
-}
-
-export default Avatar
diff --git a/packages/xpub-ui/src/atoms/Avatar.local.scss b/packages/xpub-ui/src/atoms/Avatar.local.scss
deleted file mode 100644
index 9ff6dfcf5..000000000
--- a/packages/xpub-ui/src/atoms/Avatar.local.scss
+++ /dev/null
@@ -1,141 +0,0 @@
-figure {
-  margin: 0 auto 2px;
-  text-align: center;
-  width: auto;
-}
-
-svg {
-  height: auto;
-  max-height: 100vh;
-  max-width: 100%;
-  width: auto;
-}
-
-.default {
-  .persona {
-    display: block;
-    fill: var(--color-primary);
-  }
-
-  .check {
-    display: none;
-  }
-
-  .x {
-    display: none;
-  }
-
-  .question-mark {
-    display: none;
-  }
-
-  .reviewer-number {
-    display: none;
-  }
-}
-
-.accepted {
-  .persona {
-    display: block;
-    fill: var(--color-primary);
-  }
-
-  .check {
-    display: block;
-    fill: var(--color-primary);
-  }
-
-  .x {
-    display: none;
-  }
-
-  .question-mark {
-    display: none;
-  }
-
-  .reviewer-number {
-    display: none;
-  }
-}
-
-.declined {
-  .persona {
-    display: block;
-    fill: var(--color-danger);
-  }
-
-  .check {
-    display: none;
-  }
-
-  .x {
-    display: block;
-    fill: var(--color-danger);
-  }
-
-  .question-mark {
-    display: none;
-  }
-
-  .reviewer-number {
-    display: none;
-  }
-}
-
-.pending {
-  .persona {
-    display: block;
-    fill: var(--color-pending);
-  }
-
-  .check {
-    display: none;
-  }
-
-  .x {
-    display: none;
-  }
-
-  .question-mark {
-    display: block;
-    fill: var(--color-pending);
-  }
-
-  .reviewer-number {
-    display: none;
-  }
-}
-
-.submitted {
-  .persona {
-    display: block;
-    fill: var(--color-primary);
-  }
-
-  .check {
-    display: none;
-  }
-
-  .x {
-    display: none;
-  }
-
-  .question-mark {
-    display: none;
-  }
-
-  .reviewer-number {
-    fill: var(--color-primary);
-    font-family: 'Fira Sans Condensed', sans-serif;
-    font-size: 50px;
-    font-style: normal;
-    font-weight: 600;
-    stroke: none;
-    text-transform: uppercase;
-  }
-}
-
-.fullname {
-  color: red;
-  font-family: var(--font-reviewer);
-}
diff --git a/packages/xpub-ui/src/atoms/Avatar.md b/packages/xpub-ui/src/atoms/Avatar.md
deleted file mode 100644
index e4928b9d7..000000000
--- a/packages/xpub-ui/src/atoms/Avatar.md
+++ /dev/null
@@ -1,10 +0,0 @@
-A general purpose Avatar element.
-
-```js
-const statusFactory = () => {
-  const statuses = ['Accepted', 'Pending', 'Declined', 'Submitted']
-  return statuses[Math.floor(Math.random() * statuses.length)]
-};
-
-<Avatar status={statusFactory()}/>
-```
diff --git a/packages/xpub-ui/src/atoms/Badge.js b/packages/xpub-ui/src/atoms/Badge.js
deleted file mode 100644
index eb6f00420..000000000
--- a/packages/xpub-ui/src/atoms/Badge.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react'
-import classes from './Badge.local.scss'
-
-const Badge = ({ count, label, plural }) => (
-  <span className={classes.root}>
-    <span className={classes.count}>{count}</span>
-    <span className={classes.label}>
-      {plural && count !== 1 ? plural : label}
-    </span>
-  </span>
-)
-
-export default Badge
diff --git a/packages/xpub-ui/src/atoms/Badge.local.scss b/packages/xpub-ui/src/atoms/Badge.local.scss
deleted file mode 100644
index b5eb36513..000000000
--- a/packages/xpub-ui/src/atoms/Badge.local.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.root {
-  align-items: center;
-  // background: lightgrey;
-  background: linear-gradient(#fff 0, #fff 1.1em, grey 1.1em, grey 1.15em, #fff 1.15em, #fff 2em);
-  color: inherit;
-  display: inline-flex;
-  font-size: 0.8rem;
-  margin-right: 1em;
-  padding-bottom: 1em;
-}
-
-.count {
-  border-radius: 50%;
-  color: grey;
-  font-size: 1em;
-  font-weight: 600;
-  padding-right: 0.5em;
-  text-align: center;
-}
-
-.label {
-  display: inline-block;
-  padding: 0;
-  text-shadow: 0.05em 0.05em 0 #fff, -0.05em -0.05em 0 #fff, -0.05em 0.05em 0 #fff, 0.05em -0.05em 0 #fff;
-}
diff --git a/packages/xpub-ui/src/atoms/Badge.md b/packages/xpub-ui/src/atoms/Badge.md
deleted file mode 100644
index ed418eaab..000000000
--- a/packages/xpub-ui/src/atoms/Badge.md
+++ /dev/null
@@ -1,16 +0,0 @@
-A badge that displays a count and a label.
-
-```js
-<Badge count={5} label="created"/> 
-```
-
-A plural form of the label can be provided.
-
-```js
-<div>
-    <Badge count={1} label="thing" plural="things"/> 
-    <Badge count={99} label="thing" plural="things"/> 
-    <Badge count={0} label="thing" plural="things"/> 
-    <Badge count={299} label="thing" plural="things"/> 
-</div>
-```
diff --git a/packages/xpub-ui/src/atoms/Button.js b/packages/xpub-ui/src/atoms/Button.js
deleted file mode 100644
index 3f8163bad..000000000
--- a/packages/xpub-ui/src/atoms/Button.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react'
-import classnames from 'classnames'
-import classes from './Button.local.scss'
-
-const Button = ({
-  className,
-  children,
-  type = 'button',
-  disabled,
-  primary,
-  onClick,
-}) => (
-  <button
-    className={classnames(className, classes.root, {
-      [classes.disabled]: disabled,
-      [classes.primary]: primary,
-    })}
-    disabled={disabled}
-    onClick={onClick}
-    type={type}
-  >
-    {children}
-  </button>
-)
-
-export default Button
diff --git a/packages/xpub-ui/src/atoms/Button.local.scss b/packages/xpub-ui/src/atoms/Button.local.scss
deleted file mode 100644
index 75b469bc1..000000000
--- a/packages/xpub-ui/src/atoms/Button.local.scss
+++ /dev/null
@@ -1,103 +0,0 @@
-.root {
-  background: #ddd;
-  border: none;
-  cursor: pointer;
-  font-family: var(--font-interface);
-  font-size: inherit;
-  letter-spacing: 0.05em;
-  padding: 10px 20px;
-  position: relative;
-  text-transform: uppercase;
-}
-
-.root:hover,
-.root:focus {
-  background: #777;
-  color: white;
-  outline: 1px solid transparent;
-}
-
-// this will be added to the button that need a feedback to the user.
-// &::after {
-//   content: "Saved!";
-//   top: 20%;
-//   left: 115%;
-//   position: absolute;
-//   background: var(--color-primary);
-//   color: white;
-//   padding: 0.1em 0.3em;
-//   opacity: 0;
-// }
-
-.root :active {
-  transform: scale(0.8);
-}
-
-.root ::after {
-  animation: 1s warning;
-  opacity: 1;
-}
-
-.primary {
-  background-color: var(--color-primary);
-  border: 2px solid transparent;
-  border-bottom: 4px solid var(--color-primary);
-  color: white;
-}
-
-.primary:hover {
-  background: white;
-  border: 2px solid var(--color-primary);
-  border-bottom: 4px solid var(--color-primary);
-  color: var(--color-primary);
-  outline: 1px solid transparent;
-}
-
-.primary:focus {
-  background: white;
-  border: 2px solid var(--color-primary);
-  border-bottom: 4px solid var(--color-primary);
-  box-shadow: 0 2px 0 0 var(--color-primary);
-  color: var(--color-primary);
-  outline: 1px solid transparent;
-}
-
-.disabled {
-  background: white;
-  border: 2px solid transparent;
-  border-bottom: 2px solid #bbb;
-  color: #bbb;
-}
-
-.disabled:hover {
-  background: transparent;
-  border: 2px solid transparent;
-  border-bottom: 2px solid #bbb;
-  color: #aaa;
-  cursor: not-allowed;
-}
-
-.disabled:hover::after {
-  color: var(--color-danger);
-  content: "sorry, this action is not possible";
-  display: inline;
-  font-size: 0.9em;
-  font-style: italic;
-  left: 115%;
-  letter-spacing: 0;
-  opacity: 1;
-  position: absolute;
-  text-align: left;
-  text-transform: lowercase;
-  top: 30%;
-  // width: 30ch;
-}
-
-.addFile {
-  background: none;
-  border: none;
-  font-style: normal;
-  letter-spacing: 0;
-  padding: 0;
-  text-transform: none;
-}
diff --git a/packages/xpub-ui/src/atoms/Button.md b/packages/xpub-ui/src/atoms/Button.md
deleted file mode 100644
index a7871d1b7..000000000
--- a/packages/xpub-ui/src/atoms/Button.md
+++ /dev/null
@@ -1,18 +0,0 @@
-A button.
-
-```js
-
-<Button>Save</Button>
-```
-
-A button can be disabled.
-
-```js
-<Button disabled>Save</Button>
-```
-
-A button can be marked as the "primary" action.
-
-```js
-<Button primary>Save</Button>
-```
diff --git a/packages/xpub-ui/src/atoms/Checkbox.js b/packages/xpub-ui/src/atoms/Checkbox.js
deleted file mode 100644
index 753235e97..000000000
--- a/packages/xpub-ui/src/atoms/Checkbox.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import React from 'react'
-import classnames from 'classnames'
-import classes from './Checkbox.local.scss'
-
-const Checkbox = ({
-  inline,
-  name,
-  value,
-  label,
-  checked,
-  required,
-  onChange,
-  readonly,
-}) => (
-  <label
-    className={classnames(classes.root, {
-      [classes.inline]: inline,
-    })}
-  >
-    <input
-      checked={checked || false}
-      className={classes.input}
-      disabled={readonly}
-      name={name}
-      onChange={onChange}
-      required={required}
-      type="checkbox"
-      value={value}
-    />
-    <span>{label}</span>
-  </label>
-)
-
-export default Checkbox
diff --git a/packages/xpub-ui/src/atoms/Checkbox.local.scss b/packages/xpub-ui/src/atoms/Checkbox.local.scss
deleted file mode 100644
index 779e4d9e5..000000000
--- a/packages/xpub-ui/src/atoms/Checkbox.local.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-.root {
-  align-items: center;
-  display: flex;
-  font-family: var(--font-author);
-  font-size: 1em;
-  font-style: italic;
-  letter-spacing: 1px;
-  transition: all 2s;
-}
-
-.root.inline {
-  display: inline-flex;
-}
-
-.root.inline:not(:last-child) {
-  margin-right: 2.7em;
-}
-
-.root:not(.inline):not(:last-child) {
-  margin-bottom: 0.5rem;
-}
-
-.root .input {
-  display: none;
-  margin-right: 0.25rem;
-}
-
-.root span::before {
-  background-size: 0;
-  border: 1px solid black; // border-radius: 20px;
-  content: ' ';
-  display: inline-block;
-  height: 9px;
-  margin-right: 0.3em;
-  transition: border 0.5s ease, background-size 0.3s ease;
-  vertical-align: middle;
-  width: 9px;
-}
-
-.root input:checked + span {
-  font-weight: 600;
-
-  &::before {
-    background: black;
-    border: 1px solid black;
-    box-shadow: inset 1px 1px 0 0 white, inset -1px -1px 0 0 white;
-    transition: border 0.5s ease, background-size 0.3s ease;
-  }
-}
-
-.root:hover input:not(:disabled) + span::before {
-  //background-size: 100%;
-  background: var(--color-primary);
-  box-shadow: inset 1px 1px 0 0 white, inset -1px -1px 0 0 white;
-}
-
diff --git a/packages/xpub-ui/src/atoms/Checkbox.md b/packages/xpub-ui/src/atoms/Checkbox.md
deleted file mode 100644
index ceffd9ae8..000000000
--- a/packages/xpub-ui/src/atoms/Checkbox.md
+++ /dev/null
@@ -1,33 +0,0 @@
-A checkbox.
-
-```js
-initialState = { checked: null };
-
-<Checkbox 
-  name="checkbox" 
-  checked={state.checked}
-  onChange={event => setState({ checked: event.target.checked })}/>
-```
-
-A checked checkbox.
-
-```js
-initialState = { checked: true };
-
-<Checkbox 
-  name="checkbox-checked" 
-  checked={state.checked}
-  onChange={event => setState({ checked: event.target.checked })}/>
-```
-
-A checkbox with a label.
-
-```js
-initialState = { checked: false };
-
-<Checkbox 
-  name="checkbox-labelled" 
-  checked={state.checked}
-  label="Foo"
-  onChange={event => setState({ checked: event.target.checked })}/>
-```
diff --git a/packages/xpub-ui/src/atoms/File.js b/packages/xpub-ui/src/atoms/File.js
deleted file mode 100644
index 93e5ef6d1..000000000
--- a/packages/xpub-ui/src/atoms/File.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import React from 'react'
-import classes from './File.local.scss'
-
-const extension = ({ name }) => name.replace(/^.+\./, '')
-
-const File = ({ value }) => (
-  <div className={classes.root}>
-    <div className={classes.icon}>
-      <div className={classes.extension}>{extension(value)}</div>
-    </div>
-
-    <div className={classes.name}>
-      <a download={value.name} href={value.url}>
-        {value.name}
-      </a>
-    </div>
-  </div>
-)
-
-export default File
diff --git a/packages/xpub-ui/src/atoms/File.local.scss b/packages/xpub-ui/src/atoms/File.local.scss
deleted file mode 100644
index b75173420..000000000
--- a/packages/xpub-ui/src/atoms/File.local.scss
+++ /dev/null
@@ -1,101 +0,0 @@
-.root {
-  align-items: center;
-  display: inline-flex;
-  flex-direction: column;
-  margin-bottom: 2em;
-  margin-right: 3em;
-  position: relative;
-  width: 20ch;
-
-  &::before,
-  &::after {
-    cursor: pointer;
-    transition: transform 0.3s;
-  }
-
-  &::after {
-    background: var(--color-danger);
-    border: 1px solid white;
-    color: white;
-    content: 'remove';
-    cursor: pointer;
-    font-size: 0.8em;
-    left: 70%;
-    letter-spacing: 0.5px;
-    padding: 0.2em 0.4em;
-    position: absolute;
-    text-transform: uppercase;
-    top: 4em;
-    transform: scaleX(0);
-    transform-origin: 0 0;
-    z-index: 2;
-  }
-
-  &::before {
-    background: var(--color-primary);
-    border: 1px solid white;
-    color: white;
-    content: 'replace';
-    cursor: pointer;
-    font-size: 0.8em;
-    left: 70%;
-    letter-spacing: 0.5px;
-    padding: 0.2em 0.4em;
-    position: absolute;
-    text-transform: uppercase;
-    top: 6em;
-    transform: scaleX(0);
-    transform-origin: 0 0;
-    z-index: 3;
-  }
-
-  .icon {
-    background: #ddd;
-    height: 100px;
-    padding: 5px;
-    position: relative;
-    transition: transform 0.3s ease;
-    width: 70px;
-  }
-
-  .extension {
-    background: #888;
-    color: white;
-    font-size: 12px;
-    left: 20px;
-    padding: 2px;
-    position: absolute;
-    right: 0;
-    text-align: center;
-    text-transform: uppercase;
-    top: 20px;
-  }
-
-  .name {
-    color: #aaa;
-    font-size: 0.9em;
-    font-style: italic;
-    margin: 5px;
-    max-width: 15ch;
-    text-align: center;
-    word-break: break-all; /* to divide into lines */
-  }
-
-  &:hover {
-    .extension {
-      background: white;
-      border-right: 2px solid #ddd;
-      color: var(--color-primary);
-    }
-
-    .icon {
-      background: var(--color-primary);
-      transform: skewY(6deg) rotate(-6deg);
-    }
-
-    &::after,
-    &::before {
-      transform: scaleX(1);
-    }
-  }
-}
diff --git a/packages/xpub-ui/src/atoms/File.md b/packages/xpub-ui/src/atoms/File.md
deleted file mode 100644
index fe482efec..000000000
--- a/packages/xpub-ui/src/atoms/File.md
+++ /dev/null
@@ -1,31 +0,0 @@
-A file.
-
-```js
-const value = {
-  name: faker.system.commonFileName(),
-  // type: faker.system.commonFileType(),
-  // size: faker.random.number(),
-};
-
-<File value={value}/>
-```
-
-Upload progress is displayed as an overlay.
-
-```js
-const value = {
-  name: faker.system.commonFileName(),
-};
-
-<File value={value} progress={0.5}/>
-```
-
-An upload error is displayed above the file.
-
-```js
-const value = {
-  name: faker.system.commonFileName(),
-};
-
-<File value={value} error="There was an error"/>
-```
diff --git a/packages/xpub-ui/src/atoms/Icon.js b/packages/xpub-ui/src/atoms/Icon.js
deleted file mode 100644
index 26a904615..000000000
--- a/packages/xpub-ui/src/atoms/Icon.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react'
-import { pascalize } from 'humps'
-import * as icons from 'react-feather'
-import classes from './Icon.local.scss'
-
-const Icon = ({ children, color = 'black', size = 24 }) => {
-  // convert `arrow_left` to `ArrowLeft`
-  const name = pascalize(children)
-
-  // select the icon
-  const icon = icons[name]
-
-  return <span className={classes.root}>{icon({ color, size })}</span>
-}
-
-export default Icon
diff --git a/packages/xpub-ui/src/atoms/Icon.local.scss b/packages/xpub-ui/src/atoms/Icon.local.scss
deleted file mode 100644
index dfc0a60d1..000000000
--- a/packages/xpub-ui/src/atoms/Icon.local.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.root {
-  display: inline-flex;
-}
diff --git a/packages/xpub-ui/src/atoms/Icon.md b/packages/xpub-ui/src/atoms/Icon.md
deleted file mode 100644
index bbee05936..000000000
--- a/packages/xpub-ui/src/atoms/Icon.md
+++ /dev/null
@@ -1,17 +0,0 @@
-An icon, from the [Feather](https://feathericons.com/) icon set.
-
-```js
-<Icon>arrow_right</Icon>
-```
-
-The color can be changed.
-
-```js
-<Icon color="red">arrow_right</Icon>
-``` 
-
-The size can be changed.
-
-```js
-<Icon size={48}>arrow_right</Icon>
-``` 
diff --git a/packages/xpub-ui/src/atoms/Menu.js b/packages/xpub-ui/src/atoms/Menu.js
deleted file mode 100644
index 9582d08d4..000000000
--- a/packages/xpub-ui/src/atoms/Menu.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import classnames from 'classnames'
-import classes from './Menu.local.scss'
-
-// TODO: match the width of the container to the width of the widest option?
-// TODO: use a <select> element instead of divs?
-
-class Menu extends React.Component {
-  constructor(props) {
-    super(props)
-
-    this.state = {
-      open: false,
-      selected: props.value,
-    }
-  }
-
-  toggleMenu = () => {
-    this.setState({
-      open: !this.state.open,
-    })
-  }
-
-  handleSelect = selected => {
-    this.setState({
-      open: false,
-      selected,
-    })
-
-    this.props.onChange(selected)
-  }
-
-  optionLabel = value => {
-    const { options } = this.props
-
-    return options.find(option => option.value === value).label
-  }
-
-  render() {
-    const {
-      label,
-      options,
-      placeholder = 'Choose in the list',
-      readonly,
-    } = this.props
-    const { open, selected } = this.state
-
-    return (
-      <div
-        className={classnames(classes.root, {
-          [classes.open]: open,
-        })}
-      >
-        {label && <span className={classes.label}>{label}</span>}
-
-        <div className={classes.main}>
-          <div className={classes.openerContainer}>
-            {readonly ? (
-              <span>{this.optionLabel(selected)}</span>
-            ) : (
-              <button
-                className={classes.opener}
-                onClick={this.toggleMenu}
-                type="button"
-              >
-                {selected ? (
-                  <span>{this.optionLabel(selected)}</span>
-                ) : (
-                  <span className={classes.placeholder}>{placeholder}</span>
-                )}
-                <span className={classes.arrow}>â–¼</span>
-              </button>
-            )}
-          </div>
-
-          <div className={classes.optionsContainer}>
-            {open && (
-              <div className={classes.options}>
-                {options.map(option => (
-                  <div
-                    className={classnames(classes.option, {
-                      [classes.active]: option.value === selected,
-                    })}
-                    key={option.value}
-                    onClick={() => this.handleSelect(option.value)}
-                  >
-                    {option.label || option.value}
-                  </div>
-                ))}
-              </div>
-            )}
-          </div>
-        </div>
-      </div>
-    )
-  }
-}
-
-export default Menu
diff --git a/packages/xpub-ui/src/atoms/Menu.local.scss b/packages/xpub-ui/src/atoms/Menu.local.scss
deleted file mode 100644
index 67555549e..000000000
--- a/packages/xpub-ui/src/atoms/Menu.local.scss
+++ /dev/null
@@ -1,92 +0,0 @@
-.root {
-  align-items: center;
-  display: flex;
-}
-
-.label {
-  margin-right: 0.5em;
-}
-
-.main {
-  position: relative;
-}
-
-.optionsContainer {
-  position: absolute;
-}
-
-.opener {
-  align-items: center;
-  background: transparent;
-  border: none;
-  border-left: 2px solid transparent;
-  cursor: pointer;
-  display: flex;
-  font-family: var(--font-author);
-  font-size: inherit;
-  outline: none;
-}
-
-.opener:hover {
-  color: var(--color-primary);
-}
-
-.open .opener {
-  border-left: 2px solid var(--color-primary);
-  color: var(--color-primary);
-}
-
-.placeholder {
-  color: #aaa;
-  font-family: var(--font-interface);
-  font-weight: 400;
-}
-
-.opener:hover .placeholder {
-  color: var(--color-primary);
-}
-
-.arrow {
-  font-size: 50%;
-  margin-left: 10px;
-  transform: scaleY(1.2) scaleX(2.2);
-  transition: transform 0.2s;
-}
-
-.open .arrow {
-  transform: scaleX(2.2) scaleY(-1.2);
-}
-
-.options {
-  background-color: white;
-  border-bottom: 2px solid var(--color-primary);
-  border-left: 2px solid var(--color-primary);
-  // columns: 2 auto;
-  left: 0;
-  min-width: 10em;
-  opacity: 0;
-  padding-top: 0.5em;
-  position: absolute;
-  top: 0;
-  z-index: 10;
-}
-
-.open .options {
-  opacity: 1;
-}
-
-.option {
-  cursor: pointer;
-  font-family: var(--font-author);
-  padding: 10px;
-  white-space: nowrap;
-}
-
-.option:hover {
-  color: var(--color-primary);
-}
-
-.active {
-  color: black;
-  font-weight: 600; /* placeholder for the semibold */
-}
diff --git a/packages/xpub-ui/src/atoms/Menu.md b/packages/xpub-ui/src/atoms/Menu.md
deleted file mode 100644
index 0b2620619..000000000
--- a/packages/xpub-ui/src/atoms/Menu.md
+++ /dev/null
@@ -1,44 +0,0 @@
-A menu for selecting one of a list of options.
-
-```js
-const options = [
-  { value: 'foo', label: 'Foo' },
-  { value: 'bar', label: 'Bar' },
-  { value: 'baz', label: 'Baz' }
-];
-
-<Menu 
-  options={options}
-  onChange={value => console.log(value)}/>
-```
-
-When an option is selected, it replaces the placeholder.
-
-```js
-const options = [
-  { value: 'foo', label: 'Foo' },
-  { value: 'bar', label: 'Bar' },
-  { value: 'baz', label: 'Baz' }
-];
-
-<Menu 
-  options={options}
-  value="foo"
-  onChange={value => console.log(value)}/>
-```
-
-A menu can have a label
-
-```js
-const options = [
-  { value: 'foo', label: 'Foo' },
-  { value: 'bar', label: 'Bar' },
-  { value: 'baz', label: 'Baz' }
-];
-
-<Menu 
-  options={options}
-  label="Title"
-  value="foo"
-  onChange={value => console.log(value)}/>
-```
diff --git a/packages/xpub-ui/src/atoms/Radio.js b/packages/xpub-ui/src/atoms/Radio.js
deleted file mode 100644
index 9421e2bba..000000000
--- a/packages/xpub-ui/src/atoms/Radio.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import React from 'react'
-import classnames from 'classnames'
-import classes from './Radio.local.scss'
-
-const inputGradient = color =>
-  `radial-gradient(closest-corner at center, ${color} 0%, ${color} 45%,
-    white 45%, white 100%)`
-
-const Radio = ({
-  className,
-  color = 'black',
-  inline,
-  name,
-  value,
-  label,
-  checked,
-  required,
-  onChange,
-  readonly,
-}) => (
-  <label
-    className={classnames(
-      classes.root,
-      {
-        [classes.inline]: inline,
-        [classes.checked]: checked,
-      },
-      className,
-    )}
-    style={{ color }}
-  >
-    <input
-      checked={checked}
-      className={classes.input}
-      disabled={readonly}
-      name={name}
-      onChange={onChange}
-      required={required}
-      type="radio"
-      value={value}
-    />
-    <span
-      className={classes.pseudoInput}
-      style={{ background: checked ? inputGradient(color) : 'transparent' }}
-    >
-      {' '}
-    </span>
-    <span className={classes.label}>{label}</span>
-  </label>
-)
-
-export default Radio
diff --git a/packages/xpub-ui/src/atoms/Radio.local.scss b/packages/xpub-ui/src/atoms/Radio.local.scss
deleted file mode 100644
index 49f699cb1..000000000
--- a/packages/xpub-ui/src/atoms/Radio.local.scss
+++ /dev/null
@@ -1,59 +0,0 @@
-.root {
-  align-items: center;
-  cursor: pointer;
-  display: flex;
-  transition: all 2s;
-}
-
-.root.inline {
-  display: inline-flex;
-}
-
-.root.inline:not(:last-child) {
-  margin-right: 2.7em;
-}
-
-.root:not(.inline):not(:last-child) {
-  margin-bottom: 0.5rem;
-}
-
-/* label text */
-
-.label {
-  display: inline-block;
-  font-family: inherit;
-  font-size: 1em;
-  font-style: italic;
-  letter-spacing: 1px;
-}
-
-.checked .label {
-  font-weight: 600;
-}
-
-// hide the input
-
-.input {
-  display: none;
-}
-
-/* pseudo-input */
-
-.pseudoInput {
-  background-size: 0;
-  border-color: transparent;
-  border-radius: 10px;
-  box-shadow: 0 0 0 1px;
-  content: " ";
-  display: inline-block;
-  height: 10px;
-  margin-right: 0.3em;
-  transition: border 0.5s ease, background-size 0.3s ease;
-  vertical-align: center;
-  width: 10px;
-}
-
-.root:not(.checked):hover .pseudoInput {
-  background: radial-gradient(closest-corner at center, var(--color-primary) 0%, var(--color-primary) 30%, white 30%, white 100%);
-  box-shadow: 0 0 0 1px var(--color-primary);
-}
diff --git a/packages/xpub-ui/src/atoms/Radio.md b/packages/xpub-ui/src/atoms/Radio.md
deleted file mode 100644
index 96aeba898..000000000
--- a/packages/xpub-ui/src/atoms/Radio.md
+++ /dev/null
@@ -1,54 +0,0 @@
-A radio button.
-
-```js
-initialState = {
-  value: undefined
-};
-
-<Radio 
-  name="radio" 
-  checked={state.value === 'on'}
-  onChange={event => setState({ value: event.target.value })}/>
-```
-
-A checked radio button.
-
-```js
-initialState = {
-  value: 'on'
-};
-
-<Radio 
-  name="radio-checked" 
-  checked={state.value === 'on'}
-  onChange={event => setState({ value: event.target.value })}/>
-```
-
-A radio button with a label.
-
-```js
-initialState = {
-  value: undefined
-};
-
-<Radio 
-  name="radio-checked" 
-  label="Foo"
-  checked={state.value === 'on'}
-  onChange={event => setState({ value: event.target.value })}/>
-```
-
-A radio button with a color.
-
-```js
-initialState = {
-  value: undefined
-};
-
-<Radio 
-  name="radio-color" 
-  label="Foo"
-  color="red"
-  checked={state.value === 'on'}
-  onChange={event => setState({ value: event.target.value })}/>
-```
diff --git a/packages/xpub-ui/src/atoms/Tags.js b/packages/xpub-ui/src/atoms/Tags.js
deleted file mode 100644
index c16f59947..000000000
--- a/packages/xpub-ui/src/atoms/Tags.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import React from 'react'
-import ReactTags from 'react-tag-autocomplete'
-import './Tags.scss'
-
-// TODO: separate tags when pasted
-// TODO: allow tags to be edited
-
-class Tags extends React.Component {
-  constructor(props) {
-    super(props)
-
-    this.state = {
-      tags: props.value || [],
-    }
-  }
-
-  handleDelete = index => {
-    const { tags } = this.state
-
-    tags.splice(index, 1)
-
-    this.setState({ tags })
-
-    this.props.onChange(tags)
-  }
-
-  handleAddition = tag => {
-    const { tags } = this.state
-
-    tags.push(tag)
-
-    this.setState({ tags })
-
-    this.props.onChange(tags)
-  }
-
-  render() {
-    const { tags } = this.state
-    const { name, suggestions, placeholder } = this.props
-
-    return (
-      <ReactTags
-        allowNew
-        autofocus={false}
-        // TODO: enable these when react-tag-autocomplete update is released
-        // delimiters={[]}
-        // delimiterChars={[',', ';']}
-        handleAddition={this.handleAddition}
-        handleDelete={this.handleDelete}
-        name={name}
-        placeholder={placeholder}
-        suggestions={suggestions}
-        tags={tags}
-      />
-    )
-  }
-}
-
-export default Tags
diff --git a/packages/xpub-ui/src/atoms/Tags.md b/packages/xpub-ui/src/atoms/Tags.md
deleted file mode 100644
index 9bfba763b..000000000
--- a/packages/xpub-ui/src/atoms/Tags.md
+++ /dev/null
@@ -1,21 +0,0 @@
-A form input for a list of tags.
-
-```js
-<Tags 
-  onChange={value => console.log(value)}/>
-```
-
-Existing values can be passed in, and the placeholder can be customized.
-
-```js
-const value = [
-  {name: 'foo'}, 
-  {name: 'bar'}, 
-  {name: 'baz'}
-];
-
-<Tags 
-  value={value}
-  placeholder="Add new keyword"
-  onChange={value => console.log(value)}/>
-```
diff --git a/packages/xpub-ui/src/atoms/Tags.scss b/packages/xpub-ui/src/atoms/Tags.scss
deleted file mode 100644
index 991d4395c..000000000
--- a/packages/xpub-ui/src/atoms/Tags.scss
+++ /dev/null
@@ -1,129 +0,0 @@
-/* stylelint-disable */
-
-/* trying to reuse some parts frome pubsweet website: the mixins for the underlines for the tags */
-
-$color: var(--color-primary);
-$color-back: white;
-
-@mixin realBorder($color, $colorback) {
-  background: linear-gradient($colorback 0, $colorback 1.2em, $color 1.2em, $color 1.25em, $colorback 1.25em, $colorback 2em) no-repeat;
-  text-shadow: 0.05em 0.05em 0 $colorback, -0.05em -0.05em 0 $colorback, -0.05em 0.05em 0 $colorback, 0.05em -0.05em 0 $colorback;
-}
-
-.root {
-  font-family: "Fira Sans Condensed", sans-serif;
-}
-
-.react-tags {
-  position: relative;
-  padding: 6px 0 0 6px;
-  font-size: 1em;
-  line-height: 1.2;
-
-  /* clicking anywhere will focus the input */
-  cursor: text;
-}
-
-.react-tags.is-focused {
-  border-color: var(--color-primary);
-}
-
-.react-tags__selected {
-  display: inline;
-}
-
-.react-tags__selected-tag {
-  font-family: "Vollkorn", serif;
-  display: inline-block;
-  box-sizing: border-box;
-  margin: 0 1em 1em 0;
-  padding: 0.1em 0.3em;
-  border: 0 solid transparent;
-  @include realBorder(#aaa, white);
-
-  /* match the font styles */
-  font-size: inherit;
-  line-height: inherit;
-  cursor: pointer;
-}
-
-.react-tags__selected-tag::after {
-  content: '\2715';
-  margin-left: 8px;
-  padding: 3px 0 0;
-  // margin: 0;
-  display: inline-block;
-  width: 13px;
-  height: 10px;
-  font-size: 0.9em;
-  background: white;
-  color: #aaa;
-  font-weight: 600;
-  text-shadow: none;
-
-  &:hover {
-    background: var(--color-primary);
-  }
-}
-
-.react-tags__selected-tag:hover,
-.react-tags__selected-tag:focus {
-  @include realBorder(transparent, white);
-
-  text-decoration: line-through;
-
-  &::after {
-    color: var(--color-danger);
-  }
-}
-
-.react-tags__search {
-  display: inline-block;
-
-  /* match tag layout */
-  margin: 0 1em 1em 0;
-  padding: 0.1em 0.3em;
-
-  /* prevent autoresize overflowing the container */
-  max-width: 100px;
-}
-
-@media screen and (min-width: 30em) {
-  .react-tags__search {
-    /* this will become the offsetParent for suggestions */
-    position: relative;
-  }
-}
-
-.react-tags__search input {
-  /* prevent autoresize overflowing the container */
-  max-width: 100%;
-
-  /* remove styles and layout from this element */
-  margin: 0;
-  padding: 0;
-  border: 0;
-  outline: none;
-
-  /* match the font styles */
-  font-size: inherit;
-  line-height: inherit;
-  border-bottom: 1px dashed grey;
-  min-width: 15ch;
-  font-family: "Vollkorn", serif;
-  color: black; // color: red;
-
-  &::placeholder {
-    font-family: "Fira Sans Condensed", sans-serif;
-    opacity: 0.5;
-  }
-
-  &:focus,
-  &:hover {
-    border-bottom: 1px dashed var(--color-primary);
-  }
-}
-
-.react-tags__search input::-ms-clear {
-  display: none;
-}
diff --git a/packages/xpub-ui/src/atoms/TextField.js b/packages/xpub-ui/src/atoms/TextField.js
deleted file mode 100644
index 987e07676..000000000
--- a/packages/xpub-ui/src/atoms/TextField.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react'
-import classes from './TextField.local.scss'
-
-const TextField = ({
-  label,
-  name,
-  placeholder,
-  required,
-  type = 'text',
-  value = '',
-  onBlur,
-  onChange,
-  readonly,
-}) => (
-  <label className={classes.root}>
-    {label && <span className={classes.text}>{label}</span>}
-    <input
-      className={classes.input}
-      name={name}
-      onBlur={onBlur}
-      onChange={onChange}
-      placeholder={placeholder}
-      readOnly={readonly}
-      required={required}
-      type={type}
-      value={value}
-    />
-  </label>
-)
-
-export default TextField
diff --git a/packages/xpub-ui/src/atoms/TextField.local.scss b/packages/xpub-ui/src/atoms/TextField.local.scss
deleted file mode 100644
index b857af22d..000000000
--- a/packages/xpub-ui/src/atoms/TextField.local.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-.root {
-  align-items: center;
-  display: flex;
-}
-
-.text {
-  margin-right: 10px;
-}
-
-.input {
-  flex: 1;
-  font-size: inherit;
-  padding: 0.5em;
-}
-
-.root input {
-  border: 0 none;
-  border-bottom: 1px dashed #aaa;
-  font-family: "Vollkorn", serif;
-  padding: 0;
-
-  &:hover,
-  &:focus {
-    border-bottom: 1px dashed var(--color-primary);
-    border-color: transparent;
-    box-shadow: none;
-    outline-style: none;
-  }
-}
-
-.root input::placeholder {
-  color: #777;
-  font-family: var(--font-interface);
-  font-style: italic;
-}
diff --git a/packages/xpub-ui/src/atoms/TextField.md b/packages/xpub-ui/src/atoms/TextField.md
deleted file mode 100644
index 4c5743191..000000000
--- a/packages/xpub-ui/src/atoms/TextField.md
+++ /dev/null
@@ -1,23 +0,0 @@
-A form input for plain text.
-
-
-```js
-initialState = { value: '' };
-
-<TextField 
-  value={state.value} 
-  placeholder="so you can write some in here"
-  onChange={event => setState({ value: event.target.value })}/>
-```
-
-The input can have a label.
-
-```js
-initialState = { value: '' };
-
-<TextField 
-  label="Foo" 
-  value={state.value}
-  placeholder="so you can write some in here"
-  onChange={event => setState({ value: event.target.value })}/>
-```
diff --git a/packages/xpub-ui/src/atoms/UploadingFile.js b/packages/xpub-ui/src/atoms/UploadingFile.js
deleted file mode 100644
index b5f6b6ad6..000000000
--- a/packages/xpub-ui/src/atoms/UploadingFile.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react'
-import classes from './UploadingFile.local.scss'
-
-// TODO: cancel button
-
-const extension = ({ name }) => name.replace(/^.+\./, '')
-
-const UploadingFile = ({ file, error, progress }) => (
-  <div className={classes.root}>
-    {!!error && <div className={classes.error}>{error}</div>}
-
-    <div className={classes.icon}>
-      {!!progress && (
-        <div
-          className={classes.progress}
-          style={{ top: `${progress * 100}%` }}
-        />
-      )}
-
-      <div className={classes.extension}>{extension(file)}</div>
-    </div>
-
-    <div className={classes.name}>{file.name}</div>
-  </div>
-)
-
-export default UploadingFile
diff --git a/packages/xpub-ui/src/atoms/UploadingFile.local.scss b/packages/xpub-ui/src/atoms/UploadingFile.local.scss
deleted file mode 100644
index 895148f99..000000000
--- a/packages/xpub-ui/src/atoms/UploadingFile.local.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-.root {
-  align-items: center;
-  display: inline-flex;
-  flex-direction: column;
-  margin-bottom: 2em;
-  margin-right: 3em;
-  position: relative;
-  width: 20ch;
-}
-
-.icon {
-  background: #ddd;
-  height: 100px;
-  margin: 5px;
-  opacity: 0.5;
-  position: relative;
-  width: 70px;
-}
-
-.progress {
-  background-image:
-    linear-gradient(
-      var(--color-primary-light) 50%,
-      var(--color-primary) 75%,
-      to top
-    );
-  bottom: 0;
-  content: '';
-  display: block;
-  left: 0;
-  opacity: 1;
-  position: absolute;
-  right: 0;
-  transform-origin: 0 0;
-
-  &::after {
-    /* we can use a data attribute for the numbering below */
-    bottom: 2px;
-    color: white;
-    content: "00%";
-    display: block;
-    position: absolute;
-    right: 2px;
-  }
-}
-
-.error {
-  background: var(--color-danger);
-  border: 2px solid white;
-  color: white;
-  font-size: 0.8em;
-  letter-spacing: 0.01em;
-  opacity: 1;
-  padding: 0.3em 0.5em;
-  position: absolute;
-  top: 25%;
-  z-index: 4;
-}
-
-.extension {
-  background: #888;
-  color: white;
-  font-size: 12px;
-  left: 20px;
-  padding: 2px;
-  position: absolute;
-  right: 0;
-  text-align: center;
-  text-transform: uppercase;
-  top: 20px;
-}
-
-.name {
-  color: gray;
-  font-size: 90%;
-  font-style: italic;
-  margin: 5px;
-  max-width: 20ch;
-}
-
-// clock experiment, on hold.
-//.progress {
-//    opacity: 1;
-//    background: var(--color-primary);
-//    position: absolute;
-//    bottom: 10%;
-//    right: 10%;
-//    content: '';
-//    width: 3px;
-//    height: 1em;
-//    display: block;
-//    // margin-left: 30%;
-//    transform-origin: 0 0;
-//    animation: rotate 1s infinite ease-in-out ;
-//    background-image:
-//    &:after {
-//      content: "uploading";
-//      display: block;
-//      position: absolute;
-//      width: 1em;
-//      height:  1em;
-//    }
-//}
-//
-//
-//@keyframes rotate {
-//  0% {
-//    transform: rotate(0)
-//  }
-//  100% {
-//    transform: rotate(360deg);
-//  }
-//}
diff --git a/packages/xpub-ui/src/atoms/UploadingFile.md b/packages/xpub-ui/src/atoms/UploadingFile.md
deleted file mode 100644
index 7a9db24c9..000000000
--- a/packages/xpub-ui/src/atoms/UploadingFile.md
+++ /dev/null
@@ -1,29 +0,0 @@
-A file that's being uploaded.
-
-```js
-const file = {
-  name: faker.system.commonFileName()
-};
-
-<UploadingFile file={file}/>
-```
-
-Upload progress is displayed as an overlay.
-
-```js
-const file = {
-  name: faker.system.commonFileName(),
-};
-
-<UploadingFile file={file} progress={0.5}/>
-```
-
-An upload error is displayed above the file.
-
-```js
-const file = {
-  name: faker.system.commonFileName(),
-};
-
-<UploadingFile file={file} error="There was an error"/>
-```
diff --git a/packages/xpub-ui/src/atoms/ValidatedField.js b/packages/xpub-ui/src/atoms/ValidatedField.js
deleted file mode 100644
index 2a5528bd9..000000000
--- a/packages/xpub-ui/src/atoms/ValidatedField.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react'
-import { compose, withHandlers } from 'recompose'
-import classnames from 'classnames'
-import { Field } from 'redux-form'
-import classes from './ValidatedField.local.scss'
-
-// TODO: pass ...props.input to children automatically?
-
-const ValidatedFieldComponent = ({ component: Component }) => ({
-  meta,
-  input,
-  readonly,
-}) => (
-  <div>
-    <Component {...input} readonly={readonly} />
-
-    {meta.touched &&
-      (meta.error || meta.warning) && (
-        <div className={classes.messages}>
-          {meta.error && (
-            <div className={classnames(classes.message, classes.error)}>
-              {meta.error}
-            </div>
-          )}
-
-          {meta.warning && (
-            <div className={classnames(classes.message, classes.warning)}>
-              {meta.warning}
-            </div>
-          )}
-        </div>
-      )}
-  </div>
-)
-
-const ValidatedField = ({ fieldComponent, ...rest }) => (
-  <Field {...rest} component={fieldComponent} />
-)
-
-export default compose(
-  withHandlers({
-    fieldComponent: ValidatedFieldComponent,
-  }),
-)(ValidatedField)
diff --git a/packages/xpub-ui/src/atoms/ValidatedField.local.scss b/packages/xpub-ui/src/atoms/ValidatedField.local.scss
deleted file mode 100644
index 3ba44df3b..000000000
--- a/packages/xpub-ui/src/atoms/ValidatedField.local.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-.root {
-  font-family: var(--font-author);
-}
-
-.messages {
-  display: inline-block;
-  font-style: italic;
-  margin-left: 1em;
-  margin-top: 10px;
-}
-
-.message:not(:last-child) {
-  margin-bottom: 10px;
-}
-
-.error,
-.warning {
-  font-size: 0.9em;
-  letter-spacing: 0.01em;
-}
-
-.error {
-  color: var(--color-danger);
-}
-
-.warning {
-  color: var(--color-warning);
-}
diff --git a/packages/xpub-ui/src/atoms/ValidatedField.md b/packages/xpub-ui/src/atoms/ValidatedField.md
deleted file mode 100644
index 136df6151..000000000
--- a/packages/xpub-ui/src/atoms/ValidatedField.md
+++ /dev/null
@@ -1,33 +0,0 @@
-A form field that displays the results of validation.
-
-```js
-const { reduxForm } = require('redux-form');
-
-const ValidatedFieldForm = reduxForm({ 
-  form: 'validated-field-error',
-  onChange: values => console.log(values)
-})(ValidatedField);
-
-const TextInput = input => <TextField {...input}/>;
-
-<ValidatedFieldForm 
-    name="error" 
-    validate={() => 'Required'}
-    component={TextInput}/>
-```
-
-```js
-const { reduxForm } = require('redux-form');
-
-const ValidatedFieldForm = reduxForm({ 
-  form: 'validated-field-warning',
-  onChange: values => console.log(values)
-})(ValidatedField);
-
-const TextInput = input => <TextField {...input}/>;
-
-<ValidatedFieldForm 
-    name="warning" 
-    warn={() => 'Expected'}
-    component={TextInput}/>
-```
diff --git a/packages/xpub-ui/src/index.js b/packages/xpub-ui/src/index.js
deleted file mode 100644
index 699a30066..000000000
--- a/packages/xpub-ui/src/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/* atoms */
-export { default as Attachment } from './atoms/Attachment'
-export { default as Avatar } from './atoms/Avatar'
-export { default as Badge } from './atoms/Badge'
-export { default as Button } from './atoms/Button'
-export { default as Checkbox } from './atoms/Checkbox'
-export { default as File } from './atoms/File'
-export { default as Icon } from './atoms/Icon'
-export { default as Menu } from './atoms/Menu'
-export { default as Radio } from './atoms/Radio'
-export { default as Tags } from './atoms/Tags'
-export { default as TextField } from './atoms/TextField'
-export { default as ValidatedField } from './atoms/ValidatedField'
-
-/* molecules */
-export { default as AppBar } from './molecules/AppBar'
-export { default as Attachments } from './molecules/Attachments'
-export { default as CheckboxGroup } from './molecules/CheckboxGroup'
-export { default as Files } from './molecules/Files'
-export { default as PlainButton } from './molecules/PlainButton'
-export { default as Supplementary } from './molecules/Supplementary'
-export { default as RadioGroup } from './molecules/RadioGroup'
-export { default as YesOrNo } from './molecules/YesOrNo'
diff --git a/packages/xpub-ui/src/lib/animation.scss b/packages/xpub-ui/src/lib/animation.scss
deleted file mode 100644
index 21b947737..000000000
--- a/packages/xpub-ui/src/lib/animation.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-/* This file is here to share animations between modules, not used yet.. */
-
-@keyframes bounce {
-  33% {
-    transform: translateY(-20px);
-  }
-
-  66% {
-    transform: translateY(0);
-  }
-}
-
-.bounce {
-  animation: bounce 1s infinite ease-in-out;
-}
-
-@keyframes rotate {
-  from {
-    transform: rotate(0);
-  }
-
-  to {
-    transform: rotate(360deg);
-  }
-}
-
-.rotate {
-  animation: rotate 1s infinite ease-in-out;
-}
diff --git a/packages/xpub-ui/src/lib/colors.local.scss b/packages/xpub-ui/src/lib/colors.local.scss
deleted file mode 100644
index e06cf2a6b..000000000
--- a/packages/xpub-ui/src/lib/colors.local.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.primary {
-  background-color: cornflowerblue;
-  color: white;
-}
diff --git a/packages/xpub-ui/src/molecules/AppBar.js b/packages/xpub-ui/src/molecules/AppBar.js
deleted file mode 100644
index 2601c8fb9..000000000
--- a/packages/xpub-ui/src/molecules/AppBar.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import React from 'react'
-import { Link } from 'react-router-dom'
-import classnames from 'classnames'
-import classes from './AppBar.local.scss'
-import Icon from '../atoms/Icon'
-
-const AppBar = ({ brandLink, brandName, loginLink, logoutLink, userName }) => (
-  <div className={classes.root}>
-    <Link
-      className={classnames(classes.link, classes.logo)}
-      to={brandLink || '/'}
-    >
-      {brandName}
-    </Link>
-
-    <div className={classes.actions}>
-      {userName && (
-        <span className={classes.item}>
-          <Icon size={16}>user</Icon>
-          <span className={classes.username}>{userName}</span>
-        </span>
-      )}
-
-      {userName ? (
-        <Link
-          className={classnames(classes.item, classes.link)}
-          to={logoutLink}
-        >
-          logout
-        </Link>
-      ) : (
-        <Link className={classnames(classes.item, classes.link)} to={loginLink}>
-          login
-        </Link>
-      )}
-    </div>
-  </div>
-)
-
-export default AppBar
diff --git a/packages/xpub-ui/src/molecules/AppBar.local.scss b/packages/xpub-ui/src/molecules/AppBar.local.scss
deleted file mode 100644
index bfe123d50..000000000
--- a/packages/xpub-ui/src/molecules/AppBar.local.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-.root {
-  display: flex;
-  justify-content: space-between;
-}
-
-.link {
-  color: var(--color-primary);
-
-  &::before {
-    color: #aaa;
-    display: inline-block;
-    height: 1em;
-    margin-right: 0.3em;
-    text-align: center;
-  }
-}
-
-.link:hover {
-  cursor: pointer;
-  text-decoration: underline;
-
-  &::before {
-    color: var(--color-primary);
-  }
-}
-
-.item {
-  align-items: center;
-  display: inline-flex;
-  padding: 0 1rem;
-}
-
-.actions {
-  display: flex;
-}
-
-.username {
-  margin-left: 0.3em;
-}
-
-.logo::before {
-  content: "";
-}
diff --git a/packages/xpub-ui/src/molecules/AppBar.md b/packages/xpub-ui/src/molecules/AppBar.md
deleted file mode 100644
index a2b7acebc..000000000
--- a/packages/xpub-ui/src/molecules/AppBar.md
+++ /dev/null
@@ -1,20 +0,0 @@
-The app bar appears at the top of every page of the application.
-
-It displays the name of the application (as a link to the home page), the username of the current user, and a link to sign out. 
-
-```js
-<AppBar
-  brandName="xpub"
-  loginLink="/login"
-  logoutLink="/logout"
-  userName="foo"/>
-```
-
-When the user is not signed in, only the login link is displayed.
-
-```js
-<AppBar
-  brandName="xpub"
-  loginLink="/login"
-  logoutLink="/logout"/>
-```
diff --git a/packages/xpub-ui/src/molecules/Attachments.js b/packages/xpub-ui/src/molecules/Attachments.js
deleted file mode 100644
index c05eb4879..000000000
--- a/packages/xpub-ui/src/molecules/Attachments.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import React from 'react'
-import Files from './Files'
-import Attachment from '../atoms/Attachment'
-import classes from './Attachments.local.scss'
-import Icon from '../atoms/Icon'
-
-// TODO: show upload progress
-
-const Attachments = props => (
-  <Files
-    {...props}
-    buttonText="Attach file"
-    uploadedFile={value => <Attachment key={value.url} value={value} />}
-    uploadingFile={({ file, progress, error }) => (
-      <div className={classes.uploading}>
-        <span className={classes.icon}>
-          <Icon color="var(--color-primary)">paperclip</Icon>
-        </span>
-        <span className={classes.filename}>{error || 'Uploading…'}</span>
-      </div>
-    )}
-  />
-)
-
-export default Attachments
diff --git a/packages/xpub-ui/src/molecules/Attachments.local.scss b/packages/xpub-ui/src/molecules/Attachments.local.scss
deleted file mode 100644
index 67c036fe4..000000000
--- a/packages/xpub-ui/src/molecules/Attachments.local.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-.uploading {
-  align-items: center;
-  display: flex;
-}
-
-.icon {
-  color: gray;
-  margin-right: 10px;
-}
-
-.filename {
-  color: gray;
-}
diff --git a/packages/xpub-ui/src/molecules/Attachments.md b/packages/xpub-ui/src/molecules/Attachments.md
deleted file mode 100644
index 01dbde245..000000000
--- a/packages/xpub-ui/src/molecules/Attachments.md
+++ /dev/null
@@ -1,18 +0,0 @@
-A list of files attached to a note, and a button to attach a new file.
-
-```js
-const value = [
-  {
-    name: faker.system.commonFileName(),
-    url: faker.internet.url()
-  },
-  {
-    name: faker.system.commonFileName(),
-    url: faker.internet.url()
-  }
-];
-
-<Attachments 
-  value={value}
-  uploadFile={file => new XMLHttpRequest()}/>
-```
diff --git a/packages/xpub-ui/src/molecules/CheckboxGroup.js b/packages/xpub-ui/src/molecules/CheckboxGroup.js
deleted file mode 100644
index e4469cfd4..000000000
--- a/packages/xpub-ui/src/molecules/CheckboxGroup.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import React from 'react'
-import Checkbox from '../atoms/Checkbox'
-
-class CheckboxGroup extends React.Component {
-  constructor(props) {
-    super(props)
-
-    this.state = {
-      values: props.value || [],
-    }
-  }
-
-  handleChange = event => {
-    const { values } = this.state
-
-    const { value } = event.target
-
-    if (event.target.checked) {
-      values.push(value)
-    } else {
-      values.splice(values.indexOf(value), 1)
-    }
-
-    this.setState({ values })
-
-    this.props.onChange(values)
-  }
-
-  render() {
-    const { inline, name, options, required, readonly } = this.props
-    const { values } = this.state
-
-    return (
-      <div>
-        {options.map(option => (
-          <Checkbox
-            checked={values.includes(option.value)}
-            inline={inline}
-            key={option.value}
-            label={option.label}
-            name={name}
-            onChange={this.handleChange}
-            readonly={readonly}
-            required={required}
-            value={option.value}
-          />
-        ))}
-      </div>
-    )
-  }
-}
-
-export default CheckboxGroup
diff --git a/packages/xpub-ui/src/molecules/CheckboxGroup.md b/packages/xpub-ui/src/molecules/CheckboxGroup.md
deleted file mode 100644
index 7b43e13ec..000000000
--- a/packages/xpub-ui/src/molecules/CheckboxGroup.md
+++ /dev/null
@@ -1,54 +0,0 @@
-A group of checkboxes.
-
-```js
-const options = [
-  {
-    value: 'one',
-    label: 'One'
-  },
-  {
-    value: 'two',
-    label: 'Two'
-  },
-  {
-    value: 'three',
-    label: 'Three'
-  }
-];
-
-initialState = { value: [] };
-
-<CheckboxGroup 
-  name="checkboxgroup"
-  options={options} 
-  value={state.value}
-  onChange={value => setState({ value })}/>
-```
-
-The checkboxes can be displayed inline.
-
-```js
-const options = [
-  {
-    value: 'one',
-    label: 'One'
-  },
-  {
-    value: 'two',
-    label: 'Two'
-  },
-  {
-    value: 'three',
-    label: 'Three'
-  }
-];
-
-initialState = { value: [] };
-
-<CheckboxGroup 
-  name="checkboxgroup-inline"
-  options={options} 
-  value={state.value}
-  inline={true}
-  onChange={value => setState({ value })}/>
-```
diff --git a/packages/xpub-ui/src/molecules/Files.js b/packages/xpub-ui/src/molecules/Files.js
deleted file mode 100644
index de6321fed..000000000
--- a/packages/xpub-ui/src/molecules/Files.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import classes from './Files.local.scss'
-import Upload from './Upload'
-
-class Files extends React.Component {
-  constructor(props) {
-    super(props)
-
-    this.state = {
-      values: props.value || [],
-      uploads: [],
-    }
-  }
-
-  handleClick = () => {
-    this.fileInput.click()
-  }
-
-  handleChange = event => {
-    const { uploads } = this.state
-
-    Array.from(event.target.files).forEach(file => {
-      uploads.push({
-        file,
-        request: this.props.uploadFile(file),
-      })
-    })
-
-    this.setState({ uploads })
-  }
-
-  handleUploadedFile = ({ file, url }) => {
-    const values = this.state.values.concat({
-      name: file.name,
-      url,
-    })
-
-    const uploads = this.state.uploads.filter(
-      item => item.file.name !== file.name,
-    )
-
-    this.setState({ values, uploads })
-
-    this.props.onChange(values)
-  }
-
-  render() {
-    const {
-      name,
-      buttonText,
-      uploadingFile,
-      uploadedFile,
-      readonly,
-    } = this.props
-    const { values, uploads } = this.state
-
-    return (
-      <div className={classes.root}>
-        {!readonly && (
-          <div className={classes.upload}>
-            <button
-              className={classes.attach}
-              onClick={() => this.fileInput.click()}
-              type="button"
-            >
-              {buttonText}
-            </button>
-
-            <input
-              className={classes.input}
-              multiple
-              name={name}
-              onChange={this.handleChange}
-              ref={input => (this.fileInput = input)}
-              type="file"
-            />
-          </div>
-        )}
-
-        <div className={classes.files}>
-          {uploads &&
-            uploads.map(upload => (
-              <Upload
-                file={upload.file}
-                handleUploadedFile={this.handleUploadedFile}
-                key={upload.file.name}
-                render={uploadingFile}
-                request={upload.request}
-              />
-            ))}
-
-          {values && values.map(uploadedFile)}
-        </div>
-      </div>
-    )
-  }
-}
-
-export default Files
diff --git a/packages/xpub-ui/src/molecules/Files.local.scss b/packages/xpub-ui/src/molecules/Files.local.scss
deleted file mode 100644
index b6e58a85f..000000000
--- a/packages/xpub-ui/src/molecules/Files.local.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-.input {
-  display: none;
-}
-
-.button {
-  background: transparent;
-  border: 1px dashed grey;
-  cursor: pointer;
-  font-family: inherit;
-  font-size: inherit;
-  margin-bottom: 2em;
-  padding: 10px;
-}
-
-.button:hover {
-  border-color: var(--color-primary);
-  color: var(--color-primary);
-}
-
-.files {
-  font-size: 0.9em;
-  font-style: italic;
-  line-height: 1.5;
-}
-
-.attach {
-  background: transparent;
-  border: 1px dashed grey;
-  cursor: pointer;
-  font-family: inherit;
-  font-size: inherit;
-  margin-bottom: 2em;
-  padding: 10px;
-}
diff --git a/packages/xpub-ui/src/molecules/Files.md b/packages/xpub-ui/src/molecules/Files.md
deleted file mode 100644
index c13062d66..000000000
--- a/packages/xpub-ui/src/molecules/Files.md
+++ /dev/null
@@ -1,22 +0,0 @@
-A list of uploaded files, a list of uploading files and a button to upload more files.
-
-```js
-const file = () => ({
-  name: faker.system.commonFileName(),
-  type: faker.system.commonFileType(),
-  size: faker.random.number(),
-});
-
-const value = [
-  file(),
-  file(),
-  file()
-];
-
-<Files
-  value={value}
-  buttonText="↑ Choose a file to upload"
-  uploadingFile={({ file, progress, error }) => <div style={{color:'gray'}}>{file.name}</div>}
-  uploadedFile={value => <div>{value.name}</div>}
-  uploadFile={file => new XMLHttpRequest()}/>
-```
diff --git a/packages/xpub-ui/src/molecules/PlainButton.js b/packages/xpub-ui/src/molecules/PlainButton.js
deleted file mode 100644
index dc7179090..000000000
--- a/packages/xpub-ui/src/molecules/PlainButton.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import React from 'react'
-import classnames from 'classnames'
-import Button from '../atoms/Button'
-import classes from './PlainButton.local.scss'
-
-const PlainButton = ({
-  className,
-  children,
-  type,
-  disabled,
-  primary,
-  onClick,
-}) => (
-  <Button
-    className={classnames(classes.root, className)}
-    disabled={disabled}
-    onClick={onClick}
-    primary={primary}
-    type={type}
-  >
-    {children}
-  </Button>
-)
-
-export default PlainButton
diff --git a/packages/xpub-ui/src/molecules/PlainButton.local.scss b/packages/xpub-ui/src/molecules/PlainButton.local.scss
deleted file mode 100644
index 2b1967481..000000000
--- a/packages/xpub-ui/src/molecules/PlainButton.local.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.root.root {
-  background: none;
-  border: 0;
-  border-bottom: 2px solid #777;
-  font-style: italic;
-  letter-spacing: 0;
-  padding: 0;
-  text-transform: none;
-}
-
-.root.root:hover,
-.root.root:focus {
-  background: transparent;
-  border: 0;
-  border-bottom: 2px solid var(--color-primary);
-  color: var(--color-primary);
-}
-
-.root.root:active {
-  transform: scale(0.99);
-}
diff --git a/packages/xpub-ui/src/molecules/PlainButton.md b/packages/xpub-ui/src/molecules/PlainButton.md
deleted file mode 100644
index 97f05703c..000000000
--- a/packages/xpub-ui/src/molecules/PlainButton.md
+++ /dev/null
@@ -1,5 +0,0 @@
-A button that is styled as a link.
-
-```js
-<PlainButton>Take me back.</PlainButton>
-```
diff --git a/packages/xpub-ui/src/molecules/RadioGroup.js b/packages/xpub-ui/src/molecules/RadioGroup.js
deleted file mode 100644
index 381852a8d..000000000
--- a/packages/xpub-ui/src/molecules/RadioGroup.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react'
-import Radio from '../atoms/Radio'
-
-class RadioGroup extends React.Component {
-  constructor(props) {
-    super(props)
-
-    this.state = {
-      value: props.value,
-    }
-  }
-
-  handleChange = event => {
-    const { value } = event.target
-    this.setState({ value })
-    this.props.onChange(value)
-  }
-
-  render() {
-    const { inline, name, options, required, readonly } = this.props
-    const { value } = this.state
-
-    return (
-      <div>
-        {options.map(option => (
-          <Radio
-            checked={option.value === value}
-            color={option.color}
-            inline={inline}
-            key={option.value}
-            label={option.label}
-            name={name}
-            onChange={this.handleChange}
-            readonly={readonly}
-            required={required}
-            value={option.value}
-          />
-        ))}
-      </div>
-    )
-  }
-}
-
-export default RadioGroup
diff --git a/packages/xpub-ui/src/molecules/RadioGroup.md b/packages/xpub-ui/src/molecules/RadioGroup.md
deleted file mode 100644
index 1a753db59..000000000
--- a/packages/xpub-ui/src/molecules/RadioGroup.md
+++ /dev/null
@@ -1,48 +0,0 @@
-A group of radio buttons.
-
-```js
-const options = [
-  {
-    value: 'one',
-    label: 'One'
-  },
-  {
-    value: 'two',
-    label: 'Two'
-  },
-  {
-    value: 'three',
-    label: 'Three'
-  }
-];
-
-<RadioGroup 
-  options={options} 
-  name="radiogroup"
-  onChange={value => console.log(value)}/>
-```
-
-The buttons can be displayed inline
-
-```js
-const options = [
-  {
-    value: 'one',
-    label: 'One'
-  },
-  {
-    value: 'two',
-    label: 'Two'
-  },
-  {
-    value: 'three',
-    label: 'Three'
-  }
-];
-
-<RadioGroup 
-  options={options} 
-  name="radiogroup-inline"
-  inline={true}
-  onChange={value => console.log(value)}/>
-```
diff --git a/packages/xpub-ui/src/molecules/Supplementary.js b/packages/xpub-ui/src/molecules/Supplementary.js
deleted file mode 100644
index b876ff92e..000000000
--- a/packages/xpub-ui/src/molecules/Supplementary.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react'
-import Files from './Files'
-import UploadingFile from '../atoms/UploadingFile'
-import File from '../atoms/File'
-
-const Supplementary = props => (
-  <Files
-    {...props}
-    buttonText="↑ Upload files"
-    uploadedFile={value => <File key={value.url} value={value} />}
-    uploadingFile={({ file, progress, error }) => (
-      <UploadingFile
-        error={error}
-        file={file}
-        key={file.name}
-        progress={progress}
-      />
-    )}
-  />
-)
-
-export default Supplementary
diff --git a/packages/xpub-ui/src/molecules/Supplementary.md b/packages/xpub-ui/src/molecules/Supplementary.md
deleted file mode 100644
index c95a11fb4..000000000
--- a/packages/xpub-ui/src/molecules/Supplementary.md
+++ /dev/null
@@ -1,18 +0,0 @@
-A list of supplementary files, and a button to upload a new file.
-
-```js
-const value = [
-  {
-    name: faker.system.commonFileName(),
-    url: faker.internet.url()
-  },
-  {
-    name: faker.system.commonFileName(),
-    url: faker.internet.url()
-  }
-];
-
-<Supplementary 
-  value={value}
-  uploadFile={file => new XMLHttpRequest()}/>
-```
diff --git a/packages/xpub-ui/src/molecules/Upload.js b/packages/xpub-ui/src/molecules/Upload.js
deleted file mode 100644
index cb1e244ba..000000000
--- a/packages/xpub-ui/src/molecules/Upload.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import React from 'react'
-
-// TODO: retry on error
-// TODO: make this a HOC for <UploadingFile>?
-
-class Upload extends React.Component {
-  state = {
-    error: undefined,
-    progress: 0,
-  }
-
-  componentDidMount() {
-    const { request } = this.props
-
-    request.addEventListener('progress', this.handleProgress)
-    request.addEventListener('load', this.handleLoad)
-    request.addEventListener('error', this.handleError)
-    request.addEventListener('abort', this.handleAbort)
-  }
-
-  // TODO: 'progress' event not being fired often enough?
-  handleProgress = event => {
-    if (!event.lengthComputable) return
-
-    this.setState({
-      progress: event.loaded / event.total,
-    })
-  }
-
-  handleLoad = event => {
-    if (this.props.request.status === 200) {
-      this.setState({
-        progress: 1,
-      })
-
-      this.props.handleUploadedFile({
-        file: this.props.file,
-        url: this.props.request.responseText,
-      })
-    } else {
-      this.setState({
-        error: 'There was an error',
-      })
-    }
-  }
-
-  handleError = event => {
-    this.setState({
-      error: 'There was an error',
-    })
-  }
-
-  handleAbort = event => {
-    this.setState({
-      error: 'The upload was cancelled',
-    })
-  }
-
-  render() {
-    const { file, render } = this.props
-    const { progress, error } = this.state
-
-    return render({ file, progress, error })
-  }
-}
-
-export default Upload
diff --git a/packages/xpub-ui/src/molecules/YesOrNo.js b/packages/xpub-ui/src/molecules/YesOrNo.js
deleted file mode 100644
index 91ac8b3f9..000000000
--- a/packages/xpub-ui/src/molecules/YesOrNo.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react'
-import RadioGroup from './RadioGroup'
-import classes from './YesOrNo.local.scss'
-
-const options = [
-  {
-    label: 'Yes',
-    value: 'yes',
-  },
-  {
-    label: 'No',
-    value: 'no',
-  },
-]
-
-const YesOrNo = ({ name, value, required, onChange, readonly }) => (
-  <RadioGroup
-    className={classes.root}
-    inline
-    name={name}
-    onChange={onChange}
-    options={options}
-    readonly={readonly}
-    required={required}
-    value={value}
-  />
-)
-
-export default YesOrNo
diff --git a/packages/xpub-ui/src/molecules/YesOrNo.local.scss b/packages/xpub-ui/src/molecules/YesOrNo.local.scss
deleted file mode 100644
index 46dab1801..000000000
--- a/packages/xpub-ui/src/molecules/YesOrNo.local.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.root {
-  color: darkgreen;
-}
diff --git a/packages/xpub-ui/src/molecules/YesOrNo.md b/packages/xpub-ui/src/molecules/YesOrNo.md
deleted file mode 100644
index 1d410998e..000000000
--- a/packages/xpub-ui/src/molecules/YesOrNo.md
+++ /dev/null
@@ -1,17 +0,0 @@
-A group of radio buttons that provides just two options: "Yes" or "No"
-
-```js
-<YesOrNo
-  name="yesorno" 
-  onChange={value => console.log(value)}/>
-```
-
-If a value is set, one option is selected.
-
-```js
-<YesOrNo
-  name="yesorno-value" 
-  value="yes"
-  onChange={value => console.log(value)}/>
-```
-
diff --git a/packages/xpub-ui/styleguide.config.js b/packages/xpub-ui/styleguide.config.js
deleted file mode 100644
index 8b14c4584..000000000
--- a/packages/xpub-ui/styleguide.config.js
+++ /dev/null
@@ -1,39 +0,0 @@
-module.exports = {
-  context: {
-    faker: 'faker',
-  },
-  sections: [
-    {
-      content: 'docs/colors.md',
-      name: 'Colors',
-    },
-    {
-      content: 'docs/fonts.md',
-      name: 'Fonts',
-    },
-    {
-      components: 'src/atoms/*.js',
-      name: 'Atoms',
-    },
-    {
-      components: 'src/molecules/*.js',
-      name: 'Molecules',
-    },
-  ],
-  skipComponentsWithoutExample: true,
-  styleguideComponents: {
-    StyleGuideRenderer: require.resolve(
-      'xpub-styleguide/src/components/StyleGuideRenderer',
-    ),
-    Wrapper: require.resolve('xpub-styleguide/src/components/Wrapper'),
-  },
-  theme: {
-    color: {
-      link: 'cornflowerblue',
-    },
-    fontFamily: {
-      base: '"Fira Sans", sans-serif',
-    },
-  },
-  title: 'xpub-ui style guide',
-}
diff --git a/packages/xpub-ui/test/AppBar.test.js b/packages/xpub-ui/test/AppBar.test.js
deleted file mode 100644
index 25c7946b6..000000000
--- a/packages/xpub-ui/test/AppBar.test.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import React from 'react'
-import { shallow } from 'enzyme'
-import { Link, MemoryRouter } from 'react-router-dom'
-import renderer from 'react-test-renderer'
-
-import AppBar from '../src/molecules/AppBar'
-
-const props = {
-  brandLink: 'some link',
-  brandName: 'some brand',
-  loginLink: 'login link',
-  logoutLink: 'logout link',
-  userName: 'some name',
-}
-
-function makeWrapper(extraProps = {}) {
-  return shallow(
-    <MemoryRouter>
-      <AppBar {...props} {...extraProps} />
-    </MemoryRouter>,
-  )
-    .dive()
-    .dive()
-}
-
-describe('AppBar', () => {
-  test('Snapshot', () => {
-    const tree = renderer
-      .create(
-        <MemoryRouter>
-          <AppBar {...props} />
-        </MemoryRouter>,
-      )
-      .toJSON()
-    expect(tree).toMatchSnapshot()
-  })
-
-  test("Should link the brand to '/' if no brand link is given", () => {
-    const wrapper = makeWrapper({ brandLink: undefined })
-
-    const brand = wrapper.childAt(0)
-    expect(brand.prop('to')).toBe('/')
-  })
-
-  test('Should link the brand to the given prop', () => {
-    const wrapper = makeWrapper()
-    const brand = wrapper.childAt(0)
-    expect(brand.prop('to')).toBe(props.brandLink)
-  })
-
-  test('Should display the brand name', () => {
-    const wrapper = makeWrapper()
-    const brand = wrapper.childAt(0)
-    const brandName = brand.childAt(0)
-
-    expect(brandName.text()).toBe(props.brandName)
-  })
-
-  test('Should not display the username if there is none given', () => {
-    const wrapper = makeWrapper({ userName: undefined })
-
-    const rightArea = wrapper.childAt(1)
-
-    // If the username does not display, there is only child (login / logout)
-    expect(rightArea.children).toHaveLength(1)
-  })
-
-  test('Should display the username', () => {
-    const wrapper = makeWrapper()
-    const rightArea = wrapper.childAt(1)
-    expect(rightArea.children()).toHaveLength(2)
-
-    const userName = rightArea.childAt(0)
-    expect(userName.text()).toBe('<Icon />some name')
-  })
-
-  test('Should display the login link if no username is given', () => {
-    const wrapper = makeWrapper({ userName: undefined })
-
-    const rightArea = wrapper.childAt(1)
-    const logLink = rightArea.childAt(0) // first el if there is no username
-
-    expect(logLink.is(Link)).toBeTruthy()
-    expect(logLink.prop('to')).toBe(props.loginLink)
-    expect(logLink.children()).toHaveLength(1)
-
-    const logLinkText = logLink.childAt(0)
-    expect(logLinkText.text()).toBe('login')
-  })
-
-  test('Should display the logout link if a username is found', () => {
-    const wrapper = makeWrapper()
-    const rightArea = wrapper.childAt(1)
-    const logLink = rightArea.childAt(1) // 2nd el if there is a username
-
-    expect(logLink.is(Link)).toBeTruthy()
-    expect(logLink.prop('to')).toBe(props.logoutLink)
-    expect(logLink.children()).toHaveLength(1)
-
-    const logLinkText = logLink.childAt(0)
-    expect(logLinkText.text()).toBe('logout')
-  })
-})
diff --git a/packages/xpub-ui/test/Menu.test.js b/packages/xpub-ui/test/Menu.test.js
deleted file mode 100644
index b71f3a4d4..000000000
--- a/packages/xpub-ui/test/Menu.test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react'
-import { shallow } from 'enzyme'
-import renderer from 'react-test-renderer'
-
-import Menu from '../src/atoms/Menu'
-
-const props = {
-  options: [{ label: 'Foo', value: 'foo' }, { label: 'Bar', value: 'bar' }],
-  value: 'foo',
-}
-
-const wrapper = shallow(<Menu {...props} />)
-
-describe('Menu', () => {
-  test('Snapshot', () => {
-    const tree = renderer.create(<Menu {...props} />).toJSON()
-    expect(tree).toMatchSnapshot()
-  })
-
-  test('Renders a Menu', () => {
-    expect(wrapper.is('div')).toBeTruthy()
-    expect(wrapper).toHaveLength(1)
-  })
-})
diff --git a/packages/xpub-ui/test/Radio.test.js b/packages/xpub-ui/test/Radio.test.js
deleted file mode 100644
index 35d330995..000000000
--- a/packages/xpub-ui/test/Radio.test.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react'
-import { shallow } from 'enzyme'
-import renderer from 'react-test-renderer'
-
-import Radio from '../src/atoms/Radio'
-
-const props = {
-  checked: false,
-  label: 'TestLabel',
-  name: 'TestName',
-  required: true,
-  value: 'TestValue',
-}
-
-const wrapper = shallow(<Radio {...props} />)
-
-describe('Radio', () => {
-  test('Snapshot', () => {
-    const tree = renderer.create(<Radio {...props} />).toJSON()
-    expect(tree).toMatchSnapshot()
-  })
-
-  test('Input gets the correct props', () => {
-    const input = wrapper.find('input')
-
-    expect(input.prop('name')).toBe(props.name)
-    expect(input.prop('value')).toBe(props.value)
-    expect(input.prop('checked')).toBe(props.checked)
-    expect(input.prop('required')).toBe(props.required)
-  })
-})
diff --git a/packages/xpub-ui/test/RadioGroup.test.js b/packages/xpub-ui/test/RadioGroup.test.js
deleted file mode 100644
index b6ff69ef3..000000000
--- a/packages/xpub-ui/test/RadioGroup.test.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import React from 'react'
-import { clone } from 'lodash'
-import { shallow } from 'enzyme'
-import renderer from 'react-test-renderer'
-
-import Radio from '../src/atoms/Radio'
-import RadioGroup from '../src/molecules/RadioGroup'
-
-const props = {
-  name: 'TestName',
-  options: [
-    {
-      label: 'Yes',
-      value: 'yes',
-    },
-    {
-      label: 'No',
-      value: 'no',
-    },
-    {
-      label: 'Maybe',
-      value: 'maybe',
-    },
-  ],
-  required: true,
-  value: undefined,
-}
-
-const wrapper = shallow(<RadioGroup {...props} />)
-const radios = wrapper.find(Radio)
-
-describe('Radio Group', () => {
-  test('Snapshot', () => {
-    const tree = renderer.create(<RadioGroup {...props} />).toJSON()
-    expect(tree).toMatchSnapshot()
-  })
-
-  test('Renders a number of radio buttons', () => {
-    expect(wrapper.is('div')).toBeTruthy()
-
-    const len = props.options.length
-    expect(wrapper.children()).toHaveLength(len)
-
-    let i = 0
-
-    while (i < len) {
-      const child = wrapper.childAt(i)
-      expect(child.is(Radio)).toBeTruthy()
-
-      i += 1
-    }
-
-    expect(radios).toHaveLength(len)
-  })
-
-  test('Radios get the correct props', () => {
-    const radioComps = radios.getElements()
-    let i = 0
-
-    while (i < props.options.length) {
-      const radio = radioComps[i]
-      const radioProps = radio.props
-
-      expect(radioProps.label).toEqual(props.options[i].label)
-      expect(radioProps.value).toEqual(props.options[i].value)
-      expect(radioProps.name).toEqual(props.name)
-      expect(radioProps.required).toEqual(props.required)
-
-      i += 1
-    }
-  })
-
-  test('Value should match the checked radio button', () => {
-    // With no radio button selected
-    const radioComps = radios.getElements()
-    let i = 0
-
-    while (i < props.options.length) {
-      const radio = radioComps[i]
-      const radioProps = radio.props
-
-      expect(radioProps.checked).toBeFalsy()
-      i += 1
-    }
-
-    // With the first radio button selected
-    // (re-initialise the wrapper with changed props)
-    const newProps = clone(props)
-    newProps.value = 'yes'
-
-    const newWrapper = shallow(<RadioGroup {...newProps} />)
-    const newRadios = newWrapper.find(Radio)
-    const newRadioComps = newRadios.getElements()
-
-    i = 0
-
-    while (i < props.options.length) {
-      const radio = newRadioComps[i]
-      const radioProps = radio.props
-
-      if (i === 0) {
-        expect(radioProps.checked).toBeTruthy()
-      } else {
-        expect(radioProps.checked).toBeFalsy()
-      }
-
-      i += 1
-    }
-  })
-})
diff --git a/packages/xpub-ui/test/YesOrNo.test.js b/packages/xpub-ui/test/YesOrNo.test.js
deleted file mode 100644
index b893b903c..000000000
--- a/packages/xpub-ui/test/YesOrNo.test.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react'
-import { shallow } from 'enzyme'
-import renderer from 'react-test-renderer'
-
-import YesOrNo from '../src/molecules/YesOrNo'
-import RadioGroup from '../src/molecules/RadioGroup'
-
-const props = {
-  name: 'TestName',
-  value: 'Maybe',
-}
-
-const wrapper = shallow(<YesOrNo {...props} />)
-const radio = wrapper.find(RadioGroup)
-
-describe('Yes or No', () => {
-  test('Snapshot', () => {
-    const tree = renderer.create(<YesOrNo {...props} />).toJSON()
-    expect(tree).toMatchSnapshot()
-  })
-
-  test('Renders a RadioGroup', () => {
-    expect(wrapper.is('RadioGroup')).toBeTruthy()
-    expect(radio).toHaveLength(1)
-  })
-
-  test('Passes the correct options', () => {
-    const { options } = radio.props()
-    expect(options).toHaveLength(2)
-
-    expect(options[0].value).toEqual('yes')
-    expect(options[0].label).toEqual('Yes')
-
-    expect(options[1].value).toEqual('no')
-    expect(options[1].label).toEqual('No')
-  })
-
-  test('Passes down the correct name', () => {
-    const { name } = radio.props()
-    expect(name).toEqual(props.name)
-  })
-
-  test('Passes down the correct value', () => {
-    const { value } = radio.props()
-    expect(value).toEqual(props.value)
-  })
-})
diff --git a/packages/xpub-ui/test/__snapshots__/AppBar.test.js.snap b/packages/xpub-ui/test/__snapshots__/AppBar.test.js.snap
deleted file mode 100644
index df74fa0cb..000000000
--- a/packages/xpub-ui/test/__snapshots__/AppBar.test.js.snap
+++ /dev/null
@@ -1,64 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`AppBar Snapshot 1`] = `
-<div
-  className="root"
->
-  <a
-    className="link logo"
-    href="some link"
-    onClick={[Function]}
-  >
-    some brand
-  </a>
-  <div
-    className="actions"
-  >
-    <span
-      className="item"
-    >
-      <span
-        className="root"
-      >
-        <svg
-          height={16}
-          viewBox="0 0 24 24"
-          width={16}
-          xmlns="http://www.w3.org/2000/svg"
-        >
-          <path
-            d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"
-            fill="none"
-            stroke="black"
-            strokeLinecap="round"
-            strokeLinejoin="round"
-            strokeWidth="2"
-          />
-          <circle
-            cx="12"
-            cy="7"
-            fill="none"
-            r="4"
-            stroke="black"
-            strokeLinecap="round"
-            strokeLinejoin="round"
-            strokeWidth="2"
-          />
-        </svg>
-      </span>
-      <span
-        className="username"
-      >
-        some name
-      </span>
-    </span>
-    <a
-      className="item link"
-      href="logout link"
-      onClick={[Function]}
-    >
-      logout
-    </a>
-  </div>
-</div>
-`;
diff --git a/packages/xpub-ui/test/__snapshots__/Menu.test.js.snap b/packages/xpub-ui/test/__snapshots__/Menu.test.js.snap
deleted file mode 100644
index dfbe9ad31..000000000
--- a/packages/xpub-ui/test/__snapshots__/Menu.test.js.snap
+++ /dev/null
@@ -1,33 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Menu Snapshot 1`] = `
-<div
-  className="root"
->
-  <div
-    className="main"
-  >
-    <div
-      className="openerContainer"
-    >
-      <button
-        className="opener"
-        onClick={[Function]}
-        type="button"
-      >
-        <span>
-          Foo
-        </span>
-        <span
-          className="arrow"
-        >
-          â–¼
-        </span>
-      </button>
-    </div>
-    <div
-      className="optionsContainer"
-    />
-  </div>
-</div>
-`;
diff --git a/packages/xpub-ui/test/__snapshots__/Radio.test.js.snap b/packages/xpub-ui/test/__snapshots__/Radio.test.js.snap
deleted file mode 100644
index 523244afc..000000000
--- a/packages/xpub-ui/test/__snapshots__/Radio.test.js.snap
+++ /dev/null
@@ -1,38 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Radio Snapshot 1`] = `
-<label
-  className="root"
-  style={
-    Object {
-      "color": "black",
-    }
-  }
->
-  <input
-    checked={false}
-    className="input"
-    disabled={undefined}
-    name="TestName"
-    onChange={undefined}
-    required={true}
-    type="radio"
-    value="TestValue"
-  />
-  <span
-    className="pseudoInput"
-    style={
-      Object {
-        "background": "transparent",
-      }
-    }
-  >
-     
-  </span>
-  <span
-    className="label"
-  >
-    TestLabel
-  </span>
-</label>
-`;
diff --git a/packages/xpub-ui/test/__snapshots__/RadioGroup.test.js.snap b/packages/xpub-ui/test/__snapshots__/RadioGroup.test.js.snap
deleted file mode 100644
index 349310db8..000000000
--- a/packages/xpub-ui/test/__snapshots__/RadioGroup.test.js.snap
+++ /dev/null
@@ -1,108 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Radio Group Snapshot 1`] = `
-<div>
-  <label
-    className="root"
-    style={
-      Object {
-        "color": "black",
-      }
-    }
-  >
-    <input
-      checked={false}
-      className="input"
-      disabled={undefined}
-      name="TestName"
-      onChange={[Function]}
-      required={true}
-      type="radio"
-      value="yes"
-    />
-    <span
-      className="pseudoInput"
-      style={
-        Object {
-          "background": "transparent",
-        }
-      }
-    >
-       
-    </span>
-    <span
-      className="label"
-    >
-      Yes
-    </span>
-  </label>
-  <label
-    className="root"
-    style={
-      Object {
-        "color": "black",
-      }
-    }
-  >
-    <input
-      checked={false}
-      className="input"
-      disabled={undefined}
-      name="TestName"
-      onChange={[Function]}
-      required={true}
-      type="radio"
-      value="no"
-    />
-    <span
-      className="pseudoInput"
-      style={
-        Object {
-          "background": "transparent",
-        }
-      }
-    >
-       
-    </span>
-    <span
-      className="label"
-    >
-      No
-    </span>
-  </label>
-  <label
-    className="root"
-    style={
-      Object {
-        "color": "black",
-      }
-    }
-  >
-    <input
-      checked={false}
-      className="input"
-      disabled={undefined}
-      name="TestName"
-      onChange={[Function]}
-      required={true}
-      type="radio"
-      value="maybe"
-    />
-    <span
-      className="pseudoInput"
-      style={
-        Object {
-          "background": "transparent",
-        }
-      }
-    >
-       
-    </span>
-    <span
-      className="label"
-    >
-      Maybe
-    </span>
-  </label>
-</div>
-`;
diff --git a/packages/xpub-ui/test/__snapshots__/YesOrNo.test.js.snap b/packages/xpub-ui/test/__snapshots__/YesOrNo.test.js.snap
deleted file mode 100644
index 07bff3f16..000000000
--- a/packages/xpub-ui/test/__snapshots__/YesOrNo.test.js.snap
+++ /dev/null
@@ -1,74 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Yes or No Snapshot 1`] = `
-<div>
-  <label
-    className="root inline"
-    style={
-      Object {
-        "color": "black",
-      }
-    }
-  >
-    <input
-      checked={false}
-      className="input"
-      disabled={undefined}
-      name="TestName"
-      onChange={[Function]}
-      required={undefined}
-      type="radio"
-      value="yes"
-    />
-    <span
-      className="pseudoInput"
-      style={
-        Object {
-          "background": "transparent",
-        }
-      }
-    >
-       
-    </span>
-    <span
-      className="label"
-    >
-      Yes
-    </span>
-  </label>
-  <label
-    className="root inline"
-    style={
-      Object {
-        "color": "black",
-      }
-    }
-  >
-    <input
-      checked={false}
-      className="input"
-      disabled={undefined}
-      name="TestName"
-      onChange={[Function]}
-      required={undefined}
-      type="radio"
-      value="no"
-    />
-    <span
-      className="pseudoInput"
-      style={
-        Object {
-          "background": "transparent",
-        }
-      }
-    >
-       
-    </span>
-    <span
-      className="label"
-    >
-      No
-    </span>
-  </label>
-</div>
-`;
diff --git a/packages/xpub-ui/test/config/transform.js b/packages/xpub-ui/test/config/transform.js
deleted file mode 100644
index 7cc533c7f..000000000
--- a/packages/xpub-ui/test/config/transform.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = require('babel-jest').createTransformer({
-  presets: ['env', 'react', 'stage-2'],
-})
diff --git a/packages/xpub-ui/test/setup/enzyme.js b/packages/xpub-ui/test/setup/enzyme.js
deleted file mode 100644
index 7ae191afc..000000000
--- a/packages/xpub-ui/test/setup/enzyme.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import Enzyme from 'enzyme'
-import Adapter from 'enzyme-adapter-react-15'
-
-Enzyme.configure({ adapter: new Adapter() })
diff --git a/packages/xpub-ui/webpack.config.js b/packages/xpub-ui/webpack.config.js
deleted file mode 100644
index 4aa149ad2..000000000
--- a/packages/xpub-ui/webpack.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const webpackConfig = require('xpub-styleguide/src/webpack-config')
-
-module.exports = webpackConfig(__dirname)
diff --git a/yarn.lock b/yarn.lock
index ef0c868d3..5540cc6ba 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -73,6 +73,27 @@
     config "^1.26.2"
     joi "^10.6.0"
 
+"@pubsweet/ui@^0.1.1":
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-0.1.1.tgz#fdd6aaf85ff79de62ef6933ac90105a2b7cd8863"
+  dependencies:
+    babel-jest "^21.2.0"
+    classnames "^2.2.5"
+    enzyme "^3.2.0"
+    enzyme-adapter-react-15 "^1.0.5"
+    humps "^2.0.1"
+    lodash "^4.17.4"
+    prop-types "^15.5.10"
+    react "^15.6.1"
+    react-dom "^15.6.1"
+    react-feather "^1.0.7"
+    react-redux "^5.0.2"
+    react-router-dom "^4.2.2"
+    react-tag-autocomplete "^5.4.1"
+    recompose "^0.26.0"
+    redux "^3.6.0"
+    redux-form "^7.0.3"
+
 "@types/node@*":
   version "8.0.55"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.55.tgz#015966c0af809216b8a46cc527b5c211994d36f0"
@@ -84,10 +105,6 @@ JSONStream@^1.0.4:
     jsonparse "^1.2.0"
     through ">=2.2.7 <3"
 
-abab@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
-
 abbrev@1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -117,12 +134,6 @@ acorn-dynamic-import@^2.0.0:
   dependencies:
     acorn "^4.0.3"
 
-acorn-globals@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
-  dependencies:
-    acorn "^4.0.4"
-
 acorn-jsx@^3.0.0, acorn-jsx@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
@@ -143,7 +154,7 @@ acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
-acorn@^4.0.3, acorn@^4.0.4:
+acorn@^4.0.3:
   version "4.0.13"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
 
@@ -260,12 +271,6 @@ append-field@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
 
-append-transform@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
-  dependencies:
-    default-require-extensions "^1.0.0"
-
 aproba@^1.0.3, aproba@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -303,10 +308,6 @@ arr-flatten@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
 
-array-equal@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
-
 array-filter@~0.0.0:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
@@ -429,10 +430,6 @@ ast-types@^0.9.13:
   version "0.9.14"
   resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.14.tgz#d34ba5dffb9d15a44351fd2a9d82e4ab2838b5ba"
 
-astral-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
-
 async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -539,7 +536,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
-babel-core@^6.0.0, babel-core@^6.26.0:
+babel-core@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
   dependencies:
@@ -1389,12 +1386,6 @@ brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
 
-browser-resolve@^1.11.2:
-  version "1.11.2"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
-  dependencies:
-    resolve "1.1.7"
-
 browserify-aes@^1.0.0, browserify-aes@^1.0.4:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
@@ -1461,12 +1452,6 @@ browserslist@^2.1.2, browserslist@^2.9.1:
     caniuse-lite "^1.0.30000780"
     electron-to-chromium "^1.3.28"
 
-bser@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
-  dependencies:
-    node-int64 "^0.4.0"
-
 buble@^0.15.2:
   version "0.15.2"
   resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613"
@@ -1578,10 +1563,6 @@ callsites@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
 
-callsites@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
-
 camel-case@3.0.x:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
@@ -2056,10 +2037,6 @@ content-security-policy-builder@1.1.0:
   dependencies:
     dashify "^0.2.0"
 
-content-type-parser@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
-
 content-type@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
@@ -2209,7 +2186,7 @@ conventional-recommended-bump@^1.0.1:
     meow "^3.3.0"
     object-assign "^4.0.1"
 
-convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+convert-source-map@^1.5.0:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
 
@@ -2460,16 +2437,6 @@ csso@~2.3.1:
     clap "^1.0.9"
     source-map "^0.5.3"
 
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
-
-"cssstyle@>= 0.2.37 < 0.3.0":
-  version "0.2.37"
-  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
-  dependencies:
-    cssom "0.3.x"
-
 currently-unhandled@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -2579,12 +2546,6 @@ deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
-default-require-extensions@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
-  dependencies:
-    strip-bom "^2.0.0"
-
 defaults@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
@@ -2693,10 +2654,6 @@ dicer@0.2.5:
     readable-stream "1.1.x"
     streamsearch "0.1.2"
 
-diff@^3.2.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
-
 diffie-hellman@^5.0.0:
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
@@ -3100,7 +3057,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 
-escodegen@^1.6.1, escodegen@^1.9.0:
+escodegen@^1.9.0:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
   dependencies:
@@ -3390,12 +3347,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
     md5.js "^1.3.4"
     safe-buffer "^5.1.1"
 
-exec-sh@^0.2.0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
-  dependencies:
-    merge "^1.1.3"
-
 execa@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
@@ -3462,17 +3413,6 @@ expect-ct@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.0.tgz#52735678de18530890d8d7b95f0ac63640958094"
 
-expect@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b"
-  dependencies:
-    ansi-styles "^3.2.0"
-    jest-diff "^21.2.1"
-    jest-get-type "^21.2.0"
-    jest-matcher-utils "^21.2.1"
-    jest-message-util "^21.2.1"
-    jest-regex-util "^21.2.0"
-
 express@^4.15.3, express@^4.16.1, express@^4.16.2:
   version "4.16.2"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
@@ -3596,12 +3536,6 @@ faye-websocket@~0.11.0:
   dependencies:
     websocket-driver ">=0.5.1"
 
-fb-watchman@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
-  dependencies:
-    bser "^2.0.0"
-
 fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.9:
   version "0.8.16"
   resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
@@ -3645,13 +3579,6 @@ filename-regex@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
 
-fileset@^2.0.2:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
-  dependencies:
-    glob "^7.0.3"
-    minimatch "^3.0.3"
-
 filesize@3.5.10:
   version "3.5.10"
   resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f"
@@ -3824,7 +3751,7 @@ fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
-fsevents@^1.0.0, fsevents@^1.1.1:
+fsevents@^1.0.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
   dependencies:
@@ -4031,7 +3958,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-"glob@3 || 4 || 5 || 6 || 7", glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
+"glob@3 || 4 || 5 || 6 || 7", glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
   dependencies:
@@ -4169,10 +4096,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 
-growly@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
-
 gzip-size@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
@@ -4183,7 +4106,7 @@ handle-thing@^1.2.5:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
 
-handlebars@^4.0.2, handlebars@^4.0.3:
+handlebars@^4.0.2:
   version "4.0.11"
   resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
   dependencies:
@@ -4224,10 +4147,6 @@ har-validator@~5.0.3:
     ajv "^5.1.0"
     har-schema "^2.0.0"
 
-harmony-reflect@^1.4.6:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.5.1.tgz#b54ca617b00cc8aef559bbb17b3d85431dc7e329"
-
 has-ansi@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -4419,12 +4338,6 @@ html-comment-regex@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
 
-html-encoding-sniffer@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
-  dependencies:
-    whatwg-encoding "^1.0.1"
-
 html-entities@1.2.1, html-entities@^1.2.0:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
@@ -4571,12 +4484,6 @@ icss-utils@^2.1.0:
   dependencies:
     postcss "^6.0.1"
 
-identity-obj-proxy@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14"
-  dependencies:
-    harmony-reflect "^1.4.6"
-
 ieee754@^1.1.4:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
@@ -5125,33 +5032,11 @@ isstream@0.1.x, isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 
-istanbul-api@^1.1.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
-  dependencies:
-    async "^2.1.4"
-    fileset "^2.0.2"
-    istanbul-lib-coverage "^1.1.1"
-    istanbul-lib-hook "^1.1.0"
-    istanbul-lib-instrument "^1.9.1"
-    istanbul-lib-report "^1.1.2"
-    istanbul-lib-source-maps "^1.2.2"
-    istanbul-reports "^1.1.3"
-    js-yaml "^3.7.0"
-    mkdirp "^0.5.1"
-    once "^1.4.0"
-
-istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1:
+istanbul-lib-coverage@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
 
-istanbul-lib-hook@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
-  dependencies:
-    append-transform "^0.4.0"
-
-istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1:
+istanbul-lib-instrument@^1.7.5:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
   dependencies:
@@ -5163,31 +5048,6 @@ istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-ins
     istanbul-lib-coverage "^1.1.1"
     semver "^5.3.0"
 
-istanbul-lib-report@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
-  dependencies:
-    istanbul-lib-coverage "^1.1.1"
-    mkdirp "^0.5.1"
-    path-parse "^1.0.5"
-    supports-color "^3.1.2"
-
-istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
-  dependencies:
-    debug "^3.1.0"
-    istanbul-lib-coverage "^1.1.1"
-    mkdirp "^0.5.1"
-    rimraf "^2.6.1"
-    source-map "^0.5.3"
-
-istanbul-reports@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
-  dependencies:
-    handlebars "^4.0.3"
-
 items@2.x.x:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198"
@@ -5196,217 +5056,15 @@ javascript-stringify@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
 
-jest-changed-files@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29"
-  dependencies:
-    throat "^4.0.0"
-
-jest-cli@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00"
-  dependencies:
-    ansi-escapes "^3.0.0"
-    chalk "^2.0.1"
-    glob "^7.1.2"
-    graceful-fs "^4.1.11"
-    is-ci "^1.0.10"
-    istanbul-api "^1.1.1"
-    istanbul-lib-coverage "^1.0.1"
-    istanbul-lib-instrument "^1.4.2"
-    istanbul-lib-source-maps "^1.1.0"
-    jest-changed-files "^21.2.0"
-    jest-config "^21.2.1"
-    jest-environment-jsdom "^21.2.1"
-    jest-haste-map "^21.2.0"
-    jest-message-util "^21.2.1"
-    jest-regex-util "^21.2.0"
-    jest-resolve-dependencies "^21.2.0"
-    jest-runner "^21.2.1"
-    jest-runtime "^21.2.1"
-    jest-snapshot "^21.2.1"
-    jest-util "^21.2.1"
-    micromatch "^2.3.11"
-    node-notifier "^5.0.2"
-    pify "^3.0.0"
-    slash "^1.0.0"
-    string-length "^2.0.0"
-    strip-ansi "^4.0.0"
-    which "^1.2.12"
-    worker-farm "^1.3.1"
-    yargs "^9.0.0"
-
-jest-config@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480"
-  dependencies:
-    chalk "^2.0.1"
-    glob "^7.1.1"
-    jest-environment-jsdom "^21.2.1"
-    jest-environment-node "^21.2.1"
-    jest-get-type "^21.2.0"
-    jest-jasmine2 "^21.2.1"
-    jest-regex-util "^21.2.0"
-    jest-resolve "^21.2.0"
-    jest-util "^21.2.1"
-    jest-validate "^21.2.1"
-    pretty-format "^21.2.1"
-
-jest-diff@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f"
-  dependencies:
-    chalk "^2.0.1"
-    diff "^3.2.0"
-    jest-get-type "^21.2.0"
-    pretty-format "^21.2.1"
-
-jest-docblock@^21.0.0, jest-docblock@^21.2.0:
+jest-docblock@^21.0.0:
   version "21.2.0"
   resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414"
 
-jest-environment-jsdom@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4"
-  dependencies:
-    jest-mock "^21.2.0"
-    jest-util "^21.2.1"
-    jsdom "^9.12.0"
-
-jest-environment-node@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8"
-  dependencies:
-    jest-mock "^21.2.0"
-    jest-util "^21.2.1"
-
 jest-get-type@^21.2.0:
   version "21.2.0"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23"
 
-jest-haste-map@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8"
-  dependencies:
-    fb-watchman "^2.0.0"
-    graceful-fs "^4.1.11"
-    jest-docblock "^21.2.0"
-    micromatch "^2.3.11"
-    sane "^2.0.0"
-    worker-farm "^1.3.1"
-
-jest-jasmine2@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592"
-  dependencies:
-    chalk "^2.0.1"
-    expect "^21.2.1"
-    graceful-fs "^4.1.11"
-    jest-diff "^21.2.1"
-    jest-matcher-utils "^21.2.1"
-    jest-message-util "^21.2.1"
-    jest-snapshot "^21.2.1"
-    p-cancelable "^0.3.0"
-
-jest-matcher-utils@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64"
-  dependencies:
-    chalk "^2.0.1"
-    jest-get-type "^21.2.0"
-    pretty-format "^21.2.1"
-
-jest-message-util@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe"
-  dependencies:
-    chalk "^2.0.1"
-    micromatch "^2.3.11"
-    slash "^1.0.0"
-
-jest-mock@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f"
-
-jest-regex-util@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530"
-
-jest-resolve-dependencies@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09"
-  dependencies:
-    jest-regex-util "^21.2.0"
-
-jest-resolve@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6"
-  dependencies:
-    browser-resolve "^1.11.2"
-    chalk "^2.0.1"
-    is-builtin-module "^1.0.0"
-
-jest-runner@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467"
-  dependencies:
-    jest-config "^21.2.1"
-    jest-docblock "^21.2.0"
-    jest-haste-map "^21.2.0"
-    jest-jasmine2 "^21.2.1"
-    jest-message-util "^21.2.1"
-    jest-runtime "^21.2.1"
-    jest-util "^21.2.1"
-    pify "^3.0.0"
-    throat "^4.0.0"
-    worker-farm "^1.3.1"
-
-jest-runtime@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e"
-  dependencies:
-    babel-core "^6.0.0"
-    babel-jest "^21.2.0"
-    babel-plugin-istanbul "^4.0.0"
-    chalk "^2.0.1"
-    convert-source-map "^1.4.0"
-    graceful-fs "^4.1.11"
-    jest-config "^21.2.1"
-    jest-haste-map "^21.2.0"
-    jest-regex-util "^21.2.0"
-    jest-resolve "^21.2.0"
-    jest-util "^21.2.1"
-    json-stable-stringify "^1.0.1"
-    micromatch "^2.3.11"
-    slash "^1.0.0"
-    strip-bom "3.0.0"
-    write-file-atomic "^2.1.0"
-    yargs "^9.0.0"
-
-jest-snapshot@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0"
-  dependencies:
-    chalk "^2.0.1"
-    jest-diff "^21.2.1"
-    jest-matcher-utils "^21.2.1"
-    mkdirp "^0.5.1"
-    natural-compare "^1.4.0"
-    pretty-format "^21.2.1"
-
-jest-util@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78"
-  dependencies:
-    callsites "^2.0.0"
-    chalk "^2.0.1"
-    graceful-fs "^4.1.11"
-    jest-message-util "^21.2.1"
-    jest-mock "^21.2.0"
-    jest-validate "^21.2.1"
-    mkdirp "^0.5.1"
-
-jest-validate@^21.1.0, jest-validate@^21.2.1:
+jest-validate@^21.1.0:
   version "21.2.1"
   resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7"
   dependencies:
@@ -5415,12 +5073,6 @@ jest-validate@^21.1.0, jest-validate@^21.2.1:
     leven "^2.1.0"
     pretty-format "^21.2.1"
 
-jest@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1"
-  dependencies:
-    jest-cli "^21.2.1"
-
 joi-browser@^10.0.6:
   version "10.6.1"
   resolved "https://registry.yarnpkg.com/joi-browser/-/joi-browser-10.6.1.tgz#1cfc1a244c9242327842c24354d8ead1c2fe3571"
@@ -5459,7 +5111,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
-js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
+js-yaml@^3.4.3, js-yaml@^3.9.0, js-yaml@^3.9.1:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
   dependencies:
@@ -5477,30 +5129,6 @@ jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
 
-jsdom@^9.12.0:
-  version "9.12.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
-  dependencies:
-    abab "^1.0.3"
-    acorn "^4.0.4"
-    acorn-globals "^3.1.0"
-    array-equal "^1.0.0"
-    content-type-parser "^1.0.1"
-    cssom ">= 0.3.2 < 0.4.0"
-    cssstyle ">= 0.2.37 < 0.3.0"
-    escodegen "^1.6.1"
-    html-encoding-sniffer "^1.0.1"
-    nwmatcher ">= 1.3.9 < 2.0.0"
-    parse5 "^1.5.1"
-    request "^2.79.0"
-    sax "^1.2.1"
-    symbol-tree "^3.2.1"
-    tough-cookie "^2.3.2"
-    webidl-conversions "^4.0.0"
-    whatwg-encoding "^1.0.1"
-    whatwg-url "^4.3.0"
-    xml-name-validator "^2.0.1"
-
 jsesc@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
@@ -6142,12 +5770,6 @@ make-dir@^1.0.0:
   dependencies:
     pify "^3.0.0"
 
-makeerror@1.0.x:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
-  dependencies:
-    tmpl "1.0.x"
-
 map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@@ -6254,10 +5876,6 @@ merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
 
-merge@^1.1.3:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
-
 methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -6347,7 +5965,7 @@ minimist@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de"
 
-minimist@^1.1.1, minimist@^1.1.2, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.2, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -6551,10 +6169,6 @@ node-gyp@^3.0.3, node-gyp@^3.3.1:
     tar "^2.0.0"
     which "1"
 
-node-int64@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
-
 node-libs-browser@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
@@ -6602,15 +6216,6 @@ node-ninja@^1.0.1:
     tar "^2.0.0"
     which "1"
 
-node-notifier@^5.0.2:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
-  dependencies:
-    growly "^1.3.0"
-    semver "^5.3.0"
-    shellwords "^0.1.0"
-    which "^1.2.12"
-
 node-pre-gyp@0.6.36:
   version "0.6.36"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
@@ -6784,10 +6389,6 @@ number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
 
-"nwmatcher@>= 1.3.9 < 2.0.0":
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
-
 oauth-sign@~0.8.1, oauth-sign@~0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
@@ -6979,10 +6580,6 @@ osenv@0, osenv@^0.1.4:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.0"
 
-p-cancelable@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
-
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -7087,10 +6684,6 @@ parse-passwd@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
 
-parse5@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
-
 parse5@^3.0.1:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
@@ -8617,13 +8210,6 @@ react-tag-autocomplete@^5.4.1:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/react-tag-autocomplete/-/react-tag-autocomplete-5.5.0.tgz#49841388b88323f6bccb0c10039bd0252875b49f"
 
-react-test-renderer@^15.6.1:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8"
-  dependencies:
-    fbjs "^0.8.9"
-    object-assign "^4.1.0"
-
 react@^15.4.4, react@^15.6.1:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
@@ -9036,7 +8622,7 @@ request-promise-native@^1.0.5:
     stealthy-require "^1.1.0"
     tough-cookie ">=2.3.3"
 
-request@2, request@^2.79.0, request@^2.81.0, request@^2.83.0:
+request@2, request@^2.81.0, request@^2.83.0:
   version "2.83.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
   dependencies:
@@ -9214,10 +8800,6 @@ resolve-pathname@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
 
-resolve@1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-
 resolve@^1.2.0, resolve@^1.3.3:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
@@ -9312,20 +8894,6 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
 
-sane@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56"
-  dependencies:
-    anymatch "^1.3.0"
-    exec-sh "^0.2.0"
-    fb-watchman "^2.0.0"
-    minimatch "^3.0.2"
-    minimist "^1.1.1"
-    walker "~1.0.5"
-    watch "~0.18.0"
-  optionalDependencies:
-    fsevents "^1.1.1"
-
 sass-graph@^2.2.4:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
@@ -9345,7 +8913,7 @@ sass-loader@^6.0.6:
     lodash.tail "^4.1.1"
     pify "^3.0.0"
 
-sax@^1.2.1, sax@~1.2.1:
+sax@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
 
@@ -9482,10 +9050,6 @@ shell-quote@1.6.1:
     array-reduce "~0.0.0"
     jsonify "~0.0.0"
 
-shellwords@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
-
 signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -9761,13 +9325,6 @@ strict-uri-encode@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
 
-string-length@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
-  dependencies:
-    astral-regex "^1.0.0"
-    strip-ansi "^4.0.0"
-
 string-replace-loader@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-1.3.0.tgz#1d404a7bf5e2ec21b08ffc76d89445fbe49bc01d"
@@ -9833,16 +9390,16 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-bom@3.0.0, strip-bom@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
-
 strip-bom@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
   dependencies:
     is-utf8 "^0.2.0"
 
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
 strip-eof@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -9987,7 +9544,7 @@ supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
 
-supports-color@^3.1.2, supports-color@^3.2.3:
+supports-color@^3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
   dependencies:
@@ -10023,10 +9580,6 @@ symbol-observable@^1.0.3, symbol-observable@^1.0.4:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32"
 
-symbol-tree@^3.2.1:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
-
 table@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
@@ -10128,10 +9681,6 @@ text-table@0.2.0, text-table@~0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
 
-throat@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
-
 through2@2.0.3, through2@^2.0.0, through2@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
@@ -10174,10 +9723,6 @@ tmp@^0.0.33:
   dependencies:
     os-tmpdir "~1.0.2"
 
-tmpl@1.0.x:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
-
 to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
@@ -10285,16 +9830,12 @@ toposort@^1.0.0:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec"
 
-tough-cookie@>=2.3.3, tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+tough-cookie@>=2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
   dependencies:
     punycode "^1.4.1"
 
-tr46@~0.0.3:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
-
 trim-left-x@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/trim-left-x/-/trim-left-x-3.0.0.tgz#356cf055896726b9754425e841398842e90b4cdf"
@@ -10748,25 +10289,12 @@ w3c-keyname@^1.1.0:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-1.1.8.tgz#4e2219663760fd6535b7a1550f1552d71fc9372c"
 
-walker@~1.0.5:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
-  dependencies:
-    makeerror "1.0.x"
-
 warning@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
   dependencies:
     loose-envify "^1.0.0"
 
-watch@~0.18.0:
-  version "0.18.0"
-  resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
-  dependencies:
-    exec-sh "^0.2.0"
-    minimist "^1.2.0"
-
 watchpack@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
@@ -10805,14 +10333,6 @@ wcwidth@^1.0.0:
   dependencies:
     defaults "^1.0.3"
 
-webidl-conversions@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
-
-webidl-conversions@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
-
 webpack-dev-middleware@^1.11.0, webpack-dev-middleware@^1.12.0:
   version "1.12.2"
   resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
@@ -10919,23 +10439,10 @@ websocket-extensions@>=0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
 
-whatwg-encoding@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
-  dependencies:
-    iconv-lite "0.4.19"
-
 whatwg-fetch@>=0.10.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
 
-whatwg-url@^4.3.0:
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
-  dependencies:
-    tr46 "~0.0.3"
-    webidl-conversions "^3.0.0"
-
 whet.extend@~0.9.9:
   version "0.9.9"
   resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
@@ -10948,7 +10455,7 @@ which-module@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 
-which@1, which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.9:
+which@1, which@^1.2.10, which@^1.2.14, which@^1.2.9:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
   dependencies:
@@ -11026,7 +10533,7 @@ wordwrap@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
 
-worker-farm@^1.3.1, worker-farm@^1.4.1:
+worker-farm@^1.4.1:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae"
   dependencies:
@@ -11044,7 +10551,7 @@ wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 
-write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0:
+write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
   dependencies:
@@ -11098,10 +10605,6 @@ xml-char-classes@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
 
-xml-name-validator@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
-
 "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@@ -11186,24 +10689,6 @@ yargs@^8.0.2:
     y18n "^3.2.1"
     yargs-parser "^7.0.0"
 
-yargs@^9.0.0:
-  version "9.0.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"
-  dependencies:
-    camelcase "^4.1.0"
-    cliui "^3.2.0"
-    decamelize "^1.1.1"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    read-pkg-up "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^7.0.0"
-
 yargs@~3.10.0:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
-- 
GitLab