diff --git a/mobile/.expo/packager-info.json b/mobile/.expo/packager-info.json
index b3be66d..76e10d9 100644
--- a/mobile/.expo/packager-info.json
+++ b/mobile/.expo/packager-info.json
@@ -1,5 +1,5 @@
{
"expoServerPort": 19000,
"packagerPort": 19001,
- "packagerPid": 7732
+ "packagerPid": 44581
}
\ No newline at end of file
diff --git a/website/package-lock.json b/website/package-lock.json
index a850c43..404d4ca 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -1759,6 +1759,11 @@
"hoek": "4.2.0"
}
},
+ "bowser": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.2.tgz",
+ "integrity": "sha512-fuiANC1Bqbqa/S4gmvfCt7bGBmNELMsGZj4Wg3PrP6esP66Ttoj1JSlzFlXtHyduMv07kDNmDsX6VsMWT/MLGg=="
+ },
"boxen": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
@@ -2789,6 +2794,14 @@
"integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
"dev": true
},
+ "css-in-js-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz",
+ "integrity": "sha512-yuWmPMD9FLi50Xf3k8W8oO3WM1eVnxEGCldCLyfusQ+CgivFk0s23yst4ooW6tfxMuSa03S6uUEga9UhX6GRrA==",
+ "requires": {
+ "hyphenate-style-name": "1.0.2"
+ }
+ },
"css-loader": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.1.tgz",
@@ -4034,6 +4047,11 @@
"merge": "1.2.0"
}
},
+ "exenv": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
+ "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
+ },
"exit-hook": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
@@ -6215,6 +6233,11 @@
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
+ "hyphenate-style-name": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz",
+ "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es="
+ },
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
@@ -6321,6 +6344,15 @@
"integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
"dev": true
},
+ "inline-style-prefixer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.0.tgz",
+ "integrity": "sha1-MKA98bNGumsfuKgSvDydq+9IAi0=",
+ "requires": {
+ "bowser": "1.9.2",
+ "css-in-js-utils": "2.0.0"
+ }
+ },
"inquirer": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
@@ -10404,6 +10436,16 @@
"integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=",
"dev": true
},
+ "radium": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/radium/-/radium-0.22.0.tgz",
+ "integrity": "sha512-9zOYegr4gXfgDiVcf02Qyj8zzupmYSTtIhxvSU/42Ls1Q/+r1cisuGUUJ5m06Ha2cc/f3e5vMM80rj2l34Slew==",
+ "requires": {
+ "exenv": "1.2.2",
+ "inline-style-prefixer": "4.0.0",
+ "prop-types": "15.6.0"
+ }
+ },
"raf": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz",
diff --git a/website/package.json b/website/package.json
index 16f3ba6..280a3f6 100644
--- a/website/package.json
+++ b/website/package.json
@@ -9,6 +9,7 @@
"moment": "^2.18.1",
"papaparse": "^4.3.3",
"prop-types": "^15.5.10",
+ "radium": "^0.22.0",
"rc-datepicker": "^5.0.7",
"react": "^16.2.0",
"react-data-grid": "^2.0.51",
diff --git a/website/public/favicon-16x16.png b/website/public/favicon-16x16.png
new file mode 100644
index 0000000..e3a84b6
Binary files /dev/null and b/website/public/favicon-16x16.png differ
diff --git a/website/public/favicon-32x32.png b/website/public/favicon-32x32.png
new file mode 100644
index 0000000..9d9fd0d
Binary files /dev/null and b/website/public/favicon-32x32.png differ
diff --git a/website/public/favicon-96x96.png b/website/public/favicon-96x96.png
new file mode 100644
index 0000000..32410ab
Binary files /dev/null and b/website/public/favicon-96x96.png differ
diff --git a/website/public/favicon.ico b/website/public/favicon.ico
index 5c125de..e3a84b6 100644
Binary files a/website/public/favicon.ico and b/website/public/favicon.ico differ
diff --git a/website/public/favicon.png b/website/public/favicon.png
deleted file mode 100644
index 8673efc..0000000
Binary files a/website/public/favicon.png and /dev/null differ
diff --git a/website/public/index.html b/website/public/index.html
index 56c026e..08ecbd6 100644
--- a/website/public/index.html
+++ b/website/public/index.html
@@ -1,20 +1,10 @@
- Transition Management Resources
+ Deighton AR
-
-
diff --git a/website/src/App.js b/website/src/App.js
index 5a95c1b..38e8620 100644
--- a/website/src/App.js
+++ b/website/src/App.js
@@ -1,35 +1,38 @@
import React from 'react'
-import './App.scss'
-import { NavBar } from './Navigation'
-import { Home } from './Home'
import { Login, Logout, ResetPassword, ForgotPassword, ConfirmEmail, ProtectedRoute } from './Auth'
-import { Dashboard } from './Dashboard'
+import { Home } from './Home'
import { Profile } from './Profile'
import { Users } from './Users'
-import { Footer } from './Footer'
+import { HolyGrail } from './ui'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
+import logoImage from 'images/logo.png'
export class App extends React.Component {
render() {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* No Match Route */}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* No Match Route */}
+
+
+
+
+ v1.0.0. Copyright © 2018, Deighton.
+
+
)
}
}
diff --git a/website/src/App.scss b/website/src/App.scss
deleted file mode 100644
index 60aec55..0000000
--- a/website/src/App.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.App {
- text-align: center;
-}
-
-@media screen and (max-width: 768px) {
- html, body {
- padding-top: 4em;
- }
-}
diff --git a/website/src/Auth/Login.js b/website/src/Auth/Login.js
index a5cdc98..9df28ea 100644
--- a/website/src/Auth/Login.js
+++ b/website/src/Auth/Login.js
@@ -4,9 +4,10 @@ import { Container, Header, Form, Message } from 'semantic-ui-react'
import './Login.scss'
import { regExpPattern } from 'regexp-pattern'
import { api } from '../helpers'
-import { Validator, ValidatedInput, ValidatedCheckbox, ValidatedButton } from '../Validated'
+import { Validator, ValidatedInput, ValidatedCheckbox } from '../Validated'
import { WaitDialog, MessageDialog } from '../Dialog'
import { Link } from 'react-router-dom'
+import { Button } from '../ui'
export class Login extends React.Component {
static propTypes = {
@@ -106,8 +107,9 @@ export class Login extends React.Component {
name='rememberMe' onChange={this.handleChange} validator={this.state.validator}
message='Should we keep you logged in on this computer?' className='login-checkbox' />
-
+ { /* */ }
+
Please contact support@jamoki.com to request login credentials.
diff --git a/website/src/Dashboard/Dashboard.js b/website/src/Dashboard/Dashboard.js
deleted file mode 100644
index 98446a7..0000000
--- a/website/src/Dashboard/Dashboard.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react'
-import { Container } from 'semantic-ui-react'
-import { ProjectList } from './ProjectList'
-import { api } from '../helpers'
-
-export class Dashboard extends React.Component {
- constructor(props) {
- super(props)
- this.state = {
- projects: []
- }
- }
-
- componentDidMount() {
- api.listDashboardProjects().then((list) => {
- this.setState({
- projects: list.items
- })
- }).catch((error) => {
- console.error(error)
- })
- }
-
- render() {
- return (
-
-
-
- )
- }
-}
diff --git a/website/src/Dashboard/ProjectCard.js b/website/src/Dashboard/ProjectCard.js
deleted file mode 100644
index 349a294..0000000
--- a/website/src/Dashboard/ProjectCard.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import React from 'react'
-import PropTypes from 'prop-types'
-import { Card, Image, Button, Icon, Popup } from 'semantic-ui-react'
-import { Link } from 'react-router-dom'
-import { Constants, api } from '../helpers'
-import './ProjectCard.scss'
-
-export class ProjectCard extends React.Component {
- static propTypes = {
- project: PropTypes.object.isRequired // TODO: Add required fields
- }
-
- render() {
- let { project } = this.props
- const corporationLink = `/corporations/${project.branch.corporation.fingerprint}`
- const branchLink = corporationLink + `/branches/${project.branch.fingerprint}`
- const projectLink = branchLink + `/projects/${project.fingerprint}`
- return (
-
- {/* Project/Corp Logo Link Section */}
-
-
-
-
- {/* Project Info Section */}
-
-
-
- {project.branch.name}
- @
- {project.branch.corporation.name}
-
-
-
- {/* Project Link and Status Icon */}
-
-
- { project.error
- ? }
- content='This project is underway with no errors!'
- position='bottom left' />
- : }
- content='The Client Data Sheet for this project has not been completed.'
- position='bottom left' />
- }
-
-
- {/* Project Status Bar */}
-
- In-Progress
-
-
- )
- }
-}
diff --git a/website/src/Dashboard/ProjectCard.scss b/website/src/Dashboard/ProjectCard.scss
deleted file mode 100644
index aeb74d9..0000000
--- a/website/src/Dashboard/ProjectCard.scss
+++ /dev/null
@@ -1,55 +0,0 @@
-.ui.card.project-card {
- border-top: 2px solid #D4D4D5;
-}
-
-.status {
- color: WhiteSmoke;
- padding: 0.25em 1em;
- text-align: right;
- font-size: 0.85em;
- text-transform: capitalize;
-}
-
-.in-progress { background-color: #CF414A; }
-.sending { background-color: #D66C0A; }
-.receiving { background-color: #0062AF; }
-
-.project-card img {
- height: 2.5em !important;
- width: auto !important;
- margin: 0.25em auto;
-}
-
-.project-info {
- height: 7em !important;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
-
-.project-info a {
- padding: 0.25em;
- color: black;
- border-radius: 5px;
-
-}
-
-.project-name.header { font-size: 1em !important; }
-
-.project-links {
- padding: 0 !important;
- display: flex;
- flex-direction: row;
- align-items: center;
-}
-
-.project-links a {
- background-color: transparent !important;
-}
-
-.project-links i.icon {
- position: absolute;
- right: 0.25em;
- color: LightSlateGrey;
-}
diff --git a/website/src/Dashboard/ProjectList.js b/website/src/Dashboard/ProjectList.js
deleted file mode 100644
index ffd77e4..0000000
--- a/website/src/Dashboard/ProjectList.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react'
-import PropTypes from 'prop-types'
-import { Grid } from 'semantic-ui-react'
-import { ProjectCard } from './ProjectCard'
-import './ProjectList.scss'
-
-export class ProjectList extends React.Component {
- static propTypes = {
- projects: PropTypes.arrayOf(PropTypes.object)
- }
-
- render() {
- let { projects } = this.props
-
- return (
-
-
-
- {projects.length} Projects Underway
-
- {this.props.projects
- ? projects.map((project, index) => (
-
-
- ))
- : null
- }
-
-
- )
- }
-}
diff --git a/website/src/Dashboard/ProjectList.scss b/website/src/Dashboard/ProjectList.scss
deleted file mode 100644
index b8df1d5..0000000
--- a/website/src/Dashboard/ProjectList.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.project-list {
- margin: 3em 0 2em 0;
- padding-bottom: 2em;
- border-bottom: 1px solid Silver;
-}
-
-.project-list-heading {
- font-size: 1.5em;
- border-bottom: 1px solid Silver;
- margin-bottom: 1em !important;
-}
diff --git a/website/src/Dashboard/index.js b/website/src/Dashboard/index.js
deleted file mode 100644
index 5e2f626..0000000
--- a/website/src/Dashboard/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { Dashboard } from './Dashboard'
diff --git a/website/src/Navigation/NavBar.js b/website/src/Navigation/NavBar.js
deleted file mode 100644
index 5052ba0..0000000
--- a/website/src/Navigation/NavBar.js
+++ /dev/null
@@ -1,169 +0,0 @@
-import React from 'react'
-import PropTypes from 'prop-types'
-import { autoBind } from 'auto-bind2'
-import { Menu, Image, Button, Dropdown } from 'semantic-ui-react'
-import { Link, NavLink } from 'react-router-dom'
-import logoImg from 'images/logo.png'
-import { Constants, api } from '../helpers'
-import './NavBar.scss'
-
-export class NavBar extends React.Component {
- static propTypes = {
- activeItem: PropTypes.string
- }
-
- constructor() {
- super()
- autoBind(this, (name) => (name.startsWith('handle')))
- this.state = {
- activeItem: null
- }
- }
-
- handleItemClick = (event, { name }) => this.setState({ activeItem: name })
-
- handleUpdate() {
- this.forceUpdate()
- }
-
- componentDidMount() {
- api.addListener('login', this.handleUpdate)
- api.addListener('logout', this.handleUpdate)
- api.addListener('newThumbnailImage', this.handleUpdate)
- }
-
- componentWillUnmount() {
- api.removeListener('login', this.handleUpdate)
- api.removeListener('logout', this.handleUpdate)
- api.addListener('newThumbnailImage', this.handleUpdate)
- }
-
- render() {
- const { activeItem } = this.state
- const user = api.loggedInUser
-
- if (!user) {
- if (window.innerWidth <= 768) {
- return (
-
- )
- } else {
- return ()
- }
- }
-
- if (user.pending) {
- return
- }
-
- const userImageUrl = api.makeImageUrl(user.thumbnailImageId, Constants.smallUserImageSize)
- const userName = user.firstName + ' ' + user.lastName
-
- if (window.innerWidth <= 768) {
- return (
- user.role === 'broker'
- ?
- :
- )
- }
-
- return (
- user.role === 'broker'
- ?
- :
- )
- }
-}
diff --git a/website/src/Navigation/NavBar.scss b/website/src/Navigation/NavBar.scss
deleted file mode 100644
index de5d5f0..0000000
--- a/website/src/Navigation/NavBar.scss
+++ /dev/null
@@ -1,116 +0,0 @@
-/* === Nav Menu Stylesheet === */
-
-#NavMenu {
- background-color: #1b1b1b;
- box-shadow: 0 0 20px 2px Grey;
-}
-
-#NavMenu a.item {
- color: white;
- align-self: flex-end;
-}
-
-#NavMenu a.item.nav-menu-active {
- background-color: #2d2b2b;
- height: 100%;
-}
-
-#NavMenu a.item.nav-menu-active:nth-child(n) { border-bottom: 0.25em solid #CF414A; }
-#NavMenu a.item.nav-menu-active:nth-child(2n) { border-bottom: 0.25em solid #2185D0; }
-#NavMenu a.item.nav-menu-active:nth-child(3n) { border-bottom: 0.25em solid #DB822E; }
-
-#NavMenu a.item:hover { background-color: #444344; }
-
-#NavMenu img.menu-logo {
- height: 1em;
-}
-
-#login-button {
- height: 60%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: 1em;
- margin: auto 1em;
- background-color: #3f62ab;
-}
-
-#logout-button {
- height: 60%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: 1em;
- margin: auto 1em;
- background-color: silver;
-}
-
-.logged-in-user {
- display: flex;
- flex-direction: row;
- align-items: center;
-}
-
-.logged-in-user a {
- color: Silver;
- margin-right: 1em;
-}
-
-.logged-in-user a:hover {
- color: white;
-}
-
-.logged-in-user .user-name {
- margin-left: 0.25em;
-}
-
-#nav-item1 { border-bottom: 5px solid #2e4d9a; }
-#nav-item2 { border-bottom: 5px solid #db822e; }
-#nav-item3 { border-bottom: 5px solid #cf414a; }
-
-/* === Tablet-Specific Menu Styles === */
-
-#MobileNavMenu {
- border-radius: 0 !important;
- border-bottom: 5px solid #db822e !important;
-}
-
-@media screen and (max-width: 992px) {
- .user-name {
- display: none;
- }
-}
-
-/* === Mobile-Specific Menu Styles === */
-
-@media screen and (max-width: 767px) {
- #NavMenu {
- font-size: 1em;
- }
-
- #NavMenu a.item {
- text-align: center !important;
- }
-
- .logged-in-user {
- width: 100%;
- flex-direction: column;
- align-items: flex-end;
-
- }
-
- .user-name {
- display: inline;
- }
-
- .logged-in-user a {
- width: 30%;
- }
-
- #logout-button {
- width: 30%;
- margin: 1.5em 0.5em 0.5em 0;
- }
-}
diff --git a/website/src/Navigation/index.js b/website/src/Navigation/index.js
deleted file mode 100644
index a374ad8..0000000
--- a/website/src/Navigation/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { NavBar } from './NavBar'
diff --git a/website/src/Validated/ValidatedCheckbox.js b/website/src/Validated/ValidatedCheckbox.js
index 9e34813..4f04078 100644
--- a/website/src/Validated/ValidatedCheckbox.js
+++ b/website/src/Validated/ValidatedCheckbox.js
@@ -1,13 +1,13 @@
import React from 'react'
import PropTypes from 'prop-types'
-import { Form, Popup, Checkbox } from 'semantic-ui-react'
+import { Form } from 'semantic-ui-react'
+import { Checkbox } from '../ui'
// This is an example of a validated component with a value that can change itself, that cannot ever be invalid.
export class ValidatedCheckbox extends React.Component {
static propTypes = {
name: PropTypes.string.isRequired,
- message: PropTypes.string.isRequired,
label: PropTypes.string,
width: PropTypes.number,
validator: PropTypes.object.isRequired,
@@ -39,9 +39,7 @@ export class ValidatedCheckbox extends React.Component {
render() {
return (
- } />
+
)
}
diff --git a/website/src/Validated/ValidatedInput.js b/website/src/Validated/ValidatedInput.js
index 1e87fec..d00e2b7 100644
--- a/website/src/Validated/ValidatedInput.js
+++ b/website/src/Validated/ValidatedInput.js
@@ -1,6 +1,7 @@
import React from 'react'
import PropTypes from 'prop-types'
-import { Form, Popup, Input } from 'semantic-ui-react'
+import { Form } from 'semantic-ui-react'
+import { Input } from '../ui'
// This is an example of a validated component with a value that changes itself
@@ -44,19 +45,14 @@ export class ValidatedInput extends React.Component {
return (
- {this.props.message
- ? }
- />
- :
- }
+
)
}
diff --git a/website/src/images/icons/folder-icon.png b/website/src/assets/icons/folder-icon.png
similarity index 100%
rename from website/src/images/icons/folder-icon.png
rename to website/src/assets/icons/folder-icon.png
diff --git a/website/src/images/icons/folder-open-2.png b/website/src/assets/icons/folder-open-2.png
similarity index 100%
rename from website/src/images/icons/folder-open-2.png
rename to website/src/assets/icons/folder-open-2.png
diff --git a/website/src/images/icons/open-folder.png b/website/src/assets/icons/open-folder.png
similarity index 100%
rename from website/src/images/icons/open-folder.png
rename to website/src/assets/icons/open-folder.png
diff --git a/website/src/assets/images/deighton.png b/website/src/assets/images/deighton.png
new file mode 100644
index 0000000..c9e8a79
Binary files /dev/null and b/website/src/assets/images/deighton.png differ
diff --git a/website/src/images/projectPlaceholder.svg b/website/src/images/projectPlaceholder.svg
deleted file mode 100644
index 9f0c6a2..0000000
--- a/website/src/images/projectPlaceholder.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/website/src/index.scss b/website/src/index.scss
index eaf0ec0..0b4af9f 100644
--- a/website/src/index.scss
+++ b/website/src/index.scss
@@ -1,14 +1,6 @@
@import '~semantic-ui-css/semantic.min.css';
-html, body {
- margin: 0;
- font-family: sans-serif;
- height: 100%;
+body #root {
+ min-height: 100vh;
position: relative;
}
-
-#root {
- min-height: 100%;
- position: relative;
- padding-bottom: 3em;
-}
diff --git a/website/src/ui/Button.js b/website/src/ui/Button.js
new file mode 100644
index 0000000..a98fc7b
--- /dev/null
+++ b/website/src/ui/Button.js
@@ -0,0 +1,19 @@
+import Radium from 'radium'
+import PropTypes from 'prop-types'
+import React, { Component } from 'react'
+import style from './Button.style'
+
+class Button extends Component {
+ static propTypes = {
+ submit: PropTypes.string,
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+
+ )
+ }
+}
+
+export default Radium(Button)
diff --git a/website/src/ui/Button.style.js b/website/src/ui/Button.style.js
new file mode 100644
index 0000000..a69ad4c
--- /dev/null
+++ b/website/src/ui/Button.style.js
@@ -0,0 +1,17 @@
+export default {
+ base: {
+ borderRadius: '10px',
+ fontFamily: 'Arial',
+ color: '#ffffff',
+ fontSize: '20px',
+ background: '#3498db',
+ padding: '10px 20px 10px 20px',
+ textDecoration: 'none',
+ outline: 'none',
+
+ ':hover': {
+ background: '#3cb0fd',
+ textDecoration: 'none'
+ }
+ }
+}
diff --git a/website/src/ui/Checkbox.js b/website/src/ui/Checkbox.js
new file mode 100644
index 0000000..c6055b7
--- /dev/null
+++ b/website/src/ui/Checkbox.js
@@ -0,0 +1,33 @@
+import Radium from 'radium'
+import PropTypes from 'prop-types'
+import React, { Component } from 'react'
+import style from './Checkbox.style'
+import { reactAutoBind } from 'auto-bind2'
+
+class Checkbox extends Component {
+ static propTypes = {
+ value: PropTypes.bool
+ }
+
+ constructor(props) {
+ super(props)
+ reactAutoBind(this)
+ this.state = {
+ checked: props.value
+ }
+ }
+
+ onClick() {
+ this.setState({ checked: !this.state.checked })
+ }
+
+ render() {
+ return (
+
+ )
+ }
+}
+
+export default Radium(Checkbox)
diff --git a/website/src/ui/Checkbox.style.js b/website/src/ui/Checkbox.style.js
new file mode 100644
index 0000000..c1cb3d6
--- /dev/null
+++ b/website/src/ui/Checkbox.style.js
@@ -0,0 +1,36 @@
+export default {
+ checkbox: {
+ cursor: 'pointer',
+ position: 'relative',
+ backgroundColor: '#2196F3',
+ top: 0,
+ left: 0,
+ height: 25,
+ width: 25
+ },
+
+ checkboxUnchecked: {
+ backgroundColor: '#E0E0E0',
+ ':hover': {
+ backgroundColor: '#C0C0C0'
+ }
+ },
+
+ checkmark: {
+ position: 'absolute',
+ display: 'block',
+ content: '',
+ left: 10,
+ top: 5,
+ width: 6,
+ height: 12,
+ borderStyle: 'solid',
+ borderColor: '#FFFFFF',
+ borderWidth: '0 3px 3px 0',
+ transform: 'rotate(45deg)'
+ },
+
+ checkmarkUnchecked: {
+ display: 'none'
+ }
+}
diff --git a/website/src/ui/HolyGrail.js b/website/src/ui/HolyGrail.js
new file mode 100644
index 0000000..569f570
--- /dev/null
+++ b/website/src/ui/HolyGrail.js
@@ -0,0 +1,54 @@
+import Radium from 'radium'
+import React, { Component } from 'react'
+import PropTypes from 'prop-types'
+import style from './HolyGrail.style.js'
+
+class HolyGrail extends Component {
+ static propTypes = {
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+ {this.props.children}
+ )
+ }
+}
+
+HolyGrail.Header = Radium(class HolyGrailHeader extends Component {
+ static propTypes = {
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+ {this.props.children}
+ )
+ }
+})
+
+HolyGrail.Footer = Radium(class HolyGrailFooter extends Component {
+ static propTypes = {
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+ {this.props.children}
+ )
+ }
+})
+
+HolyGrail.Body = Radium(class HolyGrailBody extends Component {
+ static propTypes = {
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+ {this.props.children}
+ )
+ }
+})
+
+export default Radium(HolyGrail)
diff --git a/website/src/ui/HolyGrail.style.js b/website/src/ui/HolyGrail.style.js
new file mode 100644
index 0000000..0ce4081
--- /dev/null
+++ b/website/src/ui/HolyGrail.style.js
@@ -0,0 +1,19 @@
+export default {
+ base: {
+ display: 'flex',
+ minHeight: '100vh',
+ flexDirection: 'column'
+ },
+ body: {
+ display: 'flex',
+ flexGrow: 1
+ },
+ header: {
+ backgroundColor: '#FAFAFA',
+ borderBottom: '1px solid #B2B2B2'
+ },
+ footer: {
+ backgroundColor: '#FAFAFA',
+ borderTop: '1px solid #B2B2B2'
+ }
+}
diff --git a/website/src/ui/Icon.js b/website/src/ui/Icon.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/Icon.style.js b/website/src/ui/Icon.style.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/Image.js b/website/src/ui/Image.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/Image.style.js b/website/src/ui/Image.style.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/Input.js b/website/src/ui/Input.js
new file mode 100644
index 0000000..3dd97f5
--- /dev/null
+++ b/website/src/ui/Input.js
@@ -0,0 +1,19 @@
+import Radium from 'radium'
+import PropTypes from 'prop-types'
+import React, { Component } from 'react'
+import style from './Input.style'
+
+class Input extends Component {
+ static propTypes = {
+ hidden: PropTypes.bool,
+ children: PropTypes.node
+ }
+
+ render() {
+ return (
+ {this.props.children}
+ )
+ }
+}
+
+export default Radium(Input)
diff --git a/website/src/ui/Input.style.js b/website/src/ui/Input.style.js
new file mode 100644
index 0000000..baadf02
--- /dev/null
+++ b/website/src/ui/Input.style.js
@@ -0,0 +1,18 @@
+export default {
+ base: {
+ padding: '5px',
+ fontSize: '16px',
+ borderWidth: '1px',
+ borderColor: '#b2b2b2',
+ backgroundColor: '#ffffff',
+ color: '#000000',
+ borderStyle: 'solid',
+ borderRadius: '5px',
+ // boxShadow: '0px 0px 0px rgba(66,66,66,.75)'
+ // textShadow: 'undefined 0px 0px 5px px rgba(66,66,66,.75)'
+
+ ':focus': {
+ outline: 'none'
+ }
+ }
+}
diff --git a/website/src/ui/Text.js b/website/src/ui/Text.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/Text.style.js b/website/src/ui/Text.style.js
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/ui/index.js b/website/src/ui/index.js
new file mode 100644
index 0000000..850c6b0
--- /dev/null
+++ b/website/src/ui/index.js
@@ -0,0 +1,4 @@
+export { default as Button } from './Button'
+export { default as Checkbox } from './Checkbox'
+export { default as Input } from './Input'
+export { default as HolyGrail } from './HolyGrail'