[
  {
    "path": ".gitignore",
    "content": "node_modules\nnpm-debug.log\nlib\n.DS_Store\ndist"
  },
  {
    "path": "README.md",
    "content": "# Portfolio Redux App\n\nA Portfolio example of an isomorphic rendering application in React and Redux. [Live Example Here](http://www.callumrimmer.co.uk)\n\n<img src=\"http://g.recordit.co/cO0pqgO8Fo.gif\" width=\"728\" />\n\n## Development Installation\n\nIn the project's directory, run the following commands:\n\n```\n$ npm install\n$ npm start\n```\n\nThen Visit\n\n```\nhttp://localhost:3002\n```\n\n## Releasing to Production\n\nProduction has Devtools, logging and hot reloading middleware removed and the scripts/css compressed. \n\nIn the project's directory, run the following commands:\n\n```\n$ npm run build\n$ npm run start-prod\n```\n\nThen Visit\n\n```\nhttp://localhost:3002\n```\n\n## Other Boilerplate code\n\n[General Redux App (with Undo)](https://github.com/caljrimmer/isomorphic-redux-app)\n\n## Credit\n\nApp template was based on [Lanyon Theme](https://github.com/poole/lanyon) by [mdo](https://github.com/mdo)\n"
  },
  {
    "path": "package.json",
    "content": "\n{\n  \"name\": \"portfolio-redux-app\",\n  \"version\": \"0.0.1\",\n  \"description\": \"A portfolio template built with Redux and React\",\n  \"scripts\": {\n    \"slate\": \"rm -rf node_modules && npm install\",\n    \"clean\": \"rm -rf dist\",\n    \"start\": \"node src/server/index.js --progress --colors --profile\",\n    \"build\": \"npm run clean && NODE_ENV=production webpack -p --progress --colors --profile\",\n    \"postinstall\": \"npm run build\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/caljrimmer/portfolio-redux-app.git\"\n  },\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"express\": \"^4.13.3\",\n    \"react\": \"^0.13.3\",\n    \"react-router\": \"^1.0.0-rc1\",\n    \"redux-router\": \"^1.0.0-beta3\",\n    \"react-redux\": \"^2.1.2\",\n    \"redux\": \"^3.0.0\",\n    \"redux-thunk\": \"^0.1.0\",\n    \"history\": \"1.13.0\",\n    \"classnames\" : \"^2.1.5\",\n    \"axios\" : \"^0.7.0\"\n  },\n  \"devDependencies\": {\n    \"babel\": \"^5.8.21\",\n    \"babel-core\": \"^5.8.22\",\n    \"babel-loader\": \"^5.3.2\",\n    \"redux-devtools\": \"^2.1.5\",\n    \"redux-logger\" : \"^2.0.2\",\n    \"babel-plugin-react-transform\": \"^1.1.0\",\n    \"babel-runtime\": \"^5.8.20\",\n    \"webpack\": \"^1.11.0\",\n    \"style-loader\": \"^0.8.0\",\n    \"css-loader\": \"^0.9.0\",\n    \"url-loader\": \"^0.5.6\",\n    \"file-loader\": \"0.8.5\",\n    \"react-transform-hmr\": \"^1.0.0\",\n    \"webpack-dev-middleware\": \"^1.2.0\",\n    \"webpack-hot-middleware\": \"^2.2.0\",\n    \"merge\":\"^1.2.0\",\n    \"extract-text-webpack-plugin\" : \"^0.8.2\"\n  }\n}\n"
  },
  {
    "path": "src/client/index.js",
    "content": "import 'babel-core/polyfill';\n\nimport React from 'react';\nimport { Router } from 'react-router';\nimport { Provider } from 'react-redux';\nimport { ReduxRouter } from 'redux-router';\n\nimport createBrowserHistory from 'history/lib/createBrowserHistory'\n\nimport configureStore from '../common/store/configureStore';\nimport routes from '../common/routes';\n\nimport \"../../styles/index.css\";\n\nconst history = createBrowserHistory();\nconst initialState = window.__INITIAL_STATE__;\nconst store = configureStore(initialState);\nconst rootElement = document.getElementById('root');\n\nReact.render(\n  <Provider store={store}>\n    {() =>\n        <ReduxRouter>\n          <Router children={routes} history={history} />\n        </ReduxRouter>\n    }\n  </Provider>,\n  document.getElementById('root')\n);\n\nif (process.env.NODE_ENV !== 'production') {\n  require('../server/devtools')(store);\n}\n"
  },
  {
    "path": "src/common/actions/about.js",
    "content": "import request from 'axios';\n\nexport const INVALIDATE_REPOS = 'INVALIDATE_REPOS';\nexport const REPOS_GET = 'REPOS_GET';\nexport const REPOS_GET_REQUEST = 'REPOS_GET_REQUEST';\nexport const REPOS_GET_SUCCESS = 'REPOS_GET_SUCCESS';\nexport const REPOS_GET_FAILURE = 'REPOS_GET_FAILURE';\n\n\nexport function invalidateRepos(repos) {\n  return {\n    type: INVALIDATE_REPOS,\n    repos\n  };\n}\n\nexport function fetchRepos() {\n  return {\n    type: REPOS_GET,\n    promise: request.get(`https://api.github.com/users/caljrimmer/repos`)\n  }\n}\n\nfunction shouldFetchRepos(state) {\n  const repos = state.repos.results;\n  if (!repos.length) {\n    return true;\n  } else if (repos.isFetching) {\n    return false;\n  } else {\n    return repos.didInvalidate;\n  }\n}\n\nexport function fetchReposIfNeeded() {\n  return (dispatch, getState) => {\n    if (shouldFetchRepos(getState())) {\n      return dispatch(fetchRepos());\n    }\n  };\n}"
  },
  {
    "path": "src/common/actions/layout.js",
    "content": "\nexport const TOGGLE_SIDEBAR = 'TOGGLE_SIDEBAR';\n\nexport function toggleSidebar(value) {\n  return {\n    type: TOGGLE_SIDEBAR,\n    value : value\n  };\n}\n\n"
  },
  {
    "path": "src/common/api/fetchComponentDataBeforeRender.js",
    "content": "/**\n* This looks at static needs parameter in components and waits for the promise to be fullfilled\n* It is used to make sure server side rendered pages wait for APIs to resolve before returning res.end()\n*/\n\nexport function fetchComponentDataBeforeRender(dispatch, components, params) {\n  const needs = components.reduce( (prev, current) => {\n    return (current.need || [])\n      .concat((current.WrappedComponent ? current.WrappedComponent.need : []) || [])\n      .concat(prev);\n    }, []);\n    const promises = needs.map(need => dispatch(need()));\n    return Promise.all(promises);\n}"
  },
  {
    "path": "src/common/api/portfolio.js",
    "content": "export function getPortfolio() {\n  return [\n    {\n    \tlink : 'http://www.goldmansachs.com',\n    \ttitle : 'Goldman Sachs',\n    \tclassname : 'goldmans',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'React, Backbone, D3'\n    \t\t},\n    \t\t{\n    \t\t\ttitle : 'Back End Developer',\n    \t\t\tskills : 'Node, MongoDB, Webpack'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.libon.com/',\n    \ttitle : 'Orange (Libon)',\n    \tclassname : 'orange',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'Backbone, WebRTC, FireFoxOS'\n    \t\t},\n    \t\t{\n    \t\t\ttitle : 'Back End Developer',\n    \t\t\tskills : 'Node, MongoDB, Grunt'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.pwul.net',\n    \ttitle : 'Pay What You Like',\n    \tclassname : 'pwul',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'React, Backbone, D3'\n    \t\t},\n    \t\t{\n    \t\t\ttitle : 'Back End Developer',\n    \t\t\tskills : 'Node, MongoDB, Gulp'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.timeout.com/london/card',\n    \ttitle : 'Timeout',\n    \tclassname : 'timeout',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'Backbone, CSS3, HTML5'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.tesco.com/direct',\n    \ttitle : 'Tesco Entertainment',\n    \tclassname : 'tesco',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'Backbone, CSS3, HTML5'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://onlinelibrary.wiley.com',\n    \ttitle : 'John Wiley and Sons',\n    \tclassname : 'wiley',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'Backbone, CSS3, HTML5'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.covestor.com',\n    \ttitle : 'Covestor',\n    \tclassname : 'covestor',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'OO Javascript, CSS3, HTML5'\n    \t\t}\n    \t]\n    },\n    {\n    \tlink : 'http://www.shipserv.com',\n    \ttitle : 'ShipServ',\n    \tclassname : 'shipserv',\n    \troles : [\n    \t\t{\n    \t\t\ttitle : 'Front End Developer',\n    \t\t\tskills : 'OO Javascript, CSS3, HTML5'\n    \t\t}\n    \t]\n    }\n  ]\n}"
  },
  {
    "path": "src/common/api/promiseMiddleware.js",
    "content": "export default function promiseMiddleware() {\n  return next => action => {\n    const { promise, type, ...rest } = action;\n   \n    if (!promise) return next(action);\n   \n    const SUCCESS = type + '_SUCCESS';\n    const REQUEST = type + '_REQUEST';\n    const FAILURE = type + '_FAILURE';\n    next({ ...rest, type: REQUEST });\n    return promise\n      .then(req => {\n        next({ ...rest, req, type: SUCCESS });\n        return true;\n      })\n      .catch(error => {\n        next({ ...rest, error, type: FAILURE });\n        console.log(error);\n        return false;\n      });\n   };\n}"
  },
  {
    "path": "src/common/components/404.js",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'react-router';\n\nclass Error404 extends Component {\n\n  render() {\n    return (\n      \t<div className=\"page\">\n  \t\t\t<h1 className=\"page-title\">404: Page not found</h1>\n\t  \t\t<p className=\"lead\">Sorry, we've misplaced that URL or it's pointing to something that does not exist.</p>\n\t\t\t<p><Link to=\"/home\" className=\"sidebar-nav-item\" activeClassName=\"active\">&gt; Head back home</Link></p>\n\t\t</div>\n    );\n  }\n}\n\nexport default Error404;\n\n"
  },
  {
    "path": "src/common/components/About.js",
    "content": "import React, { Component, PropTypes } from 'react';\nimport { connect } from 'react-redux';\nimport Repos from './about/Repos';\n\nimport Loader from './layout/Loader';\nimport Banner from './layout/Banner';\n\nclass About extends Component {\n  constructor(props) {\n    super(props);\n  }\n\n  componentDidMount() {\n    this.props.fetchReposIfNeeded();\n  }\n\n  render () {\n    const { results, isFetching, lastUpdated, error } = this.props;\n    return (\n      <div>\n\n      \t\t<Banner />\n\n      \t  <div className=\"about\">\n\n      \t  \t<h3>About Me</h3>\n\n      \t  \t<p>I have been developing web sites for over 15 years. Over the years, I have adopted, mastered and moved on from many languages, frameworks and architectures. I currently focus on Javascript heavy web application development.</p> \n\n      \t  \t<p>I created my first start-up in 2004 which raised £30K pounds investment which sold custom built software to companies like News International, NHS and Guardian.</p>\n\n      \t  \t<p>In 2007, I was the CTO of <a href=\"https://en.wikipedia.org/wiki/MyFootballClub\" target=\"_blank\">My Football Club</a>. MyFC crowdsourced over £1.5 Million to buy a British football club. In the following year, we got to Wembley and won the FA Trophy.</p>\n\n      \t  \t<p>Over the years, I have developed web apps for start-ups (<a href=\"http://www.covestor.com\" target=\"_blank\">Covestor</a>, <a href=\"https://www.isubscribe.co.uk\" target=\"_blank\">iSubscribe</a>, <a href=\"http://www.shipserv.com/\" target=\"_blank\">Shipserv</a>), for multi-national bluechip companies (<a href=\"http://www.goldmansachs.com\" target=\"_blank\">Goldman Sachs</a>, <a href=\"http://www.tesco.com\" target=\"_blank\">Tesco</a>, <a href=\"http://www.timeout.com\" target=\"_blank\">Timeout</a>, <a href=\"http://www.wiley.com\" target=\"_blank\">John Wiley and Sons</a>) and created my own companies (<a href=\"http://www.pwul.net\" target=\"_blank\">PWUL</a>, <a href=\"http://www.muffleit.com/\" target=\"_blank\">Muffle</a>, <a href=\"http://pencil.training\" target=\"_blank\">Pencil Training</a>)</p>\n\n      \t  \t<h3>About Site</h3>\n\n      \t  \t<p>This site is a single page web app built with React and Redux. It is Isomorphic (all the code renders on the server and well as the browser) which has the advantage of initially rendering quicker and being indexed by search engines.</p>\n      \t  \t<p>I built the site as a simple example of what can be built with React and Redux. You can get the code base forfrom <a href=\"https://github.com/caljrimmer/portfolio-redux-app\">my github repo</a>.</p>\n      \t  \t<p>Feel free to use this sites code for whatever you want. I hope it inspires you to build something awesome or learn something new</p>\n\n\t      </div>\n\n\t      <div className=\"repos\">\n\t      \t<h3><a href=\"https://github.com/caljrimmer?tab=repositories\" target=\"_blank\">My GitHub</a> Repos</h3>\n\t        {isFetching && results.length === 0 &&\n\t          \t<Loader />\n\t        }\n\t        {!isFetching && error && results.length === 0 &&\n\t          <h3 className=\"post-error\">There has been an Error</h3>\n\t        }\n\t        {!isFetching && !error && results.length === 0 &&\n\t          <h3>Empty</h3>\n\t        }\n\t        {results.length > 0 &&\n\t          <div style={{ opacity: isFetching ? 0.5 : 1 }}>\n\t            <Repos results={results} />\n\t          </div>\n\t        }\n\t      </div>\n\n      </div>\n    );\n  }\n}\n\nAbout.propTypes = {\n  results: PropTypes.array.isRequired,\n  error: PropTypes.object.isRequired,\n  isFetching: PropTypes.bool.isRequired\n};\n\nexport default About;"
  },
  {
    "path": "src/common/components/Home.js",
    "content": "import React, { Component } from 'react';\nimport Banner from './layout/Banner';\n\nclass Home extends Component {\n\n  constructor(props){\n    super(props);\n    this.eventToggleSidebar = this.eventToggleSidebar.bind(this)\n  }\n\n  eventToggleSidebar(e) {\n    e.preventDefault();\n    this.props.toggleSidebar(!this.props.layout.sidebarOpen);\n  }\n\n  render() {\n\n    return (\n\n      \t<div className=\"posts\">\n  \n  \t\t\t<div className=\"post banner\">\n\t\t\t    <h1 className=\"post-title\">I build <em>scalable</em>, <em>maintainable</em> and <em>secure</em> enterprise web applications.</h1>\n    \t\t\t<p>for <em>agencies</em>, <em>bluechips</em>, <em>start-ups</em> and sometimes, <em>myself</em>. <a href=\"#\" onClick={this.eventToggleSidebar}> Find out More</a></p>\n\n\t\t\t</div>\n  \n\t\t  \t<div className=\"post clearfix\">\n\n\t\t\t\t<h2>Technologies I build with:</h2>\n\n\t\t\t\t<div className=\"skill-item clearfix\">\n\t\t\t\t\t<h4>Client Side JS</h4>\n\t\t\t\t\t<ul className=\"\">\n\t\t\t\t\t\t<li><em>Backbone</em></li>\n\t\t\t\t\t\t<li><em><b>*</b><b>*</b>React</em>\n\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t<li><em><b>*</b>Redux</em></li>\n\t\t\t\t\t\t\t\t<li><em>Flux</em></li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li><em>D3</em></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\n\n\t\t\t\t<div className=\"skill-item clearfix\">\n\t\t\t\t\t<h4>Server Side JS</h4>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li><em>MongoDB</em></li>\n\t\t\t\t\t\t<li><em><b>*</b>Node</em>\n\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t<li><em><b>*</b>Express</em></li>\n\t\t\t\t\t\t\t\t<li><em>Hapi</em></li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"skill-item clearfix\">\n\t\t\t\t\t<h4>Testing</h4>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li><em>Jasmine</em></li>\n\t\t\t\t\t\t<li><em>Karma</em></li>\n\t\t\t\t\t\t<li><em>Protractor</em></li>\n\t\t\t\t\t\t<li><em>Jest</em></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"skill-item clearfix\">\n\t\t\t\t\t<h4>Deployment</h4>\n\t\t\t\t\t<ul className=\"clearfix\">\n\t\t\t\t\t\t<li><em><b>*</b>Nginx</em></li>\n\t\t\t\t\t\t<li><em><b>*</b>Webpack</em></li>\n\t\t\t\t\t\t<li><em>Gulp</em></li>\n\t\t\t\t\t\t<li><em>Grunt</em></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"exclaimation\">\n\t\t\t\t\t<em><b>*</b> This site is built with these technologies. View the <a href=\"https://github.com/caljrimmer/portfolio-redux-app\">github repo here</a>.</em><br/>\n\t\t\t\t\t<em><b>**</b> Yep, I know React can be used on the server side too. This site is Isomorphical rendered.</em>\n\t\t\t\t</div>\n\n  \t\t\t</div>\n\n\n  \t\t\t<div className=\"post clearfix\">\n\n\t\t\t\t<h2>Companies I have worked with:</h2>\n\n\t\t\t\t<ul className=\"clients\">\n\t\t\t\t\t<li className=\"goldmans-logo\">Goldman Sachs</li>\n\t\t\t\t\t<li className=\"orange-logo\">Orange</li>\n\t\t\t\t\t<li className=\"tesco-logo\">Tesco</li>\n\t\t\t\t\t<li className=\"timeout-logo\">Timeout</li>\n\t\t\t\t\t<li className=\"wiley-logo\">John Wiley and Sons</li>\n\t\t\t\t\t<li className=\"covestor-logo\">Covestor</li>\n\t\t\t\t\t<li className=\"shipserv-logo\">Shipserv</li>\n\t\t\t\t</ul>\n\n\t\t\t</div>\n\n\t\t\t<Banner />\n\n  \t\t</div>\n  \n    );\n  }\n}\n\nexport default Home;"
  },
  {
    "path": "src/common/components/Portfolio.js",
    "content": "import React, { Component } from 'react';\nimport { getPortfolio } from '../api/portfolio';\nimport classNames from 'classnames';\n\nclass Portfolio extends Component {\n\n  render() {\n\n  \tconst portfolio = getPortfolio();\n\tconst RoleRows = (roles) => {\n\t\treturn roles.map((role) => {\n\t\t\treturn (\n\t\t\t\t<div key={role.title} className=\"role_wrapper clearfix\">\n\t\t\t\t\t<p className=\"role\">Role</p>\n\t\t\t\t\t<p className=\"role_title\">{role.title}<br />\n\t\t\t\t\t<span className=\"role_skills\">{role.skills}</span></p>\n\t\t\t\t</div>\n\t\t\t)\n\t\t});\n\t}\n\n    const PortfolioRows = portfolio.map((row) => {\n    \tconst classname = classNames('portfolio_item','clearfix',row.classname);\n        return (\n            <div key={row.title} className={classname}>\n\t\t\t\t<h2><a href={row.link} target=\"_blank\">(visit site)</a> {row.title}</h2>\n\t\t\t\t{RoleRows(row.roles)}\n\t\t\t</div>\n        )\n    });\n\n    return (\n        <div className=\"posts\">\n        \t{PortfolioRows}\n        </div>\n    );\n\n  }\n}\n\nexport default Portfolio;"
  },
  {
    "path": "src/common/components/Services.js",
    "content": "import React, { Component, PropTypes } from 'react';\nimport Banner from './layout/Banner';\n\n\nclass Services extends Component {\n\n  render () {\n    return (\n      <div>\n\n\t      \t<Banner />\n\n      \t  <div className=\"services\">\n\n      \t  \t<h3>Prototypes/MVPs</h3>\n\n      \t  \t<p>I can build you a prototype or a minimal viable product (MVP)for your idea. An MVP can validate your idea and help you raise funding.\n      \t  \t</p> \n\n      \t  \t<p>The code I deliver will be the best possible foundations from which your application and idea can grow.</p>\n\n\t      \t<h3>Training</h3>\n\n\t      \t<p>I can help you or your employees develop their web development coding skills. I have been teaching code to both beginners and professionals for many years.</p>\n\n\t      \t<p>I have my own training company called <a href=\"http://pencil.training\" target=\"_blank\">Pencil Training</a>. More details can be found <a href=\"http://pencil.training\" target=\"_blank\">here</a>.</p>\n\n\t      </div>\n\n\t      <div className=\"services\">\n\n      \t  \t<h3>Enterprise Web Apps</h3>\n\n      \t  \t<p>Whether you are a Start-up or Bluechip company, I can help you build you a production ready web application.\n      \t  \t</p> \n\n      \t  \t<p>The web application will be built with the best technologies and will be scalable, secure and maintainable.</p>\n\n      \t  \t<h3>Hybridised Development</h3>\n\n      \t  \t<p>Do you need a mobile app and web app with the same code base? I can code your web application so that it utilises Phonegap/Cordova to build both a web application and a cross-device mobile application.</p>\n\n\t      </div>\n\n      </div>\n    );\n  }\n}\n\nexport default Services;"
  },
  {
    "path": "src/common/components/about/Repos.js",
    "content": "import React, { PropTypes, Component } from 'react';\n\nexport default class Repos extends Component {\n  render () {\n    return (\n      <div>\n        {this.props.results.map((repo, i) =>\n          <div className=\"repo-item\" key={i}> \n            <a href={repo.html_url}>{repo.name}</a><br/>\n            {repo.description}\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nRepos.propTypes = {\n  results: PropTypes.array.isRequired\n};"
  },
  {
    "path": "src/common/components/layout/Banner.js",
    "content": "import React, { Component } from 'react';\n\nclass Banner extends Component {\n\n  render() {\n\n    return (\n\t    <div className=\"contact-banner\">\n      \t\t<p>Contact me at <em>callum(at)deadtrendy.co.uk</em> or call <em>07919 411 405</em></p>\n      \t</div>\n    );\n  }\n}\n\nexport default Banner;"
  },
  {
    "path": "src/common/components/layout/Header.js",
    "content": "import React, { Component } from 'react';\n\nclass Header extends Component {\n\n  render() {\n    return (\n    <div className=\"masthead\">\n\t\t\t<div className=\"container\">\n\t\t\t  <h3 className=\"masthead-title\">\n\t\t\t    <a href=\"/\" title=\"Home\">Callum Rimmer</a>\n\t\t\t    <small>Full Stack Web Developer based in London</small>\n\t\t\t  </h3>\n\t\t\t</div>\n\t\t</div>\n    );\n  }\n}\n\nexport default Header;"
  },
  {
    "path": "src/common/components/layout/Loader.js",
    "content": "import React, { Component } from 'react';\n\nclass Loader extends Component {\n\n  render() {\n    return (\n\t    <section className=\"loader\">\n\t\t  <div className=\"ldr\">\n\t\t    <div className=\"ldr-blk\"></div>\n\t\t    <div className=\"ldr-blk an_delay\"></div>\n\t\t    <div className=\"ldr-blk an_delay\"></div>\n\t\t    <div className=\"ldr-blk\"></div>\n\t\t  </div>\n\t\t</section>\n    );\n  }\n}\n\nexport default Loader;"
  },
  {
    "path": "src/common/components/layout/Sidebar.js",
    "content": "import React, { Component } from 'react';\nimport { Link } from 'react-router';\nimport classNames from 'classnames';\n\nclass Sidebar extends Component {\n\n\n  constructor(props){\n\tsuper(props);\n\tthis.eventCloseSidebar = this.eventCloseSidebar.bind(this)\n  }\n\n  eventCloseSidebar (e) {\n  \tthis.props.toggleSidebar(!this.props.layout.sidebarOpen);\n  }\n\n  render() {\n\n    return (\n\n    \t<div className=\"sidebar\">\n\n\t\t  <div className=\"sidebar-item sidebar-footer\">\n\t\t    <p>I built this site with Redux and React. You can get the <a href=\"https://github.com/caljrimmer/portfolio-redux-app\">source code here</a></p>\n\t\t  </div>\n\n\t\t  <nav className=\"sidebar-nav\">\n\t\t    <Link to=\"/home\" className=\"sidebar-nav-item\" onClick={this.eventCloseSidebar} activeClassName=\"active\">Home</Link>\n\t\t    <Link to=\"/portfolio\" className=\"sidebar-nav-item\" onClick={this.eventCloseSidebar} activeClassName=\"active\">My Portfolio</Link>\n\t\t    <Link to=\"/services\" className=\"sidebar-nav-item\" onClick={this.eventCloseSidebar} activeClassName=\"active\">My Services</Link>\n\t\t    <Link to=\"/about\" className=\"sidebar-nav-item\" onClick={this.eventCloseSidebar} activeClassName=\"active\">About</Link>\n\t\t  </nav>\n\n\t\t  <div className=\"sidebar-item sidebar-footer\">\n\n\t\t    <p>\n\t\t\t\tVisit <a href=\"https://github.com/caljrimmer\">My GitHub Repo</a><br/>\n\t\t\t\tVisit <a href=\"https://www.linkedin.com/in/callumrimmer\">My Linkedin</a><br/>\n\t\t\t\tVisit <a href=\"https://twitter.com/caljrimmer\">My Twitter</a><br/>\n\t\t    </p>\n\n\t\t    <p>\n\t\t    \tDesign based on <a href=\"http://lanyon.getpoole.com/\"> Lanyon Theme</a> \n\t\t    </p>\n\n\t\t  </div>\n\n\t\t</div>\n    );\n  }\n}\n\nexport default Sidebar;"
  },
  {
    "path": "src/common/containers/AboutPage.js",
    "content": "import { bindActionCreators } from 'redux';\nimport React, { Component} from 'react';\nimport { connect } from 'react-redux';\nimport About from '../components/About';\nimport * as AboutActions from '../actions/about';\n\n//Data that needs to be called before rendering the component\n//This is used for server side rending via the fetchComponentDataBeforeRending() method\nAbout.need = [\n  AboutActions.fetchRepos\n]\n\nfunction mapStateToProps(state) {\n  const {\n    isFetching,\n    lastUpdated,\n    error,\n    results\n  } = state.repos || {\n    isFetching: true,\n    error:false,\n    results: []\n  };\n  return {\n    isFetching,\n    lastUpdated,\n    error,\n    results\n  };\n}\n\nfunction mapDispatchToProps(dispatch) {\n  return bindActionCreators(AboutActions, dispatch);\n}\n\nexport default connect(mapStateToProps,mapDispatchToProps)(About);"
  },
  {
    "path": "src/common/containers/App.js",
    "content": "import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router';\nimport classNames from 'classnames';\n\nimport * as LayoutActions from '../actions/layout';\n\nimport Home from '../components/Home'\nimport Header from '../components/layout/Header'\nimport Sidebar from '../components/layout/Sidebar'\n\nclass App extends Component {\n\n  constructor(props){\n    super(props);\n    this.eventToggleSidebar = this.eventToggleSidebar.bind(this)\n  }\n\n  eventToggleSidebar(e) {\n    e.preventDefault();\n    this.props.toggleSidebar(!this.props.layout.sidebarOpen);\n  }\n\n  render() {\n\n    const { layout, toggleSidebar } = this.props;\n    const { sidebarOpen } = layout;\n    const layoutClass = classNames({open : sidebarOpen});\n\n    return (\n      <div className={layoutClass}>\n        <Sidebar layout={layout} toggleSidebar={toggleSidebar} />\n  \t    <div className=\"wrap\">\n          <Header />\n          <div className=\"container content\">\n            {!this.props.children && <Home layout={layout} toggleSidebar={toggleSidebar} />}\n            {this.props.children}\n          </div>\n        </div>\n        <label className=\"sidebar-toggle\" onClick={this.eventToggleSidebar}></label>\n      </div>\n    );\n  }\n}\n\nfunction mapStateToProps(state) {\n  return {\n    layout : state.layout\n  };\n}\n\nfunction mapDispatchToProps(dispatch) {\n  return bindActionCreators(LayoutActions,dispatch);\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\n"
  },
  {
    "path": "src/common/containers/HomePage.js",
    "content": "import { bindActionCreators } from 'redux';\nimport React, { Component} from 'react';\nimport { connect } from 'react-redux';\nimport Home from '../components/Home';\nimport * as LayoutActions from '../actions/layout';\n\nfunction mapStateToProps(state) {\n  return {\n    layout : state.layout\n  }\n}\n\nfunction mapDispatchToProps(dispatch) {\n  return bindActionCreators(LayoutActions, dispatch);\n}\n\nexport default connect(mapStateToProps,mapDispatchToProps)(Home);"
  },
  {
    "path": "src/common/reducers/about.js",
    "content": "import {\n  INVALIDATE_REPOS, REPOS_GET_REQUEST, REPOS_GET_SUCCESS, REPOS_GET_FAILURE\n} from '../actions/about';\n\nexport function reposByUser(state = {\n  error: {},\n  isFetching: false,\n  didInvalidate: false,\n  results: []\n}, action) {\n  switch (action.type) {\n    case INVALIDATE_REPOS:\n      return Object.assign({}, state, {\n        didInvalidate: true\n      });\n    case REPOS_GET_REQUEST:\n      return Object.assign({}, state, {\n        isFetching: true,\n        didInvalidate: false,\n      });\n    case REPOS_GET_SUCCESS:\n      let data = [];\n      if(action.req && action.req.data){\n        data = action.req.data.sort((a,b) => {\n          return new Date(b.pushed_at) - new Date(a.pushed_at);\n        });\n      }\n      return Object.assign({}, state, {\n          isFetching: false,\n          results: data,\n          lastUpdated: new Date()\n      });\n    case REPOS_GET_FAILURE:\n      return Object.assign({}, state, {\n        isFetching: false,\n        error : {\n          status: action.error.status,\n          statusText : action.error.statusText\n        }\n      });\n    default:\n      return state;\n  }\n}"
  },
  {
    "path": "src/common/reducers/index.js",
    "content": "import { combineReducers } from 'redux';\nimport { routerStateReducer } from 'redux-router';\n\nimport layout from './layout';\nimport { reposByUser } from './about';\n\nconst rootReducer = combineReducers({\n  layout : layout,\n  repos : reposByUser,\n  router : routerStateReducer\n});\n\nexport default rootReducer;"
  },
  {
    "path": "src/common/reducers/layout.js",
    "content": "import { TOGGLE_SIDEBAR } from '../actions/layout';\n\nexport default function layout(state = {sidebarOpen: false}, action) {\n  switch (action.type) {\n  case TOGGLE_SIDEBAR:\n    return {\n    \tsidebarOpen : action.value\t\n    };\n  default:\n    return state;\n  }\n}"
  },
  {
    "path": "src/common/routes.js",
    "content": "import { Route } from \"react-router\";\nimport React from \"react\";\n\nimport App from \"./containers/App\";\n\n//Redux Smart\nimport AboutPage from \"./containers/AboutPage\";\nimport HomePage from \"./containers/HomePage\";\n\n//Redux Dumb\nimport PortfolioPage from \"./components/Portfolio\";\nimport ServicesPage from \"./components/Services\";\nimport error404 from \"./components/404\";\n\nexport default (\n  <Route name=\"app\" path=\"/\" component={App}>\n      <Route path=\"home\" component={HomePage} />\n      <Route path=\"portfolio\" component={PortfolioPage} />\n      <Route path=\"services\" component={ServicesPage} />\n      <Route path=\"about\" component={AboutPage} />\n      <Route path=\"*\" component={error404}/>\n  </Route>\n);\n"
  },
  {
    "path": "src/common/store/configureStore.js",
    "content": "import { createStore, applyMiddleware, compose } from 'redux';\nimport { devTools } from 'redux-devtools';\nimport { reduxReactRouter } from 'redux-router';\nimport thunk from 'redux-thunk';\nimport createHistory from 'history/lib/createBrowserHistory';\nimport createLogger from 'redux-logger';\nimport promiseMiddleware from '../api/promiseMiddleware';\nimport rootReducer from '../reducers';\n\nconst middlewareBuilder = () => {\n\n  let middleware = {};\n  let universalMiddleware = [thunk,promiseMiddleware];\n  let allComposeElements = [];\n  \n  if(process.browser){\n    if(process.env.NODE_ENV === 'production'){\n      middleware = applyMiddleware(...universalMiddleware);\n      allComposeElements = [\n        middleware,\n        reduxReactRouter({\n          createHistory\n        })\n      ]\n    }else{\n      middleware = applyMiddleware(...universalMiddleware,createLogger());\n      allComposeElements = [\n        middleware,\n        reduxReactRouter({\n          createHistory\n        }),\n        devTools()\n      ]\n    }\n  }else{\n    middleware = applyMiddleware(...universalMiddleware);\n    allComposeElements = [\n      middleware\n    ]\n  }\n\n  return allComposeElements;\n\n}\n\nconst finalCreateStore = compose(...middlewareBuilder())(createStore);\n\nexport default function configureStore(initialState) {\n  const store = finalCreateStore(rootReducer, initialState);\n\n  if (module.hot) {\n    // Enable Webpack hot module replacement for reducers\n    module.hot.accept('../reducers', () => {\n      const nextRootReducer = require('../reducers');\n      store.replaceReducer(nextRootReducer);\n    });\n  }\n\n  return store;\n}\n"
  },
  {
    "path": "src/server/devtools.js",
    "content": "import React from 'react';\nimport { DevTools, DebugPanel, LogMonitor } from 'redux-devtools/lib/react';\n\n/*\n * Puts Redux DevTools into a separate window.\n * Based on https://gist.github.com/tlrobinson/1e63d15d3e5f33410ef7#gistcomment-1560218.\n */\nexport default function createDevToolsWindow(store) {\n  // Give it a name so it reuses the same window\n  const name = 'Redux DevTools';\n  const win = window.open(\n    null,\n    name,\n    'menubar=no,location=no,resizable=yes,scrollbars=no,status=no,width=450,height=600'\n  );\n\n  if (!win) {\n    console.error( // eslint-disable-line no-console\n      'Couldn\\'t open Redux DevTools due to a popup blocker. ' +\n      'Please disable the popup blocker for the current page.'\n    );\n    return;\n  }\n\n  // Reload in case it's reusing the same window with the old content.\n  win.location.reload();\n\n  // Set visible Window title.\n  win.document.title = name;\n\n  // Wait a little bit for it to reload, then render.\n  setTimeout(() => React.render(\n    <DebugPanel top right bottom left>\n      <DevTools store={store} monitor={LogMonitor} />\n    </DebugPanel>,\n    win.document.body.appendChild(document.createElement('div'))\n  ), 10);\n}"
  },
  {
    "path": "src/server/index.js",
    "content": "require('babel/register');\nrequire('./server');"
  },
  {
    "path": "src/server/server.js",
    "content": "import express from 'express';\n\nimport webpack from 'webpack';\nimport webpackConfig from '../../webpack.config';\nimport webpackDevMiddleware from 'webpack-dev-middleware';\nimport webpackHotMiddleware from 'webpack-hot-middleware';\n\nimport React from 'react';\nimport { RoutingContext, match } from 'react-router';\nimport { Provider } from 'react-redux';\nimport createLocation from 'history/lib/createLocation';\nimport { fetchComponentDataBeforeRender } from '../common/api/fetchComponentDataBeforeRender';\n\nimport configureStore from '../common/store/configureStore';\nimport routes from '../common/routes';\nimport packagejson from '../../package.json';\n\nconst app = express();\nconst renderFullPage = (html, initialState) => {\n  return `\n    <!doctype html>\n    <html>\n      <head>\n        <meta charset=\"utf-8\">\n        <title>Full Stack Web Developer based in London</title>\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"/static/app.css\">\n      </head>\n      <body>\n        <div id=\"root\">${html}</div>\n        <script>\n          window.__INITIAL_STATE__ = ${JSON.stringify(initialState)}; \n        </script>\n        <script src=\"/static/bundle.js\"></script>\n      </body>\n    </html>\n  `;\n}\n\nif(process.env.NODE_ENV !== 'production'){\n  const compiler = webpack(webpackConfig);\n  app.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: webpackConfig.output.publicPath }));\n  app.use(webpackHotMiddleware(compiler));\n}else{\n  app.use('/static', express.static(__dirname + '/../../dist'));\n}\n\napp.get('/*', function (req, res) {\n\n  const location = createLocation(req.url);\n\n  match({ routes, location }, (err, redirectLocation, renderProps) => {\n\n    if(err) {\n      console.error(err);\n      return res.status(500).end('Internal server error');\n    }\n\n    if(!renderProps)\n      return res.status(404).end('Not found');\n\n    const store = configureStore();\n\n    const InitialView = (\n      <Provider store={store}>\n        {() =>\n          <RoutingContext {...renderProps} />\n        }\n      </Provider>\n    );\n\n    //This method waits for all render component promises to resolve before returning to browser\n    fetchComponentDataBeforeRender(store.dispatch, renderProps.components, renderProps.params)\n      .then(html => {\n        const componentHTML = React.renderToString(InitialView);\n        const initialState = store.getState();\n        res.status(200).end(renderFullPage(componentHTML,initialState))\n      })\n      .catch(err => {\n        console.log(err)\n        res.end(renderFullPage(\"\",{}))\n      });\n\n  });\n\n});\n\nconst server = app.listen(process.env.PORT || 3002, function () {\n  const host = server.address().address;\n  const port = server.address().port;\n  console.log('Example app listening at http://%s:%s', host, port);\n});\n"
  },
  {
    "path": "src/server/webpack.js",
    "content": "// Webpack dev server\n// Ran in parallel with the Express server\n\nimport WebpackDevServer from \"webpack-dev-server\";\nimport webpack from \"webpack\";\nimport config from \"../../webpack.config.dev\";\n\nvar server = new WebpackDevServer(webpack(config), {\n  // webpack-dev-server options\n  publicPath: config.output.publicPath,\n  hot: true,\n  stats: { colors: true },\n});\nserver.listen(8080, \"localhost\", function() {});\n"
  },
  {
    "path": "styles/about.css",
    "content": ".repos {\n\twidth:46%;\n\tfloat:right;\n}\n\n.about,\n.services {\n\twidth:50%;\n\tfloat:left;\n\tfont-size:16px;}\n\n.repos h3 {\n\tmargin-bottom:20px;\n}\n\n.repo-item {\n\tbackground:#fff;\n\tpadding:10px;\n\tbox-shadow:1px 1px 1px #eaeaea;\n\tborder:1px solid #eaeaea;\n\tmargin-bottom:10px;\n\tfont-size:16px;\n}\n\n@media (max-width: 40em) {\n\t.about,\n\t.repos {\n\t\twidth:100%;\n\t}\n}"
  },
  {
    "path": "styles/base.css",
    "content": "/*\n * Contents\n *\n * Body resets\n * Custom type\n * Messages\n * Container\n * Masthead\n * Posts and pages\n * Pagination\n * Reverse layout\n * Themes\n */\n\n\n/*\n * Body resets\n *\n * Update the foundational and global aspects of the page.\n */\n\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml,\nbody {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 16px;\n  line-height: 1.5;\n}\n@media (min-width: 38em) {\n  html {\n    font-size: 20px;\n  }\n}\n\nbody {\n  color: #515151;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\n/* No `:visited` state is required by default (browsers will use `a`) */\na {\n  color: #1db7a9;\n  text-decoration: none;\n}\na strong {\n  color: inherit;\n}\n/* `:focus` is linked to `:hover` for basic accessibility */\na:hover,\na:focus {\n  text-decoration: underline;\n}\n\n/* Headings */\nh1, h2, h3, h4, h5, h6 {\n  margin-bottom: .5rem;\n  font-weight: bold;\n  line-height: 1.25;\n  color: #313131;\n  text-rendering: optimizeLegibility;\n}\nh1 {\n  font-size: 2.6rem;\n  line-height: 3.6rem;\n}\nh2 {\n  margin-top: 1rem;\n  font-size: 1.5rem;\n}\nh3 {\n  margin-top: 1.5rem;\n  font-size: 1.25rem;\n}\nh4, h5, h6 {\n  margin-top: 1rem;\n  font-size: 1rem;\n}\n\n/* Body text */\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\np em {\n  font-weight:bold;\n  color:#000;\n  font-size:1.2em;\n}\n\nstrong {\n  color: #303030;\n}\n\n\n/* Lists */\nul, ol, dl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-bottom: .5rem;\n}\n\n/* Misc */\nhr {\n  position: relative;\n  margin: 1.5rem 0;\n  border: 0;\n  border-top: 1px solid #eee;\n  border-bottom: 1px solid #fff;\n}\n\nabbr {\n  font-size: 85%;\n  font-weight: bold;\n  color: #555;\n  text-transform: uppercase;\n}\nabbr[title] {\n  cursor: help;\n  border-bottom: 1px dotted #e5e5e5;\n}\n\n/* Code */\ncode,\npre {\n  font-family: Menlo, Monaco, \"Courier New\", monospace;\n}\ncode {\n  padding: .25em .5em;\n  font-size: 85%;\n  color: #bf616a;\n  background-color: #f9f9f9;\n  border-radius: 3px;\n}\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  padding: 1rem;\n  font-size: .8rem;\n  line-height: 1.4;\n  white-space: pre;\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f9f9f9;\n}\npre code {\n  padding: 0;\n  font-size: 100%;\n  color: inherit;\n  background-color: transparent;\n}\n\n/* Pygments via Jekyll */\n.highlight {\n  margin-bottom: 1rem;\n  border-radius: 4px;\n}\n.highlight pre {\n  margin-bottom: 0;\n}\n\n/* Gist via GitHub Pages */\n.gist .gist-file {\n  font-family: Menlo, Monaco, \"Courier New\", monospace !important;\n}\n.gist .markdown-body {\n  padding: 15px;\n}\n.gist pre {\n  padding: 0;\n  background-color: transparent;\n}\n.gist .gist-file .gist-data {\n  font-size: .8rem !important;\n  line-height: 1.4;\n}\n.gist code {\n  padding: 0;\n  color: inherit;\n  background-color: transparent;\n  border-radius: 0;\n}\n\n/* Quotes */\nblockquote {\n  padding: .5rem 1rem;\n  margin: .8rem 0;\n  color: #7a7a7a;\n  border-left: .25rem solid #e5e5e5;\n}\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n@media (min-width: 30em) {\n  blockquote {\n    padding-right: 5rem;\n    padding-left: 1.25rem;\n  }\n}\n\nimg {\n  display: block;\n  max-width: 100%;\n  margin: 0 0 1rem;\n  border-radius: 5px;\n}\n\n/* Tables */\ntable {\n  margin-bottom: 1rem;\n  width: 100%;\n  border: 1px solid #e5e5e5;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: .25rem .5rem;\n  border: 1px solid #e5e5e5;\n}\ntbody tr:nth-child(odd) td,\ntbody tr:nth-child(odd) th {\n  background-color: #f9f9f9;\n}\n\n\n/*\n * Custom type\n *\n * Extend paragraphs with `.lead` for larger introductory text.\n */\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n\n/*\n * Messages\n *\n * Show alert messages to users. You may add it to single elements like a `<p>`,\n * or to a parent if there are multiple elements to show.\n */\n\n.message {\n  margin-bottom: 1rem;\n  padding: 1rem;\n  color: #717171;\n  background-color: #f9f9f9;\n}\n\n\n/*\n * Container\n *\n * Center the page content.\n */\n\n.container {\n  max-width: 38rem;\n  padding-left:  1rem;\n  padding-right: 1rem;\n  margin-left:  auto;\n  margin-right: auto;\n}\n\n\n/*\n * Masthead\n *\n * Super small header above the content for site name and short description.\n */\n\n.masthead {\n  padding-top:    1rem;\n  padding-bottom: 1rem;\n  margin-bottom: 3rem;\n}\n.masthead-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  color: #505050;\n}\n.masthead-title a {\n  color: #505050;\n}\n.masthead-title small {\n  font-size: 75%;\n  font-weight: 400;\n  color: #c0c0c0;\n  letter-spacing: 0;\n}\n\n\n/*\n * Posts and pages\n *\n * Each post is wrapped in `.post` and is used on default and post layouts. Each\n * page is wrapped in `.page` and is only used on the page layout.\n */\n\n.page,\n.post {\n  margin-bottom: 4em;\n}\n\n/* Blog post or page title */\n.page-title,\n.post-title,\n.post-title a {\n  color: #303030;\n}\n.page-title,\n.post-title {\n  margin-top: 0;\n}\n\n/* Meta data line below post title */\n.post-date {\n  display: block;\n  margin-top: -.5rem;\n  margin-bottom: 1rem;\n  color: #9a9a9a;\n}\n\n/* Related posts */\n.related {\n  padding-top: 2rem;\n  padding-bottom: 2rem;\n  border-top: 1px solid #eee;\n}\n.related-posts {\n  padding-left: 0;\n  list-style: none;\n}\n.related-posts h3 {\n  margin-top: 0;\n}\n.related-posts li small {\n  font-size: 75%;\n  color: #999;\n}\n.related-posts li a:hover {\n  color: #268bd2;\n  text-decoration: none;\n}\n.related-posts li a:hover small {\n  color: inherit;\n}\n\n\n/*\n * Pagination\n *\n * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when\n * there are no more previous or next posts to show.\n */\n\n.pagination {\n  overflow: hidden; /* clearfix */\n  margin-left: -1rem;\n  margin-right: -1rem;\n  font-family: \"PT Sans\", Helvetica, Arial, sans-serif;\n  color: #ccc;\n  text-align: center;\n}\n\n/* Pagination items can be `span`s or `a`s */\n.pagination-item {\n  display: block;\n  padding: 1rem;\n  border: 1px solid #eee;\n}\n.pagination-item:first-child {\n  margin-bottom: -1px;\n}\n\n/* Only provide a hover state for linked pagination items */\na.pagination-item:hover {\n  background-color: #f5f5f5;\n}\n\n@media (min-width: 30em) {\n  .pagination {\n    margin: 3rem 0;\n  }\n  .pagination-item {\n    float: left;\n    width: 50%;\n  }\n  .pagination-item:first-child {\n    margin-bottom: 0;\n    border-top-left-radius:    4px;\n    border-bottom-left-radius: 4px;\n  }\n  .pagination-item:last-child {\n    margin-left: -1px;\n    border-top-right-radius:    4px;\n    border-bottom-right-radius: 4px;\n  }\n}\n\n.clearfix:after {\n   visibility: hidden;\n   display: block;\n   font-size: 0;\n   content: \" \";\n   clear: both;\n   height: 0;\n }\n     \n.clearfix { display: inline-block; }\n/* start commented backslash hack \\*/\n* html .clearfix { height: 1%; }\n.clearfix { display: block; }\n/* close commented backslash hack */"
  },
  {
    "path": "styles/custom.css",
    "content": ".sidebar-item p b {\n   color:#fff;\n}\n\n/**\n* Loader\n*/\n\n@keyframes pulse {\n  0%   { opacity: 1; }\n  100% { opacity: 0; }\n}\n\nbody {\n  margin: 0;\n}\n\n.loader {\n  display: flex;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n}\n\n.ldr {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  justify-content: space-around;\n  align-items: center;\n  margin: 50px auto 50px;\n  width: 2.5em;\n  height: 2.5em;\n}\n\n.ldr-blk {\n  height: 35%;\n  width: 35%;\n  animation: pulse 0.75s ease-in infinite alternate;\n  background-color: #1db7a9;\n}\n\n.an_delay {\n  animation-delay: 0.75s;\n}\n\n/**\n* Clients on Home Page\n*/\n\nul.clients {\n   margin:0;\n   padding:0;\n}\n\nul.clients li {\n   list-style:none;\n   float:left;\n   margin:1em 1.6em 1em 0em;\n   height:70px;\n   text-indent:-5000px;\n   box-shadow:1px 1px 1px #ccc;\n}\n\nul.clients li.goldmans-logo {\n   background: url('assets/goldmans-logo.jpg') no-repeat;\n   width:124px;\n}\n\nul.clients li.orange-logo {\n   background: url('assets/orange-logo.jpg') no-repeat;\n   width:70px;\n}\n\nul.clients li.tesco-logo {\n   background: url('assets/tesco-logo.jpg') no-repeat;\n   width:181px;\n}\n\nul.clients li.timeout-logo {\n   background: url('assets/timeout-logo.jpg') no-repeat;\n   width:151px;\n}\n\nul.clients li.wiley-logo {\n   background: url('assets/wiley-logo.jpg') no-repeat;\n   width:169px;\n}\n\nul.clients li.covestor-logo {\n   background: url('assets/covestor-logo.jpg') no-repeat;\n   width:218px;\n}\n\nul.clients li.shipserv-logo {\n   background: url('assets/shipserv-logo.jpg') no-repeat;\n   width:218px;\n}\n\n/**\n* Skill Boxes on Home Page\n*/\n\n.skill-item {\n   float:left;\n   margin: 0 3.5em 2em 0;\n   font-size:0.8em;\n}\n\n.skill-item h4 {\n   font-size:20px;\n   font-weight:bold;\n}\n\n.posts em b {\n   font-weight:bold;\n   margin-right:5px;\n   margin-left:-5px;\n   text-shadow:1px 1px 1px #666;\n}\n\n.skill-item ul{\n   list-style:none;\n   padding-left:0;\n   font-size:16px;\n}\n\n.skill-item ul li {\n   display:inline-block;\n   float:left;\n   clear:both;\n}\n\n.skill-item ul ul {\n   padding-left:2em;\n}\n\n.skill-item ul li em {\n   background: #1db7a9;\n   display:inline-block;\n   float:left;\n   color:#fff;\n   padding:0.2em 1em 0.2em;\n   margin:0.2em;\n   clear:both; \n   font-style:normal; \n   box-shadow:1px 1px 1px #ccc;\n}\n\n.skill-item ul ul li em {\n   background: #d9ead3;\n   color: #1db7a9;\n}\n\n.exclaimation {\n   clear:both;\n   font-size:14px;\n}\n\n/**\n* Banner\n*/\n\n.contact-banner {\n  background:#1db7a9;\n  color:#d9ead3;\n  text-align:center;\n}\n\n.contact-banner p {\n  padding:20px;\n}\n\n.contact-banner p em {\n    color:#fff;\n    font-weight:bold;\n    font-style:normal;\n}\n"
  },
  {
    "path": "styles/index.css",
    "content": "@import 'https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700%7CPT+Sans:400';\n@import 'base.css';\n@import 'portfolio.css';\n@import 'about.css';\n@import 'services.css';\n@import 'layout.css';\n@import 'custom.css';"
  },
  {
    "path": "styles/layout.css",
    "content": "/*\n * Contents\n *\n * Global resets\n * Masthead\n * Sidebar\n * Slide effect\n * Posts and pages\n * Pagination\n * Reverse layout\n * Themes\n */\n\n\n/*\n * Global resets\n *\n * Update the foundational and global aspects of the page.\n */\n\n/* Prevent scroll on narrow devices */\nhtml,\nbody {\n  overflow-x: hidden;\n}\n\nhtml {\n  font-family: \"PT Sans\",Helvetica,Arial,sans-serif;\n  background:#fafafa;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-family: \"PT Sans\", Helvetica, Arial, sans-serif;\n  font-weight: 400;\n  color: #313131;\n  letter-spacing: -.025rem;\n}\n\n\n/*\n * Wrapper\n *\n * The wrapper is used to position site content when the sidebar is toggled. We\n * use an outter wrap to position the sidebar without interferring with the\n * regular page content.\n */\n\n.wrap {\n  position: relative;\n  width: 100%;\n}\n\n\n/*\n * Container\n *\n * Center the page content.\n */\n\n.container {\n  max-width: 28rem;\n}\n@media (min-width: 38em) {\n  .container {\n    max-width: 32rem;\n  }\n}\n@media (min-width: 56em) {\n  .container {\n    max-width: 38rem;\n  }\n}\n\n\n/*\n * Masthead\n *\n * Super small header above the content for site name and short description.\n */\n\n.masthead {\n  padding-top:    1rem;\n  padding-bottom: 1rem;\n  margin-bottom: 3rem;\n  border-bottom: 1px solid #eee;\n  background:#fff;\n}\n.masthead-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  color: #505050;\n}\n.masthead-title a {\n  color: #505050;\n  font-weight:bold;\n}\n.masthead-title small {\n  font-size: 75%;\n  font-weight: 400;\n  color: #c0c0c0;\n  letter-spacing: 0;\n  margin-left:0.6em;\n}\n\n@media (max-width: 48em) {\n  .masthead-title {\n    text-align: center;\n  }\n  .masthead-title small {\n    display: none;\n  }\n}\n\n\n/*\n * Sidebar\n *\n * The sidebar is the drawer, the item we are toggling with our handy hamburger\n * button in the corner of the page.\n *\n * This particular sidebar implementation was inspired by Chris Coyier's\n * \"Offcanvas Menu with CSS Target\" article, and the checkbox variation from the\n * comments by a reader. It modifies both implementations to continue using the\n * checkbox (no change in URL means no polluted browser history), but this uses\n * `position` for the menu to avoid some potential content reflow issues.\n *\n * Source: http://css-tricks.com/off-canvas-menu-with-css-target/#comment-207504\n */\n\n/* Style and \"hide\" the sidebar */\n.sidebar {\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  left: -14rem;\n  width: 14rem;\n  visibility: hidden;\n  overflow-y: auto;\n  font-family: \"PT Sans\", Helvetica, Arial, sans-serif;\n  font-size: .875rem; /* 15px */\n  color: rgba(255,255,255,.6);\n  background-color: #202020;\n  -webkit-transition: all .3s ease-in-out;\n          transition: all .3s ease-in-out;\n}\n@media (min-width: 30em) {\n  .sidebar {\n    font-size: .75rem; /* 14px */\n  }\n}\n\n/* Sidebar content */\n.sidebar a {\n  font-weight: normal;\n  color: #fff;\n}\n.sidebar-item {\n  padding: 1rem;\n}\n.sidebar-item p:last-child {\n  margin-bottom: 0;\n}\n\n/* Sidebar nav */\n.sidebar-nav {\n  border-bottom: 1px solid rgba(255,255,255,.1);\n}\n.sidebar-nav-item {\n  display: block;\n  padding: .5rem 1rem;\n  border-top: 1px solid rgba(255,255,255,.1);\n}\n.sidebar-nav-item.active,\na.sidebar-nav-item:hover,\na.sidebar-nav-item:focus {\n  text-decoration: none;\n  background-color: rgba(255,255,255,.1);\n  border-color: transparent;\n}\n\n.sidebar-nav-item span.nav-note {\n  text-transform:uppercase;\n  font-size:0.6em;\n  opacity:0.5;\n}\n\n@media (min-width: 48em) {\n  .sidebar-item {\n    padding: 1.5rem;\n  }\n  .sidebar-nav-item {\n    padding-left:  1.5rem;\n    padding-right: 1.5rem;\n  }\n}\n\n/* Style the `label` that we use to target the `.sidebar-checkbox` */\n.sidebar-toggle {\n  position: absolute;\n  top:  .8rem;\n  left: 1rem;\n  display: block;\n  padding: .25rem .75rem;\n  color: #505050;\n  background-color: #fff;\n  border-radius: .25rem;\n  cursor: pointer;\n}\n\n.sidebar-toggle:before {\n  display: inline-block;\n  width: 1rem;\n  height: .75rem;\n  content: \"\";\n  background-image: -webkit-linear-gradient(to bottom, #555, #555 20%, #fff 20%, #fff 40%, #555 40%, #555 60%, #fff 60%, #fff 80%, #555 80%, #555 100%);\n  background-image:    -moz-linear-gradient(to bottom, #555, #555 20%, #fff 20%, #fff 40%, #555 40%, #555 60%, #fff 60%, #fff 80%, #555 80%, #555 100%);\n  background-image:     -ms-linear-gradient(to bottom, #555, #555 20%, #fff 20%, #fff 40%, #555 40%, #555 60%, #fff 60%, #fff 80%, #555 80%, #555 100%);\n  background-image:         linear-gradient(to bottom, #555, #555 20%, #fff 20%, #fff 40%, #555 40%, #555 60%, #fff 60%, #fff 80%, #555 80%, #555 100%);\n}\n\n.open .sidebar-toggle:active,\n.open .sidebar-toggle,\n.open .sidebar-toggle {\n  color: #fff;\n  background-color: #555;\n}\n\n.open .sidebar-toggle:active:before,\n.open .sidebar-toggle:before,\n.open .sidebar-toggle:before {\n  background-image: -webkit-linear-gradient(to bottom, #fff, #fff 20%, #555 20%, #555 40%, #fff 40%, #fff 60%, #555 60%, #555 80%, #fff 80%, #fff 100%);\n  background-image:    -moz-linear-gradient(to bottom, #fff, #fff 20%, #555 20%, #555 40%, #fff 40%, #fff 60%, #555 60%, #555 80%, #fff 80%, #fff 100%);\n  background-image:     -ms-linear-gradient(to bottom, #fff, #fff 20%, #555 20%, #555 40%, #fff 40%, #fff 60%, #555 60%, #555 80%, #fff 80%, #fff 100%);\n  background-image:         linear-gradient(to bottom, #fff, #fff 20%, #555 20%, #555 40%, #fff 40%, #fff 60%, #555 60%, #555 80%, #fff 80%, #fff 100%);\n}\n\n@media (min-width: 30.1em) {\n  .sidebar-toggle {\n    position: fixed;\n  }\n}\n\n@media print {\n  .sidebar-toggle {\n    display: none;\n  }\n}\n\n/* Slide effect\n *\n * Handle the sliding effects of the sidebar and content in one spot, seperate\n * from the default styles.\n *\n * As an a heads up, we don't use `transform: translate3d()` here because when\n * mixed with `position: fixed;` for the sidebar toggle, it creates a new\n * containing block. Put simply, the fixed sidebar toggle behaves like\n * `position: absolute;` when transformed.\n *\n * Read more about it at http://meyerweb.com/eric/thoughts/2011/09/12/.\n */\n\n.wrap,\n.sidebar,\n.sidebar-toggle {\n  -webkit-backface-visibility: hidden;\n      -ms-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n.wrap,\n.sidebar-toggle {\n  -webkit-transition: -webkit-transform .3s ease-in-out;\n          transition: transform .3s ease-in-out;\n}\n\n.open .sidebar-toggle,\n.open .sidebar,\n.open .wrap{\n  z-index: 10;\n  visibility: visible;\n  -webkit-transform: translateX(14rem);\n      -ms-transform: translateX(14rem);\n          transform: translateX(14rem);  \n}\n\n.sidebar-footer a{\n  color: #1db7a9;\n  opacity: 0.8;\n  border-bottom:1px dotted #1db7a9;\n  margin-right:1em;\n}\n\n.sidebar-footer a:hover {\n  opacity:1;\n  text-decoration:none;\n}\n\n\n/*\n * Posts and pages\n *\n * Each post is wrapped in `.post` and is used on default and post layouts. Each\n * page is wrapped in `.page` and is only used on the page layout.\n */\n\n.page,\n.post {\n  margin-bottom: 4em;\n}\n\n.banner {\n  margin-top:4em;\n  margin-bottom: 6em;\n}\n\n.banner a {\n  border-bottom: 1px dotted #1db7a9;\n  text-decoration:none;\n}\n\n.banner a:hover,\n.banner a:active\n.banner a:visited {\n  border-bottom: 2px dotted #1db7a9;\n}\n\n/* Blog post or page title */\n.page-title,\n.post-title,\n.post-title a {\n  color: #303030;\n}\n.page-title,\n.post-title {\n  margin-top: 0;\n}\n\n.post-title em {\n  background:#d9ead3;\n  color:#1db7a9;\n  padding:0em 0.3em 0em;\n  margin:0.1em;\n  font-style:normal;\n}\n\n/* Meta data line below post title */\n.post-date {\n  display: block;\n  margin-top: -.5rem;\n  margin-bottom: 1rem;\n  color: #9a9a9a;\n}\n\n/* Related posts */\n.related {\n  padding-top: 2rem;\n  padding-bottom: 2rem;\n  border-top: 1px solid #eee;\n}\n.related-posts {\n  padding-left: 0;\n  list-style: none;\n}\n.related-posts h3 {\n  margin-top: 0;\n}\n.related-posts li small {\n  font-size: 75%;\n  color: #999;\n}\n.related-posts li a:hover {\n  color: #1db7a9;\n  text-decoration: none;\n}\n.related-posts li a:hover small {\n  color: inherit;\n}\n\n\n/*\n * Pagination\n *\n * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when\n * there are no more previous or next posts to show.\n */\n\n.pagination {\n  overflow: hidden; /* clearfix */\n  margin-left: -1rem;\n  margin-right: -1rem;\n  font-family: \"PT Sans\", Helvetica, Arial, sans-serif;\n  color: #ccc;\n  text-align: center;\n}\n\n/* Pagination items can be `span`s or `a`s */\n.pagination-item {\n  display: block;\n  padding: 1rem;\n  border: 1px solid #eee;\n}\n.pagination-item:first-child {\n  margin-bottom: -1px;\n}\n\n/* Only provide a hover state for linked pagination items */\na.pagination-item:hover {\n  background-color: #f5f5f5;\n}\n\n@media (min-width: 30em) {\n  .pagination {\n    margin: 3rem 0;\n  }\n  .pagination-item {\n    float: left;\n    width: 50%;\n  }\n  .pagination-item:first-child {\n    margin-bottom: 0;\n    border-top-left-radius:    4px;\n    border-bottom-left-radius: 4px;\n  }\n  .pagination-item:last-child {\n    margin-left: -1px;\n    border-top-right-radius:    4px;\n    border-bottom-right-radius: 4px;\n  }\n}\n\n\n/*\n * Reverse layout\n *\n * Flip the orientation of the page by placing the `.sidebar` and sidebar toggle\n * on the right side.\n */\n\n.layout-reverse .sidebar {\n  left: auto;\n  right: -14rem;\n}\n.layout-reverse .sidebar-toggle {\n  left: auto;\n  right: 1rem;\n}\n\n.layout-reverse #sidebar-checkbox:checked ~ .sidebar,\n.layout-reverse #sidebar-checkbox:checked ~ .wrap,\n.layout-reverse #sidebar-checkbox:checked ~ .sidebar-toggle {\n  -webkit-transform: translateX(-14rem);\n      -ms-transform: translateX(-14rem);\n          transform: translateX(-14rem);\n}\n\n\n/*\n * Themes\n *\n * Apply custom color schemes by adding the appropriate class to the `body`.\n * Based on colors from Base16: http://chriskempson.github.io/base16/#default.\n */\n\n/* Red */\n.theme-base-08 .sidebar,\n.theme-base-08 .sidebar-toggle:active,\n.theme-base-08 #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #ac4142;\n}\n.theme-base-08 .container a,\n.theme-base-08 .sidebar-toggle,\n.theme-base-08 .related-posts li a:hover {\n  color: #ac4142;\n}\n\n/* Orange */\n.theme-base-09 .sidebar,\n.theme-base-09 .sidebar-toggle:active,\n.theme-base-09 #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #d28445;\n}\n.theme-base-09 .container a,\n.theme-base-09 .sidebar-toggle,\n.theme-base-09 .related-posts li a:hover {\n  color: #d28445;\n}\n\n/* Yellow */\n.theme-base-0a .sidebar,\n.theme-base-0a .sidebar-toggle:active,\n.theme-base-0a #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #f4bf75;\n}\n.theme-base-0a .container a,\n.theme-base-0a .sidebar-toggle,\n.theme-base-0a .related-posts li a:hover {\n  color: #f4bf75;\n}\n\n/* Green */\n.theme-base-0b .sidebar,\n.theme-base-0b .sidebar-toggle:active,\n.theme-base-0b #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #90a959;\n}\n.theme-base-0b .container a,\n.theme-base-0b .sidebar-toggle,\n.theme-base-0b .related-posts li a:hover {\n  color: #90a959;\n}\n\n/* Cyan */\n.theme-base-0c .sidebar,\n.theme-base-0c .sidebar-toggle:active,\n.theme-base-0c #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #75b5aa;\n}\n.theme-base-0c .container a,\n.theme-base-0c .sidebar-toggle,\n.theme-base-0c .related-posts li a:hover {\n  color: #75b5aa;\n}\n\n/* Blue */\n.theme-base-0d .sidebar,\n.theme-base-0d .sidebar-toggle:active,\n.theme-base-0d #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #6a9fb5;\n}\n.theme-base-0d .container a,\n.theme-base-0d .sidebar-toggle,\n.theme-base-0d .related-posts li a:hover {\n  color: #6a9fb5;\n}\n\n/* Magenta */\n.theme-base-0e .sidebar,\n.theme-base-0e .sidebar-toggle:active,\n.theme-base-0e #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #aa759f;\n}\n.theme-base-0e .container a,\n.theme-base-0e .sidebar-toggle,\n.theme-base-0e .related-posts li a:hover {\n  color: #aa759f;\n}\n\n/* Brown */\n.theme-base-0f .sidebar,\n.theme-base-0f .sidebar-toggle:active,\n.theme-base-0f #sidebar-checkbox:checked ~ .sidebar-toggle {\n  background-color: #8f5536;\n}\n.theme-base-0f .container a,\n.theme-base-0f .sidebar-toggle,\n.theme-base-0f .related-posts li a:hover {\n  color: #8f5536;\n}\n\n\n/*\n * Overlay sidebar\n *\n * Make the sidebar content overlay the viewport content instead of pushing it\n * aside when toggled.\n */\n\n.sidebar-overlay #sidebar-checkbox:checked ~ .wrap {\n  -webkit-transform: translateX(0);\n      -ms-transform: translateX(0);\n          transform: translateX(0);\n}\n.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar-toggle {\n  box-shadow: 0 0 0 .25rem #fff;\n}\n.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar {\n  box-shadow: .25rem 0 .5rem rgba(0,0,0,.1);\n}\n\n/* Only one tweak for a reverse layout */\n.layout-reverse.sidebar-overlay #sidebar-checkbox:checked ~ .sidebar {\n  box-shadow: -.25rem 0 .5rem rgba(0,0,0,.1);\n}"
  },
  {
    "path": "styles/portfolio.css",
    "content": "/**\n* Layout styles\n*/\n\n.portfolio_item {\n\tleft: right;\n    margin: 0 0 20px 0;\n    padding:20px 20px 0 20px;\n    box-shadow:1px 2px 2px #eaeaea;\n    border:1px solid #eaeaea;\n}\n\n.portfolio_item h2 {\n    font-size: 24px;\n    margin: 20px 0 20px 0;\n    text-align: right;\n    padding-top: 250px;\n    text-transform:uppercase;\n    font-weight:bold;\n}\n\n.portfolio_item h2 a {\n    font-size: 14px;\n    text-decoration: none;\n    font-weight: bold;\n}\n\n.portfolio_item .role_wrapper {\n    border-bottom: 1px dotted #ccc;\n    position: relative;\n    margin-bottom:20px;\n}\n\n.portfolio_item .role {\n    float: left;\n    color: #1db7a9;\n    font-size: 30px;\n    font-weight: bold;\n    text-transform:uppercase;\n    margin: 16px 10px 10px 10px;\n    opacity:0.5;\n}\n\n.portfolio_item .role_title {\n    float: right;\n    font-size: 22px;\n    font-weight: bold;\n    margin: 10px;\n    color: #1db7a9;\n    line-height: 24px;\n    text-align: right;\n}\n\n.portfolio_item span.role_skills {\n    font-size: 18px;\n    color: #a6a6a6;\n}\n\n/**\n* Individual\n*/\n\n.goldmans {\n\tbackground:#fff url(assets/goldmans.jpg) top no-repeat;\n}\n\n.orange {\n\tbackground:#fff url(assets/orange.jpg) top no-repeat;\n}\n\n.tesco {\n\tbackground:#fff url(assets/tesco.png) top no-repeat;\n}\n\n.timeout {\n\tbackground:#fff url(assets/timeout.png) top no-repeat;\n}\n\n.wiley {\n\tbackground:#fff url(assets/wiley.png) top no-repeat;\n}\n\n.hellas {\n\tbackground:#fff url(assets/hellas.png) top no-repeat;\n}\n\n.shipserv {\n\tbackground:#fff url(assets/shipserv.png) top no-repeat;\n}\n\n.covestor {\n\tbackground:#fff url(assets/covestor.png) top no-repeat;\n}\n\n.pwul {\n\tbackground:#fff url(assets/pwul.jpg) top no-repeat;\n}"
  },
  {
    "path": "styles/services.css",
    "content": ".services {\n\twidth:46%;\n\tfloat:left;\n\tfont-size:16px;\n}\n\n.services:last-child{\n\tfloat:right;\n}\n\n@media (max-width: 40em) {\n\t.services {\n\t\twidth:100%;\n\t}\n}"
  },
  {
    "path": "webpack.config.js",
    "content": "var path = require('path');\nvar webpack = require('webpack');\nvar merge = require('merge');\nvar ExtractTextPlugin = require('extract-text-webpack-plugin');\n\nvar webpackConfig = {\n  output: {\n    path: path.join(__dirname, 'dist'),\n    filename: 'bundle.js',\n    publicPath: '/static/'\n  },\n  plugins: [\n    new webpack.optimize.OccurenceOrderPlugin(),\n    new webpack.NoErrorsPlugin()\n  ]\n};\n\nif (process.env.NODE_ENV === 'production') {\n\n  webpackConfig = merge(webpackConfig,{\n    devtool: \"source-map\",\n    entry : [\n      './src/client/index.js'\n    ],\n    module: {\n      loaders: [{\n        test: /\\.js$/,\n        loader: 'babel',\n        exclude: /node_modules/,\n        include: __dirname\n      },\n      { test: /\\.(png|jpg|gif|jpeg)$/, loader: 'url-loader?limit=8192'},\n      { test: /\\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader?sourceMap') }\n    ]},\n    plugins : [\n      new webpack.DefinePlugin({\n        'process.env': {\n          NODE_ENV: JSON.stringify('production')\n        }\n      }),\n      new ExtractTextPlugin(\"app.css\"),\n      new webpack.optimize.UglifyJsPlugin({minimize: true})\n    ]  \n  });\n\n}else{\n\n  webpackConfig = merge(webpackConfig,{\n    devtool: 'inline-source-map',\n    module: {\n      loaders: [{\n        test: /\\.js$/,\n        loader: 'babel',\n        exclude: /node_modules/,\n        include: __dirname,\n        query: {\n          optional: ['runtime'],\n          stage: 2,\n          env: {\n            development: {\n              plugins: [\n                'react-transform'\n              ],\n              extra: {\n                'react-transform': {\n                  transforms: [{\n                    transform:  'react-transform-hmr',\n                    imports: ['react'],\n                    locals:  ['module']\n                  }]\n                }\n              }\n            }\n          }\n        }\n      },\n      { test: /\\.(png|jpg|gif|jpeg)$/, loader: 'url-loader?limit=8192'},\n      { test: /\\.css$/, loader: 'style-loader!css-loader' }\n    ]},\n    entry : [\n      'webpack-hot-middleware/client',\n      './src/client/index.js'\n    ],\n    plugins : [\n      new webpack.HotModuleReplacementPlugin()\n    ]  \n  });\n  \n}\n\nmodule.exports = webpackConfig;"
  }
]