diff --git a/.babelrc b/.babelrc
index c5c8e4c..850db96 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,3 +1,4 @@
{
- "presets": ["es2015", "react"]
+ "presets": [ "es2015", "react" ],
+ "plugins": [ "react-hot-loader/babel" ]
}
diff --git a/.env b/.env
deleted file mode 100644
index e69de29..0000000
diff --git a/.gitignore b/.gitignore
index 67d4b8f..e0b42da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,11 @@
-
-########## Node ##########
# Logs
logs
*.log
-npm-debug.log*
# Runtime data
pids
*.pid
*.seed
-*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
@@ -17,9 +13,6 @@ lib-cov
# Coverage directory used by tools like istanbul
coverage
-# nyc test coverage
-.nyc_output
-
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
@@ -29,53 +22,24 @@ coverage
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
-# Dependency directories
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
-jspm_packages
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-# Yarn Integrity file
-.yarn-integrity
-
-######### Webpack #########
-.DS_Store
-*.orig
-/*.log
-/node_modules
-/dist
-/bower_components
-/*.sublime-workspace
-
-
-######### Babel $$$$$$$$
+**bower_components**
+**/dist/**
.DS_Store
-node_modules
-test/tmp
-*.log
-*.cache
-/templates.json
-/tests.json
-/browser.js
-/browser-polyfill.js
-/runtime.js
-/coverage
-dist
-/.package.json
-/packages/babel-runtime/core-js
-/packages/babel-runtime/helpers/*.js
-/packages/*/lib
-_babel.github.io
-/tests/.browser-build.js
-.nyc_output
+.sass-cache
+*.iml
+.idea/**
+*tmp*
+**sublime-project**
+**sublime-workspace**
+**lcov.info**
+**iconsMap**
+**.publish**
+server/server-routes.js
+
+# temporary while yarn does not fix problems with bad hash
+yarn.lock
diff --git a/README.md b/README.md
index 5ad0dad..faa4e70 100644
--- a/README.md
+++ b/README.md
@@ -10,5 +10,5 @@ $ npm install -d
### Run
```sh
-$ npm start
+gulp dev
```
diff --git a/app/actions/contact.js b/app/actions/contact.js
deleted file mode 100644
index bfada86..0000000
--- a/app/actions/contact.js
+++ /dev/null
@@ -1,32 +0,0 @@
-export function submitContactForm(name, email, message) {
- return (dispatch) => {
- dispatch({
- type: 'CLEAR_MESSAGES'
- });
- return fetch('/contact', {
- method: 'post',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- name: name,
- email: email,
- message: message
- })
- }).then((response) => {
- if (response.ok) {
- return response.json().then((json) => {
- dispatch({
- type: 'CONTACT_FORM_SUCCESS',
- messages: [json]
- });
- });
- } else {
- return response.json().then((json) => {
- dispatch({
- type: 'CONTACT_FORM_FAILURE',
- messages: Array.isArray(json) ? json : [json]
- });
- });
- }
- });
- };
-}
diff --git a/app/components/App.js b/app/components/App.js
deleted file mode 100644
index df6cc22..0000000
--- a/app/components/App.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import Header from './Header';
-import Footer from './Footer';
-
-class App extends React.Component {
- render() {
- return (
-
-
- {this.props.children}
-
-
- );
- }
-}
-
-export default App;
diff --git a/app/components/Contact.js b/app/components/Contact.js
deleted file mode 100644
index c69022d..0000000
--- a/app/components/Contact.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-import { connect } from 'react-redux'
-import { submitContactForm } from '../actions/contact';
-import Messages from './Messages';
-
-class Contact extends React.Component {
- constructor(props) {
- super(props);
- this.state = { name: '', email: '', message: '' };
- }
-
- handleChange(event) {
- this.setState({ [event.target.name]: event.target.value });
- }
-
- handleSubmit(event) {
- event.preventDefault();
- this.props.dispatch(submitContactForm(this.state.name, this.state.email, this.state.message));
- }
-
- render() {
- return (
-
-
Contact Form
-
-
-
- );
- }
-}
-
-const mapStateToProps = (state) => {
- return {
- messages: state.messages
- };
-};
-
-export default connect(mapStateToProps)(Contact);
diff --git a/app/components/Footer.js b/app/components/Footer.js
deleted file mode 100644
index 7729c8b..0000000
--- a/app/components/Footer.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-
-class Footer extends React.Component {
- render() {
- return (
-
- );
- }
-}
-
-export default Footer;
diff --git a/app/components/Header.js b/app/components/Header.js
deleted file mode 100644
index 19686df..0000000
--- a/app/components/Header.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-import { IndexLink, Link } from 'react-router';
-
-class Header extends React.Component {
- render() {
- return (
-
- );
- }
-}
-
-export default Header;
diff --git a/app/components/Home.js b/app/components/Home.js
deleted file mode 100644
index 51bd6eb..0000000
--- a/app/components/Home.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react';
-import { connect } from 'react-redux'
-import Messages from './Messages';
-
-class Home extends React.Component {
- render() {
- return (
-
-
-
-
-
Heading
-
Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor
- mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna
- mollis euismod. Donec sed odio dui.
-
View details
-
-
-
Heading
-
Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor
- mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna
- mollis euismod. Donec sed odio dui.
-
View details
-
-
-
Heading
-
Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor
- mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna
- mollis euismod. Donec sed odio dui.
-
View details
-
-
-
- );
- }
-}
-
-const mapStateToProps = (state) => {
- return {
- messages: state.messages
- };
-};
-
-export default connect(mapStateToProps)(Home);
diff --git a/app/components/Messages.js b/app/components/Messages.js
deleted file mode 100644
index 0c520fc..0000000
--- a/app/components/Messages.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-
-class Messages extends React.Component {
- render() {
- return this.props.messages.success ? (
-
- {this.props.messages.success.map((message, index) =>
{message.msg}
)}
-
- ) : this.props.messages.error ? (
-
- {this.props.messages.error.map((message, index) =>
{message.msg}
)}
-
- ) : this.props.messages.info ? (
-
- {this.props.messages.info.map((message, index) =>
{message.msg}
)}
-
- ) : null;
- }
-}
-
-export default Messages;
diff --git a/app/components/NotFound.js b/app/components/NotFound.js
deleted file mode 100644
index 5e17cd6..0000000
--- a/app/components/NotFound.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react';
-
-const NotFound = (props) => {
- return (
-
- );
-};
-
-export default NotFound;
diff --git a/app/main.js b/app/main.js
deleted file mode 100644
index 4a856fd..0000000
--- a/app/main.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import 'whatwg-fetch';
-import React from 'react';
-import ReactDOM from 'react-dom';
-import { Provider } from 'react-redux'
-import { Router, browserHistory } from 'react-router';
-import configureStore from './store/configureStore';
-import getRoutes from './routes';
-
-const store = configureStore(window.INITIAL_STATE);
-
-ReactDOM.render(
-
-
- ,
- document.getElementById('app')
-);
diff --git a/app/reducers/index.js b/app/reducers/index.js
deleted file mode 100644
index 3e2dbbb..0000000
--- a/app/reducers/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { combineReducers } from 'redux';
-import messages from './messages';
-
-export default combineReducers({
- messages
-});
diff --git a/app/reducers/messages.js b/app/reducers/messages.js
deleted file mode 100644
index 5a9f0d9..0000000
--- a/app/reducers/messages.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export default function messages(state = {}, action) {
- switch (action.type) {
- case 'CONTACT_FORM_FAILURE':
- return {
- error: action.messages
- };
- case 'CONTACT_FORM_SUCCESS':
- return {
- success: action.messages
- };
- case 'CLEAR_MESSAGES':
- return {};
- default:
- return state;
- }
-}
diff --git a/app/routes.js b/app/routes.js
deleted file mode 100644
index bb43d4e..0000000
--- a/app/routes.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import { IndexRoute, Route } from 'react-router';
-import App from './components/App';
-import Home from './components/Home';
-import Contact from './components/Contact';
-import NotFound from './components/NotFound';
-
-export default function getRoutes(store) {
- const clearMessages = () => {
- store.dispatch({
- type: 'CLEAR_MESSAGES'
- });
- };
- return (
-
-
-
-
-
- );
-}
diff --git a/app/store/configureStore.js b/app/store/configureStore.js
deleted file mode 100644
index 289a89b..0000000
--- a/app/store/configureStore.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { applyMiddleware, compose, createStore } from 'redux'
-import thunk from 'redux-thunk'
-import promise from 'redux-promise';
-import createLogger from 'redux-logger';
-import rootReducer from '../reducers'
-
-export default function configureStore(initialState) {
- const logger = createLogger();
- const store = createStore(
- rootReducer,
- initialState,
- applyMiddleware(thunk, promise, logger)
- );
-
- if (module.hot) {
- // Enable hot module replacement for reducers
- module.hot.accept('../reducers', () => {
- const nextRootReducer = require('../reducers');
- store.replaceReducer(nextRootReducer);
- });
- }
-
- return store;
-}
diff --git a/controllers/contact.js b/controllers/contact.js
deleted file mode 100644
index 5da57f8..0000000
--- a/controllers/contact.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var nodemailer = require('nodemailer');
-var transporter = nodemailer.createTransport({
- service: 'Mailgun',
- auth: {
- user: process.env.MAILGUN_USERNAME,
- pass: process.env.MAILGUN_PASSWORD
- }
-});
-
-/**
- * GET /contact
- */
-exports.contactGet = function(req, res) {
- res.render('contact', {
- title: 'Contact'
- });
-};
-
-/**
- * POST /contact
- */
-exports.contactPost = function(req, res) {
- req.assert('name', 'Name cannot be blank').notEmpty();
- req.assert('email', 'Email is not valid').isEmail();
- req.assert('email', 'Email cannot be blank').notEmpty();
- req.assert('message', 'Message cannot be blank').notEmpty();
- req.sanitize('email').normalizeEmail({ remove_dots: false });
-
- var errors = req.validationErrors();
-
- if (errors) {
- return res.status(400).send(errors);
- }
-
- var mailOptions = {
- from: req.body.name + ' ' + '<'+ req.body.email + '>',
- to: 'your@email.com',
- subject: '✔ Contact Form | Mega Boilerplate',
- text: req.body.message
- };
-
- transporter.sendMail(mailOptions, function(err) {
- res.send({ msg: 'Thank you! Your feedback has been submitted.' });
- });
-};
diff --git a/customEslintrc.json b/customEslintrc.json
new file mode 100644
index 0000000..f97c154
--- /dev/null
+++ b/customEslintrc.json
@@ -0,0 +1,4 @@
+{
+ "rules": {
+ }
+}
\ No newline at end of file
diff --git a/grommet-toolbox.config.js b/grommet-toolbox.config.js
new file mode 100644
index 0000000..e89c987
--- /dev/null
+++ b/grommet-toolbox.config.js
@@ -0,0 +1,16 @@
+import path from 'path';
+
+export default {
+ copyAssets: [
+ 'src/index.html',
+ {
+ asset: 'src/img/**',
+ dist: 'dist/img/'
+ }
+ ],
+ jsAssets: ['src/js/**/*.js'],
+ mainJs: 'src/js/index.js',
+ mainScss: 'src/scss/index.scss',
+ devServerPort: 9000,
+ eslintOverride: path.resolve(__dirname, 'customEslintrc')
+};
diff --git a/gulpfile.babel.js b/gulpfile.babel.js
new file mode 100644
index 0000000..9194554
--- /dev/null
+++ b/gulpfile.babel.js
@@ -0,0 +1,4 @@
+import gulp from 'gulp';
+import grommetToolbox from 'grommet-toolbox';
+
+grommetToolbox(gulp);
diff --git a/package.json b/package.json
index fdd3f63..0760c21 100644
--- a/package.json
+++ b/package.json
@@ -1,48 +1,21 @@
{
"name": "gradient",
- "version": "1.0.0",
- "description": "Gradient - Machine Learning Program Monitoring Tool",
- "scripts": {
- "build": "webpack --display-error-details",
- "postinstall": "npm run build",
- "start": "node server.js"
- },
+ "version": "0.1.0",
+ "main": "src/js/index.js",
+ "description": "",
+ "repository": "",
+ "license": "",
"dependencies": {
- "babel-core": "^6.7.2",
- "babel-loader": "^6.2.4",
- "babel-plugin-react-transform": "^2.0.2",
- "babel-polyfill": "^6.7.2",
- "babel-preset-es2015": "^6.6.0",
- "babel-preset-react": "^6.5.0",
- "body-parser": "^1.15.1",
- "compression": "^1.6.2",
- "cookie-parser": "^1.4.1",
- "dotenv": "^2.0.0",
- "express": "^4.13.4",
- "express-validator": "^2.20.4",
- "jade": "^1.11.0",
- "morgan": "^1.7.0",
- "nodemailer": "^2.3.0",
- "react": "^15.4.1",
- "react-dom": "^15.4.1",
- "react-redux": "4.4.1",
- "react-router": "^2.4.0",
- "react-transform-catch-errors": "^1.0.2",
- "react-transform-hmr": "^1.0.4",
- "redbox-react": "^1.2.4",
- "redux": "^3.3.1",
- "redux-logger": "^2.6.1",
- "redux-promise": "^0.5.3",
- "redux-thunk": "^2.0.1",
- "webpack": "^1.12.14",
- "webpack-dev-middleware": "^1.6.1",
- "webpack-hot-middleware": "^2.10.0",
- "whatwg-fetch": "^0.11.0"
+ "grommet": "^1.0.0",
+ "grommet-addons": "^0.1.0",
+ "react": "^15.4.0",
+ "react-dom": "^15.4.0"
},
"devDependencies": {
- "react-hot-loader": "^1.3.1"
- },
- "engines": {
- "node": "6.1.0"
+ "babel-preset-es2015": "^6.3.13",
+ "babel-preset-react": "^6.3.13",
+ "babel-register": "^6.5.2",
+ "grommet-toolbox": "^1.1.0",
+ "gulp": "^3.9.0"
}
}
diff --git a/public/css/flexboxgrid.css b/public/css/flexboxgrid.css
deleted file mode 100644
index 56d22e8..0000000
--- a/public/css/flexboxgrid.css
+++ /dev/null
@@ -1,1046 +0,0 @@
-.container-fluid,
-.container {
- margin-right: auto;
- margin-left: auto;
-}
-
-.container-fluid {
- padding-right: 2rem;
- padding-left: 2rem;
-}
-
-.row {
- box-sizing: border-box;
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-flex: 0;
- -webkit-flex: 0 1 auto;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -0.5rem;
- margin-left: -0.5rem;
-}
-
-.row.reverse {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: reverse;
- -webkit-flex-direction: row-reverse;
- -ms-flex-direction: row-reverse;
- flex-direction: row-reverse;
-}
-
-.col.reverse {
- -webkit-box-orient: vertical;
- -webkit-box-direction: reverse;
- -webkit-flex-direction: column-reverse;
- -ms-flex-direction: column-reverse;
- flex-direction: column-reverse;
-}
-
-.col-xs,
-.col-xs-1,
-.col-xs-2,
-.col-xs-3,
-.col-xs-4,
-.col-xs-5,
-.col-xs-6,
-.col-xs-7,
-.col-xs-8,
-.col-xs-9,
-.col-xs-10,
-.col-xs-11,
-.col-xs-12,
-.col-xs-offset-1,
-.col-xs-offset-2,
-.col-xs-offset-3,
-.col-xs-offset-4,
-.col-xs-offset-5,
-.col-xs-offset-6,
-.col-xs-offset-7,
-.col-xs-offset-8,
-.col-xs-offset-9,
-.col-xs-offset-10,
-.col-xs-offset-11,
-.col-xs-offset-12 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: 0.5rem;
- padding-left: 0.5rem;
-}
-
-.col-xs {
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%;
-}
-
-.col-xs-1 {
- -webkit-flex-basis: 8.333%;
- -ms-flex-preferred-size: 8.333%;
- flex-basis: 8.333%;
- max-width: 8.333%;
-}
-
-.col-xs-2 {
- -webkit-flex-basis: 16.667%;
- -ms-flex-preferred-size: 16.667%;
- flex-basis: 16.667%;
- max-width: 16.667%;
-}
-
-.col-xs-3 {
- -webkit-flex-basis: 25%;
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%;
-}
-
-.col-xs-4 {
- -webkit-flex-basis: 33.333%;
- -ms-flex-preferred-size: 33.333%;
- flex-basis: 33.333%;
- max-width: 33.333%;
-}
-
-.col-xs-5 {
- -webkit-flex-basis: 41.667%;
- -ms-flex-preferred-size: 41.667%;
- flex-basis: 41.667%;
- max-width: 41.667%;
-}
-
-.col-xs-6 {
- -webkit-flex-basis: 50%;
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%;
-}
-
-.col-xs-7 {
- -webkit-flex-basis: 58.333%;
- -ms-flex-preferred-size: 58.333%;
- flex-basis: 58.333%;
- max-width: 58.333%;
-}
-
-.col-xs-8 {
- -webkit-flex-basis: 66.667%;
- -ms-flex-preferred-size: 66.667%;
- flex-basis: 66.667%;
- max-width: 66.667%;
-}
-
-.col-xs-9 {
- -webkit-flex-basis: 75%;
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%;
-}
-
-.col-xs-10 {
- -webkit-flex-basis: 83.333%;
- -ms-flex-preferred-size: 83.333%;
- flex-basis: 83.333%;
- max-width: 83.333%;
-}
-
-.col-xs-11 {
- -webkit-flex-basis: 91.667%;
- -ms-flex-preferred-size: 91.667%;
- flex-basis: 91.667%;
- max-width: 91.667%;
-}
-
-.col-xs-12 {
- -webkit-flex-basis: 100%;
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%;
-}
-
-.col-xs-offset-1 {
- margin-left: 8.333%;
-}
-
-.col-xs-offset-2 {
- margin-left: 16.667%;
-}
-
-.col-xs-offset-3 {
- margin-left: 25%;
-}
-
-.col-xs-offset-4 {
- margin-left: 33.333%;
-}
-
-.col-xs-offset-5 {
- margin-left: 41.667%;
-}
-
-.col-xs-offset-6 {
- margin-left: 50%;
-}
-
-.col-xs-offset-7 {
- margin-left: 58.333%;
-}
-
-.col-xs-offset-8 {
- margin-left: 66.667%;
-}
-
-.col-xs-offset-9 {
- margin-left: 75%;
-}
-
-.col-xs-offset-10 {
- margin-left: 83.333%;
-}
-
-.col-xs-offset-11 {
- margin-left: 91.667%;
-}
-
-.start-xs {
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start;
-}
-
-.center-xs {
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center;
-}
-
-.end-xs {
- -webkit-box-pack: end;
- -webkit-justify-content: flex-end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end;
-}
-
-.top-xs {
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
-}
-
-.middle-xs {
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
-}
-
-.bottom-xs {
- -webkit-box-align: end;
- -webkit-align-items: flex-end;
- -ms-flex-align: end;
- align-items: flex-end;
-}
-
-.around-xs {
- -webkit-justify-content: space-around;
- -ms-flex-pack: distribute;
- justify-content: space-around;
-}
-
-.between-xs {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
-}
-
-.first-xs {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
-}
-
-.last-xs {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
-}
-
-@media only screen and (min-width: 48em) {
- .container {
- width: 49rem;
- }
-
- .col-sm,
- .col-sm-1,
- .col-sm-2,
- .col-sm-3,
- .col-sm-4,
- .col-sm-5,
- .col-sm-6,
- .col-sm-7,
- .col-sm-8,
- .col-sm-9,
- .col-sm-10,
- .col-sm-11,
- .col-sm-12,
- .col-sm-offset-1,
- .col-sm-offset-2,
- .col-sm-offset-3,
- .col-sm-offset-4,
- .col-sm-offset-5,
- .col-sm-offset-6,
- .col-sm-offset-7,
- .col-sm-offset-8,
- .col-sm-offset-9,
- .col-sm-offset-10,
- .col-sm-offset-11,
- .col-sm-offset-12 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
-
- .col-sm {
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%;
- }
-
- .col-sm-1 {
- -webkit-flex-basis: 8.333%;
- -ms-flex-preferred-size: 8.333%;
- flex-basis: 8.333%;
- max-width: 8.333%;
- }
-
- .col-sm-2 {
- -webkit-flex-basis: 16.667%;
- -ms-flex-preferred-size: 16.667%;
- flex-basis: 16.667%;
- max-width: 16.667%;
- }
-
- .col-sm-3 {
- -webkit-flex-basis: 25%;
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%;
- }
-
- .col-sm-4 {
- -webkit-flex-basis: 33.333%;
- -ms-flex-preferred-size: 33.333%;
- flex-basis: 33.333%;
- max-width: 33.333%;
- }
-
- .col-sm-5 {
- -webkit-flex-basis: 41.667%;
- -ms-flex-preferred-size: 41.667%;
- flex-basis: 41.667%;
- max-width: 41.667%;
- }
-
- .col-sm-6 {
- -webkit-flex-basis: 50%;
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%;
- }
-
- .col-sm-7 {
- -webkit-flex-basis: 58.333%;
- -ms-flex-preferred-size: 58.333%;
- flex-basis: 58.333%;
- max-width: 58.333%;
- }
-
- .col-sm-8 {
- -webkit-flex-basis: 66.667%;
- -ms-flex-preferred-size: 66.667%;
- flex-basis: 66.667%;
- max-width: 66.667%;
- }
-
- .col-sm-9 {
- -webkit-flex-basis: 75%;
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%;
- }
-
- .col-sm-10 {
- -webkit-flex-basis: 83.333%;
- -ms-flex-preferred-size: 83.333%;
- flex-basis: 83.333%;
- max-width: 83.333%;
- }
-
- .col-sm-11 {
- -webkit-flex-basis: 91.667%;
- -ms-flex-preferred-size: 91.667%;
- flex-basis: 91.667%;
- max-width: 91.667%;
- }
-
- .col-sm-12 {
- -webkit-flex-basis: 100%;
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%;
- }
-
- .col-sm-offset-1 {
- margin-left: 8.333%;
- }
-
- .col-sm-offset-2 {
- margin-left: 16.667%;
- }
-
- .col-sm-offset-3 {
- margin-left: 25%;
- }
-
- .col-sm-offset-4 {
- margin-left: 33.333%;
- }
-
- .col-sm-offset-5 {
- margin-left: 41.667%;
- }
-
- .col-sm-offset-6 {
- margin-left: 50%;
- }
-
- .col-sm-offset-7 {
- margin-left: 58.333%;
- }
-
- .col-sm-offset-8 {
- margin-left: 66.667%;
- }
-
- .col-sm-offset-9 {
- margin-left: 75%;
- }
-
- .col-sm-offset-10 {
- margin-left: 83.333%;
- }
-
- .col-sm-offset-11 {
- margin-left: 91.667%;
- }
-
- .start-sm {
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start;
- }
-
- .center-sm {
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center;
- }
-
- .end-sm {
- -webkit-box-pack: end;
- -webkit-justify-content: flex-end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end;
- }
-
- .top-sm {
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
- }
-
- .middle-sm {
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- }
-
- .bottom-sm {
- -webkit-box-align: end;
- -webkit-align-items: flex-end;
- -ms-flex-align: end;
- align-items: flex-end;
- }
-
- .around-sm {
- -webkit-justify-content: space-around;
- -ms-flex-pack: distribute;
- justify-content: space-around;
- }
-
- .between-sm {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
- }
-
- .first-sm {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
-
- .last-sm {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
-}
-
-@media only screen and (min-width: 64em) {
- .container {
- width: 65rem;
- }
-
- .col-md,
- .col-md-1,
- .col-md-2,
- .col-md-3,
- .col-md-4,
- .col-md-5,
- .col-md-6,
- .col-md-7,
- .col-md-8,
- .col-md-9,
- .col-md-10,
- .col-md-11,
- .col-md-12,
- .col-md-offset-1,
- .col-md-offset-2,
- .col-md-offset-3,
- .col-md-offset-4,
- .col-md-offset-5,
- .col-md-offset-6,
- .col-md-offset-7,
- .col-md-offset-8,
- .col-md-offset-9,
- .col-md-offset-10,
- .col-md-offset-11,
- .col-md-offset-12 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
-
- .col-md {
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%;
- }
-
- .col-md-1 {
- -webkit-flex-basis: 8.333%;
- -ms-flex-preferred-size: 8.333%;
- flex-basis: 8.333%;
- max-width: 8.333%;
- }
-
- .col-md-2 {
- -webkit-flex-basis: 16.667%;
- -ms-flex-preferred-size: 16.667%;
- flex-basis: 16.667%;
- max-width: 16.667%;
- }
-
- .col-md-3 {
- -webkit-flex-basis: 25%;
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%;
- }
-
- .col-md-4 {
- -webkit-flex-basis: 33.333%;
- -ms-flex-preferred-size: 33.333%;
- flex-basis: 33.333%;
- max-width: 33.333%;
- }
-
- .col-md-5 {
- -webkit-flex-basis: 41.667%;
- -ms-flex-preferred-size: 41.667%;
- flex-basis: 41.667%;
- max-width: 41.667%;
- }
-
- .col-md-6 {
- -webkit-flex-basis: 50%;
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%;
- }
-
- .col-md-7 {
- -webkit-flex-basis: 58.333%;
- -ms-flex-preferred-size: 58.333%;
- flex-basis: 58.333%;
- max-width: 58.333%;
- }
-
- .col-md-8 {
- -webkit-flex-basis: 66.667%;
- -ms-flex-preferred-size: 66.667%;
- flex-basis: 66.667%;
- max-width: 66.667%;
- }
-
- .col-md-9 {
- -webkit-flex-basis: 75%;
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%;
- }
-
- .col-md-10 {
- -webkit-flex-basis: 83.333%;
- -ms-flex-preferred-size: 83.333%;
- flex-basis: 83.333%;
- max-width: 83.333%;
- }
-
- .col-md-11 {
- -webkit-flex-basis: 91.667%;
- -ms-flex-preferred-size: 91.667%;
- flex-basis: 91.667%;
- max-width: 91.667%;
- }
-
- .col-md-12 {
- -webkit-flex-basis: 100%;
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%;
- }
-
- .col-md-offset-1 {
- margin-left: 8.333%;
- }
-
- .col-md-offset-2 {
- margin-left: 16.667%;
- }
-
- .col-md-offset-3 {
- margin-left: 25%;
- }
-
- .col-md-offset-4 {
- margin-left: 33.333%;
- }
-
- .col-md-offset-5 {
- margin-left: 41.667%;
- }
-
- .col-md-offset-6 {
- margin-left: 50%;
- }
-
- .col-md-offset-7 {
- margin-left: 58.333%;
- }
-
- .col-md-offset-8 {
- margin-left: 66.667%;
- }
-
- .col-md-offset-9 {
- margin-left: 75%;
- }
-
- .col-md-offset-10 {
- margin-left: 83.333%;
- }
-
- .col-md-offset-11 {
- margin-left: 91.667%;
- }
-
- .start-md {
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start;
- }
-
- .center-md {
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center;
- }
-
- .end-md {
- -webkit-box-pack: end;
- -webkit-justify-content: flex-end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end;
- }
-
- .top-md {
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
- }
-
- .middle-md {
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- }
-
- .bottom-md {
- -webkit-box-align: end;
- -webkit-align-items: flex-end;
- -ms-flex-align: end;
- align-items: flex-end;
- }
-
- .around-md {
- -webkit-justify-content: space-around;
- -ms-flex-pack: distribute;
- justify-content: space-around;
- }
-
- .between-md {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
- }
-
- .first-md {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
-
- .last-md {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
-}
-
-@media only screen and (min-width: 75em) {
- .container {
- width: 76rem;
- }
-
- .col-lg,
- .col-lg-1,
- .col-lg-2,
- .col-lg-3,
- .col-lg-4,
- .col-lg-5,
- .col-lg-6,
- .col-lg-7,
- .col-lg-8,
- .col-lg-9,
- .col-lg-10,
- .col-lg-11,
- .col-lg-12,
- .col-lg-offset-1,
- .col-lg-offset-2,
- .col-lg-offset-3,
- .col-lg-offset-4,
- .col-lg-offset-5,
- .col-lg-offset-6,
- .col-lg-offset-7,
- .col-lg-offset-8,
- .col-lg-offset-9,
- .col-lg-offset-10,
- .col-lg-offset-11,
- .col-lg-offset-12 {
- box-sizing: border-box;
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
-
- .col-lg {
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- max-width: 100%;
- }
-
- .col-lg-1 {
- -webkit-flex-basis: 8.333%;
- -ms-flex-preferred-size: 8.333%;
- flex-basis: 8.333%;
- max-width: 8.333%;
- }
-
- .col-lg-2 {
- -webkit-flex-basis: 16.667%;
- -ms-flex-preferred-size: 16.667%;
- flex-basis: 16.667%;
- max-width: 16.667%;
- }
-
- .col-lg-3 {
- -webkit-flex-basis: 25%;
- -ms-flex-preferred-size: 25%;
- flex-basis: 25%;
- max-width: 25%;
- }
-
- .col-lg-4 {
- -webkit-flex-basis: 33.333%;
- -ms-flex-preferred-size: 33.333%;
- flex-basis: 33.333%;
- max-width: 33.333%;
- }
-
- .col-lg-5 {
- -webkit-flex-basis: 41.667%;
- -ms-flex-preferred-size: 41.667%;
- flex-basis: 41.667%;
- max-width: 41.667%;
- }
-
- .col-lg-6 {
- -webkit-flex-basis: 50%;
- -ms-flex-preferred-size: 50%;
- flex-basis: 50%;
- max-width: 50%;
- }
-
- .col-lg-7 {
- -webkit-flex-basis: 58.333%;
- -ms-flex-preferred-size: 58.333%;
- flex-basis: 58.333%;
- max-width: 58.333%;
- }
-
- .col-lg-8 {
- -webkit-flex-basis: 66.667%;
- -ms-flex-preferred-size: 66.667%;
- flex-basis: 66.667%;
- max-width: 66.667%;
- }
-
- .col-lg-9 {
- -webkit-flex-basis: 75%;
- -ms-flex-preferred-size: 75%;
- flex-basis: 75%;
- max-width: 75%;
- }
-
- .col-lg-10 {
- -webkit-flex-basis: 83.333%;
- -ms-flex-preferred-size: 83.333%;
- flex-basis: 83.333%;
- max-width: 83.333%;
- }
-
- .col-lg-11 {
- -webkit-flex-basis: 91.667%;
- -ms-flex-preferred-size: 91.667%;
- flex-basis: 91.667%;
- max-width: 91.667%;
- }
-
- .col-lg-12 {
- -webkit-flex-basis: 100%;
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- max-width: 100%;
- }
-
- .col-lg-offset-1 {
- margin-left: 8.333%;
- }
-
- .col-lg-offset-2 {
- margin-left: 16.667%;
- }
-
- .col-lg-offset-3 {
- margin-left: 25%;
- }
-
- .col-lg-offset-4 {
- margin-left: 33.333%;
- }
-
- .col-lg-offset-5 {
- margin-left: 41.667%;
- }
-
- .col-lg-offset-6 {
- margin-left: 50%;
- }
-
- .col-lg-offset-7 {
- margin-left: 58.333%;
- }
-
- .col-lg-offset-8 {
- margin-left: 66.667%;
- }
-
- .col-lg-offset-9 {
- margin-left: 75%;
- }
-
- .col-lg-offset-10 {
- margin-left: 83.333%;
- }
-
- .col-lg-offset-11 {
- margin-left: 91.667%;
- }
-
- .start-lg {
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- text-align: start;
- }
-
- .center-lg {
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
- text-align: center;
- }
-
- .end-lg {
- -webkit-box-pack: end;
- -webkit-justify-content: flex-end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- text-align: end;
- }
-
- .top-lg {
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
- }
-
- .middle-lg {
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- }
-
- .bottom-lg {
- -webkit-box-align: end;
- -webkit-align-items: flex-end;
- -ms-flex-align: end;
- align-items: flex-end;
- }
-
- .around-lg {
- -webkit-justify-content: space-around;
- -ms-flex-pack: distribute;
- justify-content: space-around;
- }
-
- .between-lg {
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
- }
-
- .first-lg {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
-
- .last-lg {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
-}
\ No newline at end of file
diff --git a/public/css/main.css b/public/css/main.css
deleted file mode 100644
index 88943d1..0000000
--- a/public/css/main.css
+++ /dev/null
@@ -1,70 +0,0 @@
-html {
- position: relative;
- min-height: 100%;
-}
-
-body {
- margin-bottom: 44px;
-}
-
-ul, ol {
- list-style: none;
-}
-
-footer {
- position: absolute;
- height: 44px;
- bottom: 0;
- padding: 0 30px;
-}
-
-label {
- display: block;
- line-height: 1.8;
-}
-
-input[type="radio"] + label,
-input[type="checkbox"] + label {
- display: inline-block;
- margin: 0 5px;
-}
-
-form button[type="submit"] {
- margin-top: 1em;
-}
-
-.list-inline {
- display: inline-block;
- padding-left: 0;
- list-style: none;
-}
-
-.list-inline > li {
- display: inline-block;
- padding: 0 5px;
-}
-
-.container {
- padding-right: 2rem;
- padding-left: 2rem;
-}
-
-.text-success {
- color: #29b35b;
-}
-
-.text-danger {
- color: #b61b17;
-}
-
-.text-info {
- color: #31708f;
-}
-
-.avatar {
- margin-right: 5px;
- border-radius: 50%;
- width: 30px;
- height: 30px;
- vertical-align: middle;
-}
diff --git a/public/css/normalize.css b/public/css/normalize.css
deleted file mode 100644
index 18ddf7f..0000000
--- a/public/css/normalize.css
+++ /dev/null
@@ -1,419 +0,0 @@
-/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
-
-/**
- * 1. Change the default font family in all browsers (opinionated).
- * 2. Prevent adjustments of font size after orientation changes in IE and iOS.
- */
-
-html {
- font-family: sans-serif; /* 1 */
- -ms-text-size-adjust: 100%; /* 2 */
- -webkit-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * Remove the margin in all browsers (opinionated).
- */
-
-body {
- margin: 0;
-}
-
-/* HTML5 display definitions
- ========================================================================== */
-
-/**
- * Add the correct display in IE 9-.
- * 1. Add the correct display in Edge, IE, and Firefox.
- * 2. Add the correct display in IE.
- */
-
-article,
-aside,
-details, /* 1 */
-figcaption,
-figure,
-footer,
-header,
-main, /* 2 */
-menu,
-nav,
-section,
-summary { /* 1 */
- display: block;
-}
-
-/**
- * Add the correct display in IE 9-.
- */
-
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
-}
-
-/**
- * Add the correct display in iOS 4-7.
- */
-
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-
-/**
- * Add the correct vertical alignment in Chrome, Firefox, and Opera.
- */
-
-progress {
- vertical-align: baseline;
-}
-
-/**
- * Add the correct display in IE 10-.
- * 1. Add the correct display in IE.
- */
-
-template, /* 1 */
-[hidden] {
- display: none;
-}
-
-/* Links
- ========================================================================== */
-
-/**
- * 1. Remove the gray background on active links in IE 10.
- * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
- */
-
-a {
- background-color: transparent; /* 1 */
- -webkit-text-decoration-skip: objects; /* 2 */
-}
-
-/**
- * Remove the outline on focused links when they are also active or hovered
- * in all browsers (opinionated).
- */
-
-a:active,
-a:hover {
- outline-width: 0;
-}
-
-/* Text-level semantics
- ========================================================================== */
-
-/**
- * 1. Remove the bottom border in Firefox 39-.
- * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
- */
-
-abbr[title] {
- border-bottom: none; /* 1 */
- text-decoration: underline; /* 2 */
- text-decoration: underline dotted; /* 2 */
-}
-
-/**
- * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
- */
-
-b,
-strong {
- font-weight: inherit;
-}
-
-/**
- * Add the correct font weight in Chrome, Edge, and Safari.
- */
-
-b,
-strong {
- font-weight: bolder;
-}
-
-/**
- * Add the correct font style in Android 4.3-.
- */
-
-dfn {
- font-style: italic;
-}
-
-/**
- * Correct the font size and margin on `h1` elements within `section` and
- * `article` contexts in Chrome, Firefox, and Safari.
- */
-
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
-}
-
-/**
- * Add the correct background and color in IE 9-.
- */
-
-mark {
- background-color: #ff0;
- color: #000;
-}
-
-/**
- * Add the correct font size in all browsers.
- */
-
-small {
- font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` elements from affecting the line height in
- * all browsers.
- */
-
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-sup {
- top: -0.5em;
-}
-
-/* Embedded content
- ========================================================================== */
-
-/**
- * Remove the border on images inside links in IE 10-.
- */
-
-img {
- border-style: none;
-}
-
-/**
- * Hide the overflow in IE.
- */
-
-svg:not(:root) {
- overflow: hidden;
-}
-
-/* Grouping content
- ========================================================================== */
-
-/**
- * 1. Correct the inheritance and scaling of font size in all browsers.
- * 2. Correct the odd `em` font sizing in all browsers.
- */
-
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace; /* 1 */
- font-size: 1em; /* 2 */
-}
-
-/**
- * Add the correct margin in IE 8.
- */
-
-figure {
- margin: 1em 40px;
-}
-
-/**
- * 1. Add the correct box sizing in Firefox.
- * 2. Show the overflow in Edge and IE.
- */
-
-hr {
- box-sizing: content-box; /* 1 */
- height: 0; /* 1 */
- overflow: visible; /* 2 */
-}
-
-/* Forms
- ========================================================================== */
-
-/**
- * 1. Change font properties to `inherit` in all browsers (opinionated).
- * 2. Remove the margin in Firefox and Safari.
- */
-
-button,
-input,
-select,
-textarea {
- font: inherit; /* 1 */
- margin: 0; /* 2 */
-}
-
-/**
- * Restore the font weight unset by the previous rule.
- */
-
-optgroup {
- font-weight: bold;
-}
-
-/**
- * Show the overflow in IE.
- * 1. Show the overflow in Edge.
- */
-
-button,
-input { /* 1 */
- overflow: visible;
-}
-
-/**
- * Remove the inheritance of text transform in Edge, Firefox, and IE.
- * 1. Remove the inheritance of text transform in Firefox.
- */
-
-button,
-select { /* 1 */
- text-transform: none;
-}
-
-/**
- * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
- * controls in Android 4.
- * 2. Correct the inability to style clickable types in iOS and Safari.
- */
-
-button,
-html [type="button"], /* 1 */
-[type="reset"],
-[type="submit"] {
- -webkit-appearance: button; /* 2 */
-}
-
-/**
- * Remove the inner border and padding in Firefox.
- */
-
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
- border-style: none;
- padding: 0;
-}
-
-/**
- * Restore the focus styles unset by the previous rule.
- */
-
-button:-moz-focusring,
-[type="button"]:-moz-focusring,
-[type="reset"]:-moz-focusring,
-[type="submit"]:-moz-focusring {
- outline: 1px dotted ButtonText;
-}
-
-/**
- * Change the border, margin, and padding in all browsers (opinionated).
- */
-
-fieldset {
- border: 1px solid #c0c0c0;
- margin: 0 2px;
- padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct the text wrapping in Edge and IE.
- * 2. Correct the color inheritance from `fieldset` elements in IE.
- * 3. Remove the padding so developers are not caught out when they zero out
- * `fieldset` elements in all browsers.
- */
-
-legend {
- box-sizing: border-box; /* 1 */
- color: inherit; /* 2 */
- display: table; /* 1 */
- max-width: 100%; /* 1 */
- padding: 0; /* 3 */
- white-space: normal; /* 1 */
-}
-
-/**
- * Remove the default vertical scrollbar in IE.
- */
-
-textarea {
- overflow: auto;
-}
-
-/**
- * 1. Add the correct box sizing in IE 10-.
- * 2. Remove the padding in IE 10-.
- */
-
-[type="checkbox"],
-[type="radio"] {
- box-sizing: border-box; /* 1 */
- padding: 0; /* 2 */
-}
-
-/**
- * Correct the cursor style of increment and decrement buttons in Chrome.
- */
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-
-/**
- * 1. Correct the odd appearance in Chrome and Safari.
- * 2. Correct the outline style in Safari.
- */
-
-[type="search"] {
- -webkit-appearance: textfield; /* 1 */
- outline-offset: -2px; /* 2 */
-}
-
-/**
- * Remove the inner padding and cancel buttons in Chrome and Safari on OS X.
- */
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-/**
- * Correct the text style of placeholders in Chrome, Edge, and Safari.
- */
-
-::-webkit-input-placeholder {
- color: inherit;
- opacity: 0.54;
-}
-
-/**
- * 1. Correct the inability to style clickable types in iOS and Safari.
- * 2. Change font properties to `inherit` in Safari.
- */
-
-::-webkit-file-upload-button {
- -webkit-appearance: button; /* 1 */
- font: inherit; /* 2 */
-}
diff --git a/server.js b/server.js
deleted file mode 100644
index 52b4e55..0000000
--- a/server.js
+++ /dev/null
@@ -1,94 +0,0 @@
-var express = require('express');
-var path = require('path');
-var logger = require('morgan');
-var compression = require('compression');
-var cookieParser = require('cookie-parser');
-var bodyParser = require('body-parser');
-var expressValidator = require('express-validator');
-var dotenv = require('dotenv');
-var React = require('react');
-var ReactDOM = require('react-dom/server');
-var Router = require('react-router');
-var Provider = require('react-redux').Provider;
-var webpack = require('webpack');
-var config = require('./webpack.config');
-
-// Load environment variables from .env file
-dotenv.load();
-
-// ES6 Transpiler
-require('babel-core/register');
-require('babel-polyfill');
-
-// Controllers
-var contactController = require('./controllers/contact');
-
-// React and Server-Side Rendering
-var routes = require('./app/routes');
-var configureStore = require('./app/store/configureStore').default;
-
-var app = express();
-
-var compiler = webpack(config);
-app.set('views', path.join(__dirname, 'views'));
-app.set('view engine', 'jade');
-app.set('port', process.env.PORT || 3000);
-app.use(compression());
-app.use(logger('dev'));
-app.use(bodyParser.json());
-app.use(bodyParser.urlencoded({ extended: false }));
-app.use(expressValidator());
-app.use(cookieParser());
-
-if (app.get('env') === 'development') {
- app.use(require('webpack-dev-middleware')(compiler, {
- noInfo: true,
- publicPath: config.output.publicPath
- }));
- app.use(require('webpack-hot-middleware')(compiler));
-}
-
-app.use(express.static(path.join(__dirname, 'public')));
-
-app.post('/contact', contactController.contactPost);
-
-// React server rendering
-app.use(function(req, res) {
- var initialState = {
- messages: {}
- };
-
- var store = configureStore(initialState);
-
- Router.match({ routes: routes.default(store), location: req.url }, function(err, redirectLocation, renderProps) {
- if (err) {
- res.status(500).send(err.message);
- } else if (redirectLocation) {
- res.status(302).redirect(redirectLocation.pathname + redirectLocation.search);
- } else if (renderProps) {
- var html = ReactDOM.renderToString(React.createElement(Provider, { store: store },
- React.createElement(Router.RouterContext, renderProps)
- ));
- res.render('layout', {
- html: html,
- initialState: store.getState()
- });
- } else {
- res.sendStatus(404);
- }
- });
-});
-
-// Production error handler
-if (app.get('env') === 'production') {
- app.use(function(err, req, res, next) {
- console.error(err.stack);
- res.sendStatus(err.status || 500);
- });
-}
-
-app.listen(app.get('port'), function() {
- console.log('Express server listening on port ' + app.get('port'));
-});
-
-module.exports = app;
diff --git a/server/server.js b/server/server.js
new file mode 100644
index 0000000..326a2a9
--- /dev/null
+++ b/server/server.js
@@ -0,0 +1,2 @@
+// Server code
+
diff --git a/src/img/mobile-app-icon.png b/src/img/mobile-app-icon.png
new file mode 100644
index 0000000..bf6db83
Binary files /dev/null and b/src/img/mobile-app-icon.png differ
diff --git a/src/img/mobile-app-icon.svg b/src/img/mobile-app-icon.svg
new file mode 100644
index 0000000..a759a4c
--- /dev/null
+++ b/src/img/mobile-app-icon.svg
@@ -0,0 +1,13 @@
+
+
+
+ mobile-app-icon
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/img/shortcut-icon.png b/src/img/shortcut-icon.png
new file mode 100644
index 0000000..5af0e00
Binary files /dev/null and b/src/img/shortcut-icon.png differ
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..db6d6e9
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,84 @@
+
+
+
+
+
+ Grommet - User Experience for the Enterprise
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/js/Main.js b/src/js/Main.js
new file mode 100644
index 0000000..56e920f
--- /dev/null
+++ b/src/js/Main.js
@@ -0,0 +1,56 @@
+import React, { Component } from 'react';
+import App from 'grommet/components/App';
+import Box from 'grommet/components/Box';
+import Anchor from 'grommet/components/Anchor';
+import Header from 'grommet/components/Header';
+import Footer from 'grommet/components/Footer';
+import Title from 'grommet/components/Title';
+import Search from 'grommet/components/Search';
+import Sidebar from 'grommet/components/Sidebar';
+import Menu from 'grommet/components/Menu';
+import Button from 'grommet/components/Button';
+import Split from 'grommet/components/Split';
+// import Actions from 'grommet/components/Actions';
+import NavSidebar from './components/NavSidebar';
+import TodoAppDashboard from './components/TodoAppDashboard';
+
+export default class Main extends Component {
+ render () {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+};
diff --git a/src/js/components/CircleDashboard.js b/src/js/components/CircleDashboard.js
new file mode 100644
index 0000000..d4185f4
--- /dev/null
+++ b/src/js/components/CircleDashboard.js
@@ -0,0 +1,68 @@
+import React, { Component } from 'react';
+import Box from 'grommet/components/Box';
+import Heading from 'grommet/components/Heading';
+import Meter from 'grommet/components/Meter';
+import Value from 'grommet/components/Value';
+import Status from 'grommet/components/icons/Status';
+import Label from 'grommet/components/Label';
+import AnnotatedMeter from 'grommet-addons/components/AnnotatedMeter';
+
+export default class CircleDashboard extends Component {
+ constructor () {
+ super();
+ }
+ render () {
+ return (
+
+
+
+ GPU 1
+
+
+
+
+
+ GPU 2
+
+
+
+
+
+ GPU 3
+
+
+
+
+
+ GPU 4
+
+
+
+
+ );
+ }
+}
diff --git a/src/js/components/NavSidebar.js b/src/js/components/NavSidebar.js
new file mode 100644
index 0000000..0684825
--- /dev/null
+++ b/src/js/components/NavSidebar.js
@@ -0,0 +1,36 @@
+import React, { Component } from 'react';
+import Sidebar from 'grommet/components/Sidebar';
+import Header from 'grommet/components/Header';
+import Title from 'grommet/components/Title';
+import Menu from 'grommet/components/Menu';
+import Anchor from 'grommet/components/Anchor';
+
+export default class NavSidebar extends Component {
+ constructor () {
+ super();
+ }
+ render () {
+ return (
+
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+ );
+ }
+}
diff --git a/src/js/components/ProgressDashboard.js b/src/js/components/ProgressDashboard.js
new file mode 100644
index 0000000..7544e8e
--- /dev/null
+++ b/src/js/components/ProgressDashboard.js
@@ -0,0 +1,74 @@
+import React, { Component } from 'react';
+import Box from 'grommet/components/Box';
+import Heading from 'grommet/components/Heading';
+import Meter from 'grommet/components/Meter';
+import Value from 'grommet/components/Value';
+import Status from 'grommet/components/icons/Status';
+import Label from 'grommet/components/Label';
+import List from 'grommet/components/List';
+import ListItem from 'grommet/components/ListItem';
+
+export default class ProgressDashboard extends Component {
+ constructor () {
+ super();
+ }
+ render () {
+ return (
+
+
+
+
+ Task 1
+
+
+
+
+
+
+
+
+
+
+ Task 2
+
+
+
+
+
+
+
+
+
+
+ Task 3
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
diff --git a/src/js/components/TodoAppDashboard.js b/src/js/components/TodoAppDashboard.js
new file mode 100644
index 0000000..88e9b0b
--- /dev/null
+++ b/src/js/components/TodoAppDashboard.js
@@ -0,0 +1,100 @@
+import React, { Component } from 'react';
+import Box from 'grommet/components/Box';
+import Heading from 'grommet/components/Heading';
+import List from 'grommet/components/List';
+import ListItem from 'grommet/components/ListItem';
+import Status from 'grommet/components/icons/Status';
+import CircleDashboard from './CircleDashboard';
+import ProgressDashboard from './ProgressDashboard';
+
+function getLabel(label, count, colorIndex) {
+ return {
+ "label": label,
+ "value": count,
+ "colorIndex": colorIndex
+ };
+}
+
+export default class TodoAppDashboard extends Component {
+
+ constructor () {
+ super();
+ this.state = {
+ tasks: [
+ {
+ status: 'critical',
+ item: 'Pay my rent.'
+ },
+ {
+ status: 'ok',
+ item: 'Walk with my dog this morning.'
+ },
+ {
+ status: 'warning',
+ item: 'San Jose Earthquakes game is tomorrow.'
+ },
+ {
+ status: 'ok',
+ item: 'Review Pull Request #45.'
+ }
+ ]
+ };
+ }
+
+ render () {
+
+ let tasksMap = {
+ critical: 0,
+ ok: 0,
+ warning: 0
+ };
+
+ let tasks = this.state.tasks.map((task, index) => {
+
+ tasksMap[task.status] += 1;
+
+ let separator;
+ if (index === 0) {
+ separator = 'horizontal';
+ }
+ return (
+
+
+
+ {task.item}
+
+
+ );
+ }, this);
+
+ const series = [
+ getLabel('Past Due', tasksMap.critical, 'critical'),
+ getLabel('Due Soon', tasksMap.warning, 'warning'),
+ getLabel('Done', tasksMap.ok, 'ok')
+ ];
+
+ let value, label;
+ if (this.state.index >= 0) {
+ value = series[this.state.index].value;
+ label = series[this.state.index].label;
+ } else {
+ value = 0;
+ series.forEach(serie => value += serie.value);
+ label = 'Total';
+ }
+
+ return (
+
+
+ Memory Usage
+
+
+
+ Running Tasks
+
+
+
+ );
+ }
+};
diff --git a/src/js/index.js b/src/js/index.js
new file mode 100644
index 0000000..d9f8fd9
--- /dev/null
+++ b/src/js/index.js
@@ -0,0 +1,31 @@
+import '../scss/index.scss';
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { AppContainer } from 'react-hot-loader';
+
+import Main from './Main';
+
+const body = (
+
+
+
+);
+
+let element = document.getElementById('content');
+ReactDOM.render(body, element);
+
+document.body.classList.remove('loading');
+
+// Hot Module Replacement API
+if (module.hot) {
+ module.hot.accept('./Main', () => {
+ const NextApp = require('./Main').default;
+ ReactDOM.render(
+
+
+ ,
+ element
+ );
+ });
+}
diff --git a/src/scss/index.scss b/src/scss/index.scss
new file mode 100644
index 0000000..85d86c5
--- /dev/null
+++ b/src/scss/index.scss
@@ -0,0 +1 @@
+@import '~grommet/scss/vanilla/index';
diff --git a/views/layout.jade b/views/layout.jade
deleted file mode 100644
index 33eed61..0000000
--- a/views/layout.jade
+++ /dev/null
@@ -1,28 +0,0 @@
-doctype html
-html
- head
- meta(charset='utf-8')
- meta(http-equiv='x-ua-compatible', content='ie=edge')
- meta(name='viewport', content='width=device-width, initial-scale=1')
- title= title
- link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
- link(rel="stylesheet", href="https://code.getmdl.io/1.3.0/material.blue_grey-deep_orange.min.css")
- script(defer, src="https://code.getmdl.io/1.3.0/material.min.js")
- link(rel='stylesheet', href='/css/normalize.css')
- link(rel='stylesheet', href='/css/flexboxgrid.css')
- link(rel='stylesheet', href='/css/main.css')
- body
- #app!= html
- script.
- window.INITIAL_STATE = !{JSON.stringify(initialState)}
-
- script(src='/js/bundle.js')
-
- // Google Analytics: change UA-XXXXX-X to be your site's ID.
- script.
- (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
- function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
- e=o.createElement(i);r=o.getElementsByTagName(i)[0];
- e.src='https://www.google-analytics.com/analytics.js';
- r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
- ga('create','UA-XXXXX-X','auto');ga('send','pageview');
diff --git a/webpack.config.js b/webpack.config.js
deleted file mode 100644
index 53ec2d0..0000000
--- a/webpack.config.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var path = require('path');
-var webpack = require('webpack');
-
-var config = {
- devtool: 'cheap-module-eval-source-map',
- entry: [
- 'webpack-hot-middleware/client',
- './app/main'
- ],
- output: {
- path: path.join(__dirname, 'public', 'js'),
- filename: 'bundle.js',
- publicPath: '/js'
- },
- plugins: [
- new webpack.HotModuleReplacementPlugin(),
- new webpack.NoErrorsPlugin(),
- new webpack.optimize.OccurenceOrderPlugin(),
- new webpack.DefinePlugin({
- 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
- })
- ],
- module: {
- loaders: [
- {
- test: /\.jsx%/,
- loaders: ['react-hot'],
- include: path.join(__dirname, 'app')
- },
- {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: 'babel-loader',
- query: {
- plugins: [
- ['react-transform', {
- transforms: [
- {
- transform: 'react-transform-hmr',
- imports: ['react'],
- locals: ['module']
- }, {
- transform: 'react-transform-catch-errors',
- imports: ['react', 'redbox-react']
- }
- ]
- }]
- ]
- }
- }
- ]
- }
-};
-
-if (process.env.NODE_ENV === 'production') {
- config.plugins.push(
- new webpack.optimize.UglifyJsPlugin({
- compressor: {
- screw_ie8: true,
- warnings: false
- }
- })
- );
-}
-
-module.exports = config;