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 ( -
-

404

-

Page Not Found

-
- ); -}; - -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 ( + + +
+ + GRADIENT + + + + +
+ + + + +
+

+ Build your ideas with Grommet! +

+
+
+
+ ); + } +}; 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 ( + + + + + + + + + + + + + + + + + + + ); + } +} 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 ( + +
+ + Machines + +
+ + + 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;