From 6930a4ca19206e40ab2a9c2445254b72b8992c98 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Mon, 22 Aug 2016 23:21:31 -0500 Subject: [PATCH 01/43] Just adding dependencis to packages.json and some common package description key/value pairs --- package.json | 126 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 111 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 35f20b6..fbc2754 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,113 @@ { - "name": "fantasy-football-snake", - "version": "0.0.1", - "private": true, - "author": "Chris Pounds", - "scripts": { - "start": "node app.js" - }, - "dependencies": { - "bluebird": "^2.10.2", - "body-parser": "^1.15.2", - "express": "^4.14.0", - "moment": "^2.14.1", - "mysql": "^2.11.1", - "promise-mysql": "^1.3.2" - } + "name": "fantasy-football-snake", + "version": "0.0.1", + "private": true, + "author": "Chris Pounds", + "description": "Tool for optimizing your fantasy football drafts", + "main": "./app.js", + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "bluebird": "^2.10.2", + "body-parser": "^1.15.2", + "colors": "1.1.2", + "connect-flash": "^0.1.1", + "connect-redis": "3.0.2", + "express": "^4.14.0", + "express-extras": "0.3.1", + "express-session": "1.13.0", + "getconfig": "2.2.0", + "moment": "^2.14.1", + "mysql": "^2.11.1", + "promise-mysql": "^1.3.2", + "swig": "1.4.2", + + "babel-polyfill": "6.13.0", + "bootstrap": "3.3.6", + "bootstrap-sass": "3.3.6", + "classnames": "2.2.4", + "es5-shim": "4.5.2", + "gulp-sass": "2.3.1", + "gulp-watch": "4.3.9", + "history": "2.0.0", + "immutable": "3.8.1", + "isomorphic-fetch": "2.2.1", + "lodash": "4.15.0", + "moment": "2.14.1", + "react": "15.3.1", + "react-addons-css-transition-group": "15.3.1", + "react-addons-transition-group": "15.3.1", + "react-dom": "15.3.1", + "react-immutable-proptypes": "2.1.0", + "react-redux": "4.4.5", + "react-router": "2.7.0", + "react-router-redux": "4.0.5", + "redux": "3.5.2", + "redux-logger": "2.6.1", + "redux-thunk": "2.1.0" + }, + "devDependencies": { + "babelify": "7.3.0", + "babel-core": "6.13.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-transform-class-properties": "6.11.5", + "babel-plugin-transform-es2015-block-scoping": "6.10.1", + "babel-plugin-transform-es2015-classes": "6.9.0", + "babel-plugin-transform-proto-to-assign": "6.9.0", + "babel-preset-es2015": "6.13.1", + "babel-preset-react": "6.11.1", + "babel-preset-stage-0": "6.5.0", + "browserify": "13.1.0", + "browserify-shim": "3.8.12", + "del": "2.2.0", + "gulp": "^3.9.0", + "gulp-bower": "0.0.11", + "gulp-rename": "1.2.2", + "gulp-sass": "^2.1.1", + "gulp-sourcemaps": "1.6.0", + "gulp-uglify": "1.5.1", + "gulp-uglifycss": "1.0.6", + "gulp-watch": "^4.3.5", + "gulp-replace": "^0.5.4", + "redux-devtools": "3.2.0", + "redux-devtools-log-monitor": "1.0.11", + "redux-devtools-dock-monitor": "1.1.1", + "through2": "^2.0.1", + "vinyl-source-stream": "1.1.0", + "vinyl-buffer": "1.0.0" + }, + "keywords": [ + "Fantasy Football", + "NFL", + "NFL", + "Draft", + "Winning" + ], + "contributors": [ + { + "name": "Chris Pounds", + "email": "Chrislbs@gmail.com" + }, + { + "name": "Corey Pauley", + "email": "cpauleyrun@gmail.com" + } + ], + "jshintConfig": { + "esnext": true + }, + "browserify": { + "transform": [ + "browserify-shim" + ] + }, + "browserify-shim": { + "modernizr": { + "exports": "modernizr" + }, + "fastclick": { + "exports": "fastclick" + } + } } From c59a7db5fb40c249b1497b8323db17bfd9879d37 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Mon, 22 Aug 2016 23:32:27 -0500 Subject: [PATCH 02/43] Just some .gitignore additions that exclude transformed JS and CSS (and files created by VIM >.<) --- .gitignore | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.gitignore b/.gitignore index 1d739ce..c5eeff5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,17 @@ node_modules # npm cache directory .npm +# Vim +*.swp +*.swo + +# Python +*.pyc + +# Bundled JS +public/js/bundle.js +public/js/bundle.min.js +public/js/bundle.min.js.map + +# CSS +public/css/**/*.css From e33741d77f41e5ad9b4bf9b59164f362bafc09ad Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:04:10 -0500 Subject: [PATCH 03/43] Added express setup code for serving static files and a base.html. (Also added semicolons for linters :P) --- app.js | 56 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/app.js b/app.js index d5225a9..1e68118 100644 --- a/app.js +++ b/app.js @@ -1,20 +1,31 @@ -const express = require('express'); -const bodyParser = require('body-parser'); -const data = require('./libs/data'); -const players = require('./libs/data/players'); -const app = express(); -const port = 8080; +'use strict'; + +var express = require('express'), + bodyParser = require('body-parser'), + data = require('./libs/data'), + players = require('./libs/data/players'), + swig = require('swig'), + app = express(), + port = 8080; app.use((request, response, next) => { //console.log(request.headers); - next() + next(); }); +// Body parsing middleware app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({extended: true, limit: '50mb'})); -app.get('/', (request, response) => { - response.send('Hello from Express!'); -}); +// Swig Templating Setup +app.engine('html', swig.renderFile); +app.set('view engine', 'html'); +app.set('views', __dirname + '/views'); +app.set('view cache', false); +swig.setDefaults({cache: false}); + +// Setup static file server for images, html, css/fonts, and js +app.use('/public', express.static('public')); app.get('/users', function(request, response) { @@ -23,7 +34,7 @@ app.get('/users', function(request, response) { response.send(users); }) .catch(function(err) { - console.log(err) + console.log(err); response.status(500).send(err); }); }); @@ -34,11 +45,11 @@ app.post('/users', function(request, response) { console.log(user); data.createUser(user) .then(function() { - console.log(arguments) + console.log(arguments); response.send(`${user.username} created`); }) .catch(function(err) { - console.log(err) + console.log(err); response.status(500).send(err); }); }); @@ -67,31 +78,36 @@ app.get('/players', function(request, response) { app.get('/players/:id', function(request, response) { players.findPlayer(request.params.id) .then((player) => { - if (player == null) { + if (player === null) { response.status(404).send(); } else { response.send(player); } }) - .catch((err) => response.status(500).send(err)) + .catch((err) => response.status(500).send(err)); }); app.delete('/players/:id', function(request, response) { players.deletePlayer(request.params.id) .then(() => response.status(204).send()) - .catch((err) => response.status(500).send(err)) + .catch((err) => response.status(500).send(err)); +}); + +// Default route if no match was found for the url +app.all('/*', function (req, res) { + res.render('base', {}); }); -app.use((err, request, response, next) => { +app.use((err, request, response) => { console.log(err); - response.status(500).send('Something broke!') + response.status(500).send('Something broke!'); }); app.listen(port, (err) => { if (err) { - return console.log('something bad happened', err) + return console.log('something bad happened', err); } - console.log(`server is listening on ${port}`) + console.log(`server is listening on ${port}`); }); From 5583f02cd447e0f86b8887a014c1959889dd6061 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:12:12 -0500 Subject: [PATCH 04/43] Added gulpfile with task definitions for building SCSS, transforming ES7/JSX code to valid ES5 and bundling CSS/JS --- assets/scss/_mixins.scss | 89 +++ assets/scss/_variables.scss | 929 ++++++++++++++++++++++++++++ assets/scss/nav.scss | 61 ++ assets/scss/site.scss | 241 ++++++++ gulpfile.js | 130 ++++ public/img/spinner.gif | Bin 0 -> 86025 bytes public/js/lib/babel-polyfill.min.js | 2 + views/base.html | 78 +++ 8 files changed, 1530 insertions(+) create mode 100644 assets/scss/_mixins.scss create mode 100644 assets/scss/_variables.scss create mode 100644 assets/scss/nav.scss create mode 100644 assets/scss/site.scss create mode 100644 gulpfile.js create mode 100644 public/img/spinner.gif create mode 100644 public/js/lib/babel-polyfill.min.js create mode 100644 views/base.html diff --git a/assets/scss/_mixins.scss b/assets/scss/_mixins.scss new file mode 100644 index 0000000..c2586e6 --- /dev/null +++ b/assets/scss/_mixins.scss @@ -0,0 +1,89 @@ +@mixin border-radius($radius) { + -webkit-border-radius: $radius; + border-radius: $radius; + background-clip: padding-box; /* stops bg color from leaking outside the border: */ +} + +// Single side border-radius + +@mixin border-top-radius($radius) { + -webkit-border-top-right-radius: $radius; + border-top-right-radius: $radius; + -webkit-border-top-left-radius: $radius; + border-top-left-radius: $radius; + background-clip: padding-box; +} + +@mixin border-right-radius($radius) { + -webkit-border-bottom-right-radius: $radius; + border-bottom-right-radius: $radius; + -webkit-border-top-right-radius: $radius; + border-top-right-radius: $radius; + background-clip: padding-box; +} + +@mixin border-bottom-radius($radius) { + -webkit-border-bottom-right-radius: $radius; + border-bottom-right-radius: $radius; + -webkit-border-bottom-left-radius: $radius; + border-bottom-left-radius: $radius; + background-clip: padding-box; +} + +@mixin border-left-radius($radius) { + -webkit-border-bottom-left-radius: $radius; + border-bottom-left-radius: $radius; + -webkit-border-top-left-radius: $radius; + border-top-left-radius: $radius; + background-clip: padding-box; +} + +@mixin border-top-left-radius($radius) { + -webkit-border-top-left-radius: $radius; + border-top-left-radius: $radius; + background-clip: padding-box; +} + +@mixin border-top-right-radius($radius) { + -webkit-border-top-right-radius: $radius; + border-top-right-radius: $radius; + background-clip: padding-box; +} + +@mixin border-bottom-left-radius($radius) { + -webkit-border-bottom-left-radius: $radius; + border-bottom-left-radius: $radius; + background-clip: padding-box; +} + +@mixin border-bottom-right-radius($radius) { + -webkit-border-bottom-right-radius: $radius; + border-bottom-right-radius: $radius; + background-clip: padding-box; +} + +@mixin opacity($opacity) { + opacity: $opacity; + $opacity-ie: $opacity * 100; + filter: alpha(opacity=$opacity-ie); //IE8 +} + +@mixin text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@mixin transition($args...) { + -webkit-transition: $args; + -moz-transition: $args; + -ms-transition: $args; + -o-transition: $args; + transition: $args; +} + +@mixin box-shadow($args...) { + -webkit-box-shadow: $args; + -moz-box-shadow: $args; + box-shadow: $args; +} diff --git a/assets/scss/_variables.scss b/assets/scss/_variables.scss new file mode 100644 index 0000000..c54b801 --- /dev/null +++ b/assets/scss/_variables.scss @@ -0,0 +1,929 @@ +$bootstrap-sass-asset-helper: false !default; +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #090909 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #2c2c2c +$gray-dark: lighten($gray-base, 20%) !default; // #3d3d3d +$gray: lighten($gray-base, 33.5%) !default; // #5f5f5f +$gray-light: lighten($gray-base, 46.7%) !default; // #818181 +$gray-lighter: lighten($gray-base, 58%) !default; // #9e9e9e +$gray-lightest: lighten($gray-base, 93.5%) !default; // #f9f9f9 +$soft-gray: #cccccc !default; + +$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7 +$brand-success: #2ca02c !default; +$brand-info: #aec7e8 !default; +$brand-warning: #ffbb78 !default; +$brand-danger: #d62728 !default; + +$danger-color: #a94442 !default; +$danger-bg-color: #f2dede !default; +$danger-border-color: #ebccd1 !default; + +$info-color: #31708f !default; +$info-bg-color: #d9edf7 !default; +$info-border-color: #bce8f1 !default; + +$white: #ffffff !default; +$off-white: #fefefe !default; +$highlight: #E5F2FF !default; +$soft-highlight: #F0F8FF !default; +$table-section-bg: #E9EAEC !default; + +$data-blue: #1f77b4 !default; +$data-light-blue: #aec7e8 !default; +$data-orange: #ff7f0e !default; +$data-light-orange: #ffbb78 !default; +$data-green: #2ca02c !default; +$data-light-green: #98df8a !default; +$data-yellow: #bcbd22 !default; +$data-light-yellow: #dbdb8d !default; +$data-soft-yellow: #fcf8e3 !default; +$data-purple: #9467bd !default; +$data-light-purple: #c5b0d5 !default; +$data-red: #d62728 !default; +$data-light-red: #ff9896 !default; +$data-soft-red: #e7969c !default; +$data-pink: #f7b6d2 !default; +$data-brown: #8c564b !default; +$data-light-brown: #c49c94 !default; + +//## SimpleLTC responsive breakpoints +$custom-screen-xxs: 1024px !default; +$custom-screen-xs: 1280px !default; +$custom-screen-s: 1366px !default; +$custom-screen-m: 1440px !default; +$custom-screen-l: 1536px !default; +$custom-screen-xl: 1600px !default; +$custom-screen-xxl: 1920px !default; + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: $off-white !default; +//** Global text color on ``. +$text-color: $gray-dark !default; + +//** Global textual link color. +$link-color: $brand-primary !default; +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%) !default; +//** Link hover decoration. +$link-hover-decoration: underline !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
`.
+$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base:        $font-family-sans-serif !default;
+
+$font-size-base:          14px !default;
+$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
+
+$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5:            $font-size-base !default;
+$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base:        1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
+
+//** By default, this inherits from the ``.
+$headings-font-family:    inherit !default;
+$headings-font-weight:    500 !default;
+$headings-line-height:    1.1 !default;
+$headings-color:          inherit !default;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
+$icon-font-path: "/public/fonts/";
+
+//** File name for all font files.
+$icon-font-name:          "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical:     6px !default;
+$padding-base-horizontal:   12px !default;
+
+$padding-large-vertical:    10px !default;
+$padding-large-horizontal:  16px !default;
+
+$padding-small-vertical:    5px !default;
+$padding-small-horizontal:  10px !default;
+
+$padding-xs-vertical:       1px !default;
+$padding-xs-horizontal:     5px !default;
+
+$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small:         1.5 !default;
+
+$border-radius-base:        4px !default;
+$border-radius-large:       6px !default;
+$border-radius-small:       3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color:    #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg:       $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base:          4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large:         5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+$table-cell-padding:            8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding:  5px !default;
+
+//** Default background color used for all tables.
+$table-bg:                      transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent:               #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover:                #f5f5f5 !default;
+$table-bg-active:               $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color:            #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight:                normal !default;
+
+$btn-default-color:              #333 !default;
+$btn-default-bg:                 #fff !default;
+$btn-default-border:             #ccc !default;
+
+$btn-primary-color:              #fff !default;
+$btn-primary-bg:                 $brand-primary !default;
+$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
+
+$btn-success-color:              #fff !default;
+$btn-success-bg:                 $brand-success !default;
+$btn-success-border:             darken($btn-success-bg, 5%) !default;
+
+$btn-info-color:                 #fff !default;
+$btn-info-bg:                    $brand-info !default;
+$btn-info-border:                darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color:              #fff !default;
+$btn-warning-bg:                 $brand-warning !default;
+$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color:               #fff !default;
+$btn-danger-bg:                  $brand-danger !default;
+$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color:        $gray-light !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base:         $border-radius-base !default;
+$btn-border-radius-large:        $border-radius-large !default;
+$btn-border-radius-small:        $border-radius-small !default;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+$input-bg:                       #fff !default;
+//** `` background color
+$input-bg-disabled:              $gray-lightest !default;
+
+//** Text color for ``s
+$input-color:                    $gray !default;
+//** `` border color
+$input-border:                   #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on ``s in CSS.
+$input-border-radius:            $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large:      $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small:      $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus:             #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder:        #999 !default;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom:       15px !default;
+
+$legend-color:                   $gray-dark !default;
+$legend-border-color:            #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-lightest !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled:                not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color:           #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1060 !default;
+$zindex-tooltip:           1070 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal-background:  1040 !default;
+$zindex-modal:             1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs:                  480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min:              $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm:                  1280px !default;
+$screen-sm-min:              $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet:              768px !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md:                  1440px !default;
+$screen-md-min:              $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg:                  1600px !default;
+$screen-lg-min:              $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     768px !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             $border-radius-base !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #777 !default;
+$navbar-default-bg:                #f8f8f8 !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #777 !default;
+$navbar-default-link-hover-color:          #333 !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #555 !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lightest !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+//== Dashboard Left Nav
+$nav-bg-color:                #f2f2f2 !default;
+$nav-border-color:            #ededed !default;
+$nav-hover-bg-color:          #e2e2e2 !default;
+$nav-label-color:             #A8A8AA !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lightest !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lightest !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              30px !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   $gray-lightest !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #3c763d !default;
+$state-success-bg:               #dff0d8 !default;
+$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text:                #31708f !default;
+$state-info-bg:                  #d9edf7 !default;
+$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text:             #8a6d3b !default;
+$state-warning-bg:               #fcf8e3 !default;
+$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text:              #a94442 !default;
+$state-danger-bg:                #f2dede !default;
+$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  #000 !default;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-light !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color:   $modal-header-border-color !default;
+
+$modal-lg:                    900px !default;
+$modal-md:                    600px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               15px !default;
+$alert-border-radius:         $border-radius-base !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius:      $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color:      $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg:         $gray-lightest !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-hover-color:   $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          15px !default;
+$panel-heading-padding:       10px 15px !default;
+$panel-footer-padding:        $panel-heading-padding !default;
+$panel-border-radius:         $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          #ddd !default;
+$panel-footer-bg:             #f5f5f5 !default;
+
+$panel-default-text:          $gray-dark !default;
+$panel-default-border:        #ddd !default;
+$panel-default-heading-bg:    #f5f5f5 !default;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $state-info-border !default;
+$panel-info-heading-bg:       $state-info-bg !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color:              #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lightest !default;
+//** Page header border color
+$page-header-border-color:    $gray-lightest !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Horizontal line color.
+$hr-border:                   $gray-lightest !default;
+
+//== Calendars
+//
+//##
+
+$calendar-header-bg-color:    #e2e2e2 !default;
+$calendar-day-bg-color:       #f2f2f2 !default;
+$calendar-day-hover-bg-color: #e2e2e2 !default;
+$calendar-today-bg-color:     #fcf8e3 !default;
diff --git a/assets/scss/nav.scss b/assets/scss/nav.scss
new file mode 100644
index 0000000..1961870
--- /dev/null
+++ b/assets/scss/nav.scss
@@ -0,0 +1,61 @@
+@import "variables";
+
+.app-nav, .main-content {
+    display: table-cell;
+    border-left: 1px solid $nav-border-color;
+}
+
+.app-nav {
+	width: 82px;
+    background: $nav-bg-color;
+    text-align: center;
+	vertical-align: top;
+	padding-top: 35px;
+    position: relative;
+    z-index: 1001;
+
+    .nav {
+        position: fixed;
+        width: 82px;
+        z-index: 1000;
+
+        & > li {
+            &:hover, &:focus {
+                & > a {
+                    color: $data-blue;
+                    background-color: $nav-hover-bg-color;
+                }
+            }
+
+            & > a {
+                color: $nav-label-color;
+                font-size: 0.89em;
+                padding: 15px 0 12px 0;
+
+                &.active {
+                    color: $data-blue;
+                    background: $body-bg;
+                }
+
+                .caret {
+                    font-size: 0.8em;
+                }
+            }
+
+            .dropdown-menu {
+                a {
+                    font-size: 1.2em;
+                }
+            }
+
+            .glyphicon, .icon {
+                font-size: 2em;
+            }
+
+            .nav-label {
+                font-size: 0.89em;
+                font-weight: bold;
+            }
+        }
+    }
+}
diff --git a/assets/scss/site.scss b/assets/scss/site.scss
new file mode 100644
index 0000000..c5ea7df
--- /dev/null
+++ b/assets/scss/site.scss
@@ -0,0 +1,241 @@
+@import "variables";
+@import "bootstrap";
+@import "mixins";
+
+html, body {
+    height: 100%;
+    width: 100%;
+    background: $off-white;
+}
+
+body {
+    /* Fix for outline around elements when they are active */
+    *:active {
+        outline: none;
+    }
+
+    a {
+        color: $gray-dark;
+        text-decoration: none;
+
+        &:hover {
+            color: $gray-dark;
+            text-decoration: none;
+        }
+
+        &:active {
+            color: $gray-dark;
+            text-decoration: none;
+        }
+
+        &:focus {
+            outline: none;
+            color: $gray-dark;
+            text-decoration: none;
+        }
+    }
+}
+
+// Reset to make drop downs appear on hover
+.dropdown:hover > .dropdown-menu {
+    display: block;
+}
+
+.dropdown-menu {
+    @include transition(all 2s linear);
+
+    &.right {
+        top: 15px;
+        left: 88%;
+
+        li {
+            .dropdown-menu.right {
+                top: -4px;
+                left: 99%;
+            }
+        }
+        .caret {
+            position: absolute;
+            right: 10%;
+            top: 48%;
+            transform: rotate(-90deg);
+        }
+    }
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+    text-decoration: none;
+    color: $white;
+    background-color: $data-blue !important;
+    background-image: none !important;
+}
+
+.row {
+    &.no-gutter {
+        margin-left: 0;
+        margin-right: 0;
+
+        [class*="col-"] {
+            &:not(:first-child), &:not(:last-child) {
+                padding-right: 0;
+                padding-left: 0;
+            }
+        }
+    }
+}
+
+.loading-wrapper {
+    .loading-spinner {
+        position: fixed;
+        top: 50%;
+        left: 50%;
+        margin-left: -54px;
+        margin-top: -54px;
+        width: 108px;
+        height: 108px;
+        z-index: 9000;
+    }
+}
+
+.page-wrapper {
+    position: relative;
+
+    .loading-fade-wrapper {
+        position: relative;
+        background: $off-white;
+
+        &.loading {
+            @include opacity(0.5);
+        }
+    }
+
+    .loading-spinner {
+        position: fixed;
+        top: 50%;
+        left: 50%;
+        width: 108px;
+        height: 108px;
+        margin-left: -54px;
+        margin-top: -54px;
+        z-index: 2;
+    }
+}
+
+.table {
+    background: $white;
+}
+
+.navbar {
+    margin-bottom: 0;
+}
+
+#react-root {
+    height: 100%;
+    width: 100%;
+}
+
+.app-wrapper {
+    position: relative;
+    width: 100%;
+    height: 100%;
+
+    > .alert-backdrop {
+        position: fixed;
+        z-index: 9999;
+        width: 100%;
+        height: 100%;
+        background: $modal-backdrop-bg;
+        @include opacity(0.5);
+    }
+
+    > .app-alert {
+        position: fixed;
+        z-index: 9999;
+        top: 50%;
+        left: 50%;
+        width: 30%;
+        min-width: 450px;
+        padding-bottom: 48px;
+
+        .close {
+            position: absolute;
+            top: 13px;
+            right: 13px;
+
+            &:active {
+                top: 14px;
+                right: 12px;
+            }
+        }
+
+        h3 {
+            margin: 0;
+
+            .glyphicon {
+                vertical-align: top;
+                margin-right: 10px;
+            }
+        }
+
+        .error-report-form {
+            margin-top: 15px;
+
+            textarea {
+                width: 100%;
+                height: 150px;
+            }
+        }
+
+        .actions {
+            position: absolute;
+            bottom: 15px;
+            left: 0;
+            width: 100%;
+            padding: 0 15px;
+            height: 33px;
+
+            .left {
+                float: left;
+                margin-right: 10px;
+            }
+
+            .right {
+                float: right;
+                margin-left: 10px;
+            }
+        }
+    }
+
+    &.error {
+        .content-wrapper {
+            pointer-events: none;
+        }
+    }
+}
+
+.content-wrapper {
+    display: table;
+    table-layout: fixed;
+    height: 100%;
+    width: 100%;
+}
+
+.main-content {
+    width: 100%;
+    height: 100%;
+
+    .main-content-gutter {
+        margin: 102px auto 0 auto;
+
+        @media (min-width: $custom-screen-s) {
+            margin: 112px auto 0 auto;
+        }
+
+        @media (min-width: $custom-screen-l) {
+            margin: 119px auto 0 auto;
+        }
+    }
+}
+
+@import "nav";
diff --git a/gulpfile.js b/gulpfile.js
new file mode 100644
index 0000000..1df8d63
--- /dev/null
+++ b/gulpfile.js
@@ -0,0 +1,130 @@
+'use strict';
+
+var gulp = require('gulp'),
+    through = require('through2'),
+    sass = require('gulp-sass'),
+    browserify = require('browserify'),
+    buffer = require('vinyl-buffer'),
+    source = require('vinyl-source-stream'),
+    sourcemaps = require('gulp-sourcemaps'),
+	uglify = require('gulp-uglify'),
+    uglifycss = require('gulp-uglifycss'),
+	rename = require('gulp-rename'),
+    babelify = require('babelify'),
+    dirs = {
+        i: {
+            node: __dirname + '/node_modules',
+            sass: __dirname + '/assets/styles',
+            js: __dirname + '/assets/js'
+        },
+        o: {
+            css: __dirname + '/public/css',
+            js: __dirname + '/public/js',
+            test: __dirname + '/test'
+        }
+    },
+    removePropTypes = function () {
+        var propTypesRegex = /\s*\/\/\s\{\{\{\s(PropTypes|delete)(.*\s*)*?\s*\/\/\s\}\}\}/g;
+
+        return through(function (buf, enc, next) {
+            this.push(buf.toString('utf8').replace(propTypesRegex, ''));
+            next();
+        });
+    };
+
+require('gulp-watch');
+
+gulp.task('sass-only', function () {
+    return gulp.src([
+        dirs.i.sass + '/*.scss',
+        dirs.i.sass + '/**/*.scss'
+    ])
+    .pipe(sass({
+        includePaths: [
+            dirs.i.sass,
+            dirs.i.node + '/bootstrap-sass/assets/stylesheets'
+        ]
+    }))
+    .pipe(uglifycss({
+        'uglyComments': true
+    }))
+    .pipe(gulp.dest(dirs.o.css));
+});
+
+gulp.task('sass', function () {
+    return gulp.src([
+        dirs.i.sass + '/*.scss',
+        dirs.i.sass + '/**/*.scss'
+    ])
+    .pipe(sass({
+        includePaths: [
+            dirs.i.sass,
+            dirs.i.node + '/bootstrap-sass/assets/stylesheets'
+        ]
+    }))
+    .pipe(uglifycss({
+        'uglyComments': true
+    }))
+    .pipe(gulp.dest(dirs.o.css));
+});
+
+gulp.task('build-dev', function () {
+    return browserify({
+        entries: dirs.i.js + '/dev-index.jsx',
+        extensions: ['.jsx'],
+        basedir: dirs.i.js,
+        paths: [dirs.i.node, dirs.i.js],
+        transform: [removePropTypes],
+        debug: true
+    })
+    .transform(babelify.configure({
+        'presets': [dirs.i.node + '/babel-preset-es2015', dirs.i.node + '/babel-preset-stage-0', dirs.i.node + '/babel-preset-react'],
+        'plugins': [
+            'transform-class-properties',
+            'transform-es2015-block-scoping',
+            ['transform-es2015-classes', {loose: true}],
+            'transform-proto-to-assign'
+        ]
+    }))
+    .bundle()
+    .pipe(source('bundle.js'))
+    .pipe(gulp.dest(dirs.o.js));
+});
+
+gulp.task('build-prod', function () {
+    return browserify({
+        entries: dirs.i.js + '/prod-index.jsx',
+        extensions: ['.jsx'],
+        basedir: dirs.i.js,
+        paths: [dirs.i.node, dirs.i.js],
+        transform: [removePropTypes],
+        debug: true
+    })
+    .transform(babelify.configure({
+        'presets': [dirs.i.node + '/babel-preset-es2015', dirs.i.node + '/babel-preset-stage-0', dirs.i.node + '/babel-preset-react'],
+        'plugins': [
+            'transform-class-properties',
+            'transform-es2015-block-scoping',
+            ['transform-es2015-classes', {loose: true}],
+            'transform-proto-to-assign'
+        ]
+    }))
+    .bundle()
+    .pipe(source('bundle.js'))
+    .pipe(buffer())
+    .pipe(sourcemaps.init({loadMaps: true}))
+    .pipe(uglify({ mangle: true, compress: { drop_console: true }}))
+    .pipe(rename('bundle.min.js'))
+    .pipe(sourcemaps.write('./'))
+    .pipe(gulp.dest(dirs.o.js));
+});
+
+gulp.task('watch', ['sass', 'build-dev'], function () {
+    gulp.watch([dirs.i.sass + '/*.scss', dirs.i.sass + '/**/*.scss'], ['sass-only']);
+    gulp.watch([dirs.i.js + '/*.jsx', dirs.i.js + '/**/*.jsx'], ['build-dev']);
+});
+
+gulp.task('default', ['sass', 'build-dev']);
+gulp.task('dev', ['sass', 'build-dev', 'watch']);
+gulp.task('prod', ['sass', 'build-prod']);
+gulp.task('all', ['sass', 'build-dev', 'build-prod']);
diff --git a/public/img/spinner.gif b/public/img/spinner.gif
new file mode 100644
index 0000000000000000000000000000000000000000..fa91475f757b0e0945a3629db8468733dac11a6a
GIT binary patch
literal 86025
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

)H76e)6PndbS`zhd2zBx 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 literal 0 HcmV?d00001 diff --git a/public/js/lib/babel-polyfill.min.js b/public/js/lib/babel-polyfill.min.js new file mode 100644 index 0000000..c7af30a --- /dev/null +++ b/public/js/lib/babel-polyfill.min.js @@ -0,0 +1,2 @@ +!function e(t,n,r){function s(i,u){if(!n[i]){if(!t[i]){var c="function"==typeof require&&require;if(!u&&c)return c(i,!0);if(o)return o(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var f=n[i]={exports:{}};t[i][0].call(f.exports,function(n){var e=t[i][1][n];return s(e?e:n)},f,f.exports,e,t,n,r)}return n[i].exports}for(var o="function"==typeof require&&require,i=0;i2?s[2]:void 0,l=Math.min((void 0===f?u:o(f,u))-a,u-c),h=1;for(c>a&&a+l>c&&(h=-1,a+=l-1,c+=l-1);l-- >0;)a in e?e[c]=e[a]:delete e[c],c+=h,a+=h;return e}},{77:77,80:80,81:81}],7:[function(t,n,e){"use strict";var r=t(81),o=t(77),i=t(80);n.exports=[].fill||function fill(t){for(var n=r(this,!0),e=i(n.length),u=arguments,c=u.length,a=o(c>1?u[1]:void 0,e),s=c>2?u[2]:void 0,f=void 0===s?e:o(s,e);f>a;)n[a++]=t;return n}},{77:77,80:80,81:81}],8:[function(t,n,e){var r=t(79),o=t(80),i=t(77);n.exports=function(t){return function(n,e,u){var c,a=r(n),s=o(a.length),f=i(u,s);if(t&&e!=e){for(;s>f;)if(c=a[f++],c!=c)return!0}else for(;s>f;f++)if((t||f in a)&&a[f]===e)return t||f;return!t&&-1}}},{77:77,79:79,80:80}],9:[function(t,n,e){var r=t(18),o=t(35),i=t(81),u=t(80),c=t(10);n.exports=function(t){var n=1==t,e=2==t,a=3==t,s=4==t,f=6==t,l=5==t||f;return function(h,p,v){for(var g,y,d=i(h),m=o(d),x=r(p,v,3),S=u(m.length),b=0,w=n?c(h,S):e?c(h,0):void 0;S>b;b++)if((l||b in m)&&(g=m[b],y=x(g,b,d),t))if(n)w[b]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return b;case 2:w.push(g)}else if(s)return!1;return f?-1:a||s?s:w}}},{10:10,18:18,35:35,80:80,81:81}],10:[function(t,n,e){var r=t(39),o=t(37),i=t(84)("species");n.exports=function(t,n){var e;return o(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!o(e.prototype)||(e=void 0),r(e)&&(e=e[i],null===e&&(e=void 0))),new(void 0===e?Array:e)(n)}},{37:37,39:39,84:84}],11:[function(t,n,e){var r=t(12),o=t(84)("toStringTag"),i="Arguments"==r(function(){return arguments}());n.exports=function(t){var n,e,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=(n=Object(t))[o])?e:i?r(n):"Object"==(u=r(n))&&"function"==typeof n.callee?"Arguments":u}},{12:12,84:84}],12:[function(t,n,e){var r={}.toString;n.exports=function(t){return r.call(t).slice(8,-1)}},{}],13:[function(t,n,e){"use strict";var r=t(47),o=t(32),i=t(54),u=t(18),c=t(70),a=t(20),s=t(28),f=t(43),l=t(45),h=t(83)("id"),p=t(31),v=t(39),g=t(66),y=t(21),d=Object.isExtensible||v,m=y?"_s":"size",x=0,S=function(t,n){if(!v(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!p(t,h)){if(!d(t))return"F";if(!n)return"E";o(t,h,++x)}return"O"+t[h]},b=function(t,n){var e,r=S(n);if("F"!==r)return t._i[r];for(e=t._f;e;e=e.n)if(e.k==n)return e};n.exports={getConstructor:function(t,n,e,o){var f=t(function(t,i){c(t,f,n),t._i=r.create(null),t._f=void 0,t._l=void 0,t[m]=0,void 0!=i&&s(i,e,t[o],t)});return i(f.prototype,{clear:function clear(){for(var t=this,n=t._i,e=t._f;e;e=e.n)e.r=!0,e.p&&(e.p=e.p.n=void 0),delete n[e.i];t._f=t._l=void 0,t[m]=0},"delete":function(t){var n=this,e=b(n,t);if(e){var r=e.n,o=e.p;delete n._i[e.i],e.r=!0,o&&(o.n=r),r&&(r.p=o),n._f==e&&(n._f=r),n._l==e&&(n._l=o),n[m]--}return!!e},forEach:function forEach(t){for(var n,e=u(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(e(n.v,n.k,this);n&&n.r;)n=n.p},has:function has(t){return!!b(this,t)}}),y&&r.setDesc(f.prototype,"size",{get:function(){return a(this[m])}}),f},def:function(t,n,e){var r,o,i=b(t,n);return i?i.v=e:(t._l=i={i:o=S(n,!0),k:n,v:e,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[m]++,"F"!==o&&(t._i[o]=i)),t},getEntry:b,setStrong:function(t,n,e){f(t,n,function(t,n){this._t=t,this._k=n,this._l=void 0},function(){for(var t=this,n=t._k,e=t._l;e&&e.r;)e=e.p;return t._t&&(t._l=e=e?e.n:t._t._f)?"keys"==n?l(0,e.k):"values"==n?l(0,e.v):l(0,[e.k,e.v]):(t._t=void 0,l(1))},e?"entries":"values",!e,!0),g(n)}}},{18:18,20:20,21:21,28:28,31:31,32:32,39:39,43:43,45:45,47:47,54:54,66:66,70:70,83:83}],14:[function(t,n,e){var r=t(28),o=t(11);n.exports=function(t){return function toJSON(){if(o(this)!=t)throw TypeError(t+"#toJSON isn't generic");var n=[];return r(this,!1,n.push,n),n}}},{11:11,28:28}],15:[function(t,n,e){"use strict";var r=t(32),o=t(54),i=t(5),u=t(70),c=t(28),a=t(9),s=t(83)("weak"),f=t(39),l=t(31),h=Object.isExtensible||f,p=a(5),v=a(6),g=0,y=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},m=function(t,n){return p(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=m(this,t);return n?n[1]:void 0},has:function(t){return!!m(this,t)},set:function(t,n){var e=m(this,t);e?e[1]=n:this.a.push([t,n])},"delete":function(t){var n=v(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},n.exports={getConstructor:function(t,n,e,r){var i=t(function(t,o){u(t,i,n),t._i=g++,t._l=void 0,void 0!=o&&c(o,e,t[r],t)});return o(i.prototype,{"delete":function(t){return f(t)?h(t)?l(t,s)&&l(t[s],this._i)&&delete t[s][this._i]:y(this)["delete"](t):!1},has:function has(t){return f(t)?h(t)?l(t,s)&&l(t[s],this._i):y(this).has(t):!1}}),i},def:function(t,n,e){return h(i(n))?(l(n,s)||r(n,s,{}),n[s][t._i]=e):y(t).set(n,e),t},frozenStore:y,WEAK:s}},{28:28,31:31,32:32,39:39,5:5,54:54,70:70,83:83,9:9}],16:[function(t,n,e){"use strict";var r=t(30),o=t(19),i=t(62),u=t(54),c=t(28),a=t(70),s=t(39),f=t(25),l=t(44),h=t(67);n.exports=function(t,n,e,p,v,g){var y=r[t],d=y,m=v?"set":"add",x=d&&d.prototype,S={},b=function(t){var n=x[t];i(x,t,"delete"==t?function(t){return g&&!s(t)?!1:n.call(this,0===t?0:t)}:"has"==t?function has(t){return g&&!s(t)?!1:n.call(this,0===t?0:t)}:"get"==t?function get(t){return g&&!s(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function add(t){return n.call(this,0===t?0:t),this}:function set(t,e){return n.call(this,0===t?0:t,e),this})};if("function"==typeof d&&(g||x.forEach&&!f(function(){(new d).entries().next()}))){var w,E=new d,O=E[m](g?{}:-0,1)!=E,P=f(function(){E.has(1)}),_=l(function(t){new d(t)});_||(d=n(function(n,e){a(n,d,t);var r=new y;return void 0!=e&&c(e,v,r[m],r),r}),d.prototype=x,x.constructor=d),g||E.forEach(function(t,n){w=1/n===-(1/0)}),(P||w)&&(b("delete"),b("has"),v&&b("get")),(w||O)&&b(m),g&&x.clear&&delete x.clear}else d=p.getConstructor(n,t,v,m),u(d.prototype,e);return h(d,t),S[t]=d,o(o.G+o.W+o.F*(d!=y),S),g||p.setStrong(d,t,v),d}},{19:19,25:25,28:28,30:30,39:39,44:44,54:54,62:62,67:67,70:70}],17:[function(t,n,e){var r=n.exports={version:"1.2.5"};"number"==typeof __e&&(__e=r)},{}],18:[function(t,n,e){var r=t(3);n.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},{3:3}],19:[function(t,n,e){var r=t(30),o=t(17),i=t(32),u=t(62),c="prototype",a=function(t,n){return function(){return t.apply(n,arguments)}},s=function(t,n,e){var f,l,h,p,v=t&s.G,g=t&s.P,y=v?r:t&s.S?r[n]||(r[n]={}):(r[n]||{})[c],d=v?o:o[n]||(o[n]={});v&&(e=n);for(f in e)l=!(t&s.F)&&y&&f in y,h=(l?y:e)[f],p=t&s.B&&l?a(h,r):g&&"function"==typeof h?a(Function.call,h):h,y&&!l&&u(y,f,h),d[f]!=h&&i(d,f,p),g&&((d[c]||(d[c]={}))[f]=h)};r.core=o,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,n.exports=s},{17:17,30:30,32:32,62:62}],20:[function(t,n,e){n.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],21:[function(t,n,e){n.exports=!t(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{25:25}],22:[function(t,n,e){var r=t(39),o=t(30).document,i=r(o)&&r(o.createElement);n.exports=function(t){return i?o.createElement(t):{}}},{30:30,39:39}],23:[function(t,n,e){var r=t(47);n.exports=function(t){var n=r.getKeys(t),e=r.getSymbols;if(e)for(var o,i=e(t),u=r.isEnum,c=0;i.length>c;)u.call(t,o=i[c++])&&n.push(o);return n}},{47:47}],24:[function(t,n,e){var r=t(84)("match");n.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,!"/./"[t](n)}catch(o){}}return!0}},{84:84}],25:[function(t,n,e){n.exports=function(t){try{return!!t()}catch(n){return!0}}},{}],26:[function(t,n,e){"use strict";var r=t(32),o=t(62),i=t(25),u=t(20),c=t(84);n.exports=function(t,n,e){var a=c(t),s=""[t];i(function(){var n={};return n[a]=function(){return 7},7!=""[t](n)})&&(o(String.prototype,t,e(u,a,s)),r(RegExp.prototype,a,2==n?function(t,n){return s.call(t,this,n)}:function(t){return s.call(t,this)}))}},{20:20,25:25,32:32,62:62,84:84}],27:[function(t,n,e){"use strict";var r=t(5);n.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},{5:5}],28:[function(t,n,e){var r=t(18),o=t(41),i=t(36),u=t(5),c=t(80),a=t(85);n.exports=function(t,n,e,s){var f,l,h,p=a(t),v=r(e,s,n?2:1),g=0;if("function"!=typeof p)throw TypeError(t+" is not iterable!");if(i(p))for(f=c(t.length);f>g;g++)n?v(u(l=t[g])[0],l[1]):v(t[g]);else for(h=p.call(t);!(l=h.next()).done;)o(h,v,l.value,n)}},{18:18,36:36,41:41,5:5,80:80,85:85}],29:[function(t,n,e){var r={}.toString,o=t(79),i=t(47).getNames,u="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){try{return i(t)}catch(n){return u.slice()}};n.exports.get=function getOwnPropertyNames(t){return u&&"[object Window]"==r.call(t)?c(t):i(o(t))}},{47:47,79:79}],30:[function(t,n,e){var r=n.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],31:[function(t,n,e){var r={}.hasOwnProperty;n.exports=function(t,n){return r.call(t,n)}},{}],32:[function(t,n,e){var r=t(47),o=t(61);n.exports=t(21)?function(t,n,e){return r.setDesc(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},{21:21,47:47,61:61}],33:[function(t,n,e){n.exports=t(30).document&&document.documentElement},{30:30}],34:[function(t,n,e){n.exports=function(t,n,e){var r=void 0===e;switch(n.length){case 0:return r?t():t.call(e);case 1:return r?t(n[0]):t.call(e,n[0]);case 2:return r?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return r?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return r?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},{}],35:[function(t,n,e){var r=t(12);n.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{12:12}],36:[function(t,n,e){var r=t(46),o=t(84)("iterator"),i=Array.prototype;n.exports=function(t){return(r.Array||i[o])===t}},{46:46,84:84}],37:[function(t,n,e){var r=t(12);n.exports=Array.isArray||function(t){return"Array"==r(t)}},{12:12}],38:[function(t,n,e){var r=t(39),o=Math.floor;n.exports=function isInteger(t){return!r(t)&&isFinite(t)&&o(t)===t}},{39:39}],39:[function(t,n,e){n.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],40:[function(t,n,e){var r=t(39),o=t(12),i=t(84)("match");n.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},{12:12,39:39,84:84}],41:[function(t,n,e){var r=t(5);n.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(i){var u=t["return"];throw void 0!==u&&r(u.call(t)),i}}},{5:5}],42:[function(t,n,e){"use strict";var r=t(47),o=t(61),i=t(67),u={};t(32)(u,t(84)("iterator"),function(){return this}),n.exports=function(t,n,e){t.prototype=r.create(u,{next:o(1,e)}),i(t,n+" Iterator")}},{32:32,47:47,61:61,67:67,84:84}],43:[function(t,n,e){"use strict";var r=t(49),o=t(19),i=t(62),u=t(32),c=t(31),a=t(84)("iterator"),s=t(46),f=t(42),l=t(67),h=t(47).getProto,p=!([].keys&&"next"in[].keys()),v="@@iterator",g="keys",y="values",d=function(){return this};n.exports=function(t,n,e,m,x,S,b){f(e,n,m);var w,E,O=function(t){if(!p&&t in _)return _[t];switch(t){case g:return function keys(){return new e(this,t)};case y:return function values(){return new e(this,t)}}return function entries(){return new e(this,t)}},P=n+" Iterator",_=t.prototype,M=_[a]||_[v]||x&&_[x],F=M||O(x);if(M){var A=h(F.call(new t));l(A,P,!0),!r&&c(_,v)&&u(A,a,d)}if(r&&!b||!p&&a in _||u(_,a,F),s[n]=F,s[P]=d,x)if(w={values:x==y?F:O(y),keys:S?F:O(g),entries:x!=y?F:O("entries")},b)for(E in w)E in _||i(_,E,w[E]);else o(o.P+o.F*p,n,w);return w}},{19:19,31:31,32:32,42:42,46:46,47:47,49:49,62:62,67:67,84:84}],44:[function(t,n,e){var r=t(84)("iterator"),o=!1;try{var i=[7][r]();i["return"]=function(){o=!0},Array.from(i,function(){throw 2})}catch(u){}n.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i=[7],u=i[r]();u.next=function(){e=!0},i[r]=function(){return u},t(i)}catch(c){}return e}},{84:84}],45:[function(t,n,e){n.exports=function(t,n){return{value:n,done:!!t}}},{}],46:[function(t,n,e){n.exports={}},{}],47:[function(t,n,e){var r=Object;n.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],48:[function(t,n,e){var r=t(47),o=t(79);n.exports=function(t,n){for(var e,i=o(t),u=r.getKeys(i),c=u.length,a=0;c>a;)if(i[e=u[a++]]===n)return e}},{47:47,79:79}],49:[function(t,n,e){n.exports=!1},{}],50:[function(t,n,e){n.exports=Math.expm1||function expm1(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],51:[function(t,n,e){n.exports=Math.log1p||function log1p(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],52:[function(t,n,e){n.exports=Math.sign||function sign(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],53:[function(t,n,e){var r,o,i,u=t(30),c=t(76).set,a=u.MutationObserver||u.WebKitMutationObserver,s=u.process,f="process"==t(12)(s),l=function(){var t,n;for(f&&(t=s.domain)&&(s.domain=null,t.exit());r;)n=r.domain,n&&n.enter(),r.fn.call(),n&&n.exit(),r=r.next;o=void 0,t&&t.enter()};if(f)i=function(){s.nextTick(l)};else if(a){var h=1,p=document.createTextNode("");new a(l).observe(p,{characterData:!0}),i=function(){p.data=h=-h}}else i=function(){c.call(u,l)};n.exports=function asap(t){var n={fn:t,next:void 0,domain:f&&s.domain};o&&(o.next=n),r||(r=n,i()),o=n}},{12:12,30:30,76:76}],54:[function(t,n,e){var r=t(62);n.exports=function(t,n){for(var e in n)r(t,e,n[e]);return t}},{62:62}],55:[function(t,n,e){var r=t(47),o=t(81),i=t(35);n.exports=t(25)(function(){var t=Object.assign,n={},e={},r=Symbol(),o="abcdefghijklmnopqrst";return n[r]=7,o.split("").forEach(function(t){e[t]=t}),7!=t({},n)[r]||Object.keys(t({},e)).join("")!=o})?function assign(t,n){for(var e=o(t),u=arguments,c=u.length,a=1,s=r.getKeys,f=r.getSymbols,l=r.isEnum;c>a;)for(var h,p=i(u[a++]),v=f?s(p).concat(f(p)):s(p),g=v.length,y=0;g>y;)l.call(p,h=v[y++])&&(e[h]=p[h]);return e}:Object.assign},{25:25,35:35,47:47,81:81}],56:[function(t,n,e){var r=(t(19),t(17)),o=t(25);n.exports=function(n,e){var i=t(19),u=(r.Object||{})[n]||Object[n],c={};c[n]=e(u),i(i.S+i.F*o(function(){u(1)}),"Object",c)}},{17:17,19:19,25:25}],57:[function(t,n,e){var r=t(47),o=t(79),i=r.isEnum;n.exports=function(t){return function(n){for(var e,u=o(n),c=r.getKeys(u),a=c.length,s=0,f=[];a>s;)i.call(u,e=c[s++])&&f.push(t?[e,u[e]]:u[e]);return f}}},{47:47,79:79}],58:[function(t,n,e){var r=t(47),o=t(5),i=t(30).Reflect;n.exports=i&&i.ownKeys||function ownKeys(t){var n=r.getNames(o(t)),e=r.getSymbols;return e?n.concat(e(t)):n}},{30:30,47:47,5:5}],59:[function(t,n,e){"use strict";var r=t(60),o=t(34),i=t(3);n.exports=function(){for(var t=i(this),n=arguments.length,e=Array(n),u=0,c=r._,a=!1;n>u;)(e[u]=arguments[u++])===c&&(a=!0);return function(){var r,i=this,u=arguments,s=u.length,f=0,l=0;if(!a&&!s)return o(t,e,i);if(r=e.slice(),a)for(;n>f;f++)r[f]===c&&(r[f]=u[l++]);for(;s>l;)r.push(u[l++]);return o(t,r,i)}}},{3:3,34:34,60:60}],60:[function(t,n,e){n.exports=t(30)},{30:30}],61:[function(t,n,e){n.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},{}],62:[function(t,n,e){var r=t(30),o=t(32),i=t(83)("src"),u="toString",c=Function[u],a=(""+c).split(u);t(17).inspectSource=function(t){return c.call(t)},(n.exports=function(t,n,e,u){"function"==typeof e&&(e.hasOwnProperty(i)||o(e,i,t[n]?""+t[n]:a.join(String(n))),e.hasOwnProperty("name")||o(e,"name",n)),t===r?t[n]=e:(u||delete t[n],o(t,n,e))})(Function.prototype,u,function toString(){return"function"==typeof this&&this[i]||c.call(this)})},{17:17,30:30,32:32,83:83}],63:[function(t,n,e){n.exports=function(t,n){var e=n===Object(n)?function(t){return n[t]}:n;return function(n){return String(n).replace(t,e)}}},{}],64:[function(t,n,e){n.exports=Object.is||function is(t,n){return t===n?0!==t||1/t===1/n:t!=t&&n!=n}},{}],65:[function(t,n,e){var r=t(47).getDesc,o=t(39),i=t(5),u=function(t,n){if(i(t),!o(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};n.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(n,e,o){try{o=t(18)(Function.call,r(Object.prototype,"__proto__").set,2),o(n,[]),e=!(n instanceof Array)}catch(i){e=!0}return function setPrototypeOf(t,n){return u(t,n),e?t.__proto__=n:o(t,n),t}}({},!1):void 0),check:u}},{18:18,39:39,47:47,5:5}],66:[function(t,n,e){"use strict";var r=t(30),o=t(47),i=t(21),u=t(84)("species");n.exports=function(t){var n=r[t];i&&n&&!n[u]&&o.setDesc(n,u,{configurable:!0,get:function(){return this}})}},{21:21,30:30,47:47,84:84}],67:[function(t,n,e){var r=t(47).setDesc,o=t(31),i=t(84)("toStringTag");n.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},{31:31,47:47,84:84}],68:[function(t,n,e){var r=t(30),o="__core-js_shared__",i=r[o]||(r[o]={});n.exports=function(t){return i[t]||(i[t]={})}},{30:30}],69:[function(t,n,e){var r=t(5),o=t(3),i=t(84)("species");n.exports=function(t,n){var e,u=r(t).constructor;return void 0===u||void 0==(e=r(u)[i])?n:o(e)}},{3:3,5:5,84:84}],70:[function(t,n,e){n.exports=function(t,n,e){if(!(t instanceof n))throw TypeError(e+": use the 'new' operator!");return t}},{}],71:[function(t,n,e){var r=t(78),o=t(20);n.exports=function(t){return function(n,e){var i,u,c=String(o(n)),a=r(e),s=c.length;return 0>a||a>=s?t?"":void 0:(i=c.charCodeAt(a),55296>i||i>56319||a+1===s||(u=c.charCodeAt(a+1))<56320||u>57343?t?c.charAt(a):i:t?c.slice(a,a+2):(i-55296<<10)+(u-56320)+65536)}}},{20:20,78:78}],72:[function(t,n,e){var r=t(40),o=t(20);n.exports=function(t,n,e){if(r(n))throw TypeError("String#"+e+" doesn't accept regex!");return String(o(t))}},{20:20,40:40}],73:[function(t,n,e){var r=t(80),o=t(74),i=t(20);n.exports=function(t,n,e,u){var c=String(i(t)),a=c.length,s=void 0===e?" ":String(e),f=r(n);if(a>=f)return c;""==s&&(s=" ");var l=f-a,h=o.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+c:c+h}},{20:20,74:74,80:80}],74:[function(t,n,e){"use strict";var r=t(78),o=t(20);n.exports=function repeat(t){var n=String(o(this)),e="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(n+=n))1&i&&(e+=n);return e}},{20:20,78:78}],75:[function(t,n,e){var r=t(19),o=t(20),i=t(25),u=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",c="["+u+"]",a="​…",s=RegExp("^"+c+c+"*"),f=RegExp(c+c+"*$"),l=function(t,n){var e={};e[t]=n(h),r(r.P+r.F*i(function(){return!!u[t]()||a[t]()!=a}),"String",e)},h=l.trim=function(t,n){return t=String(o(t)),1&n&&(t=t.replace(s,"")),2&n&&(t=t.replace(f,"")),t};n.exports=l},{19:19,20:20,25:25}],76:[function(t,n,e){"use strict";var r,o,i,u=t(18),c=t(34),a=t(33),s=t(22),f=t(30),l=f.process,h=f.setImmediate,p=f.clearImmediate,v=f.MessageChannel,g=0,y={},d="onreadystatechange",m=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},x=function(t){m.call(t.data)};h&&p||(h=function setImmediate(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return y[++g]=function(){c("function"==typeof t?t:Function(t),n)},r(g),g},p=function clearImmediate(t){delete y[t]},"process"==t(12)(l)?r=function(t){l.nextTick(u(m,t,1))}:v?(o=new v,i=o.port2,o.port1.onmessage=x,r=u(i.postMessage,i,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(r=function(t){f.postMessage(t+"","*")},f.addEventListener("message",x,!1)):r=d in s("script")?function(t){a.appendChild(s("script"))[d]=function(){a.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0)}),n.exports={set:h,clear:p}},{12:12,18:18,22:22,30:30,33:33,34:34}],77:[function(t,n,e){var r=t(78),o=Math.max,i=Math.min;n.exports=function(t,n){return t=r(t),0>t?o(t+n,0):i(t,n)}},{78:78}],78:[function(t,n,e){var r=Math.ceil,o=Math.floor;n.exports=function(t){return isNaN(t=+t)?0:(t>0?o:r)(t)}},{}],79:[function(t,n,e){var r=t(35),o=t(20);n.exports=function(t){return r(o(t))}},{20:20,35:35}],80:[function(t,n,e){var r=t(78),o=Math.min;n.exports=function(t){return t>0?o(r(t),9007199254740991):0}},{78:78}],81:[function(t,n,e){var r=t(20);n.exports=function(t){return Object(r(t))}},{20:20}],82:[function(t,n,e){var r=t(39);n.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},{39:39}],83:[function(t,n,e){var r=0,o=Math.random();n.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+o).toString(36))}},{}],84:[function(t,n,e){var r=t(68)("wks"),o=t(83),i=t(30).Symbol;n.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||o)("Symbol."+t))}},{30:30,68:68,83:83}],85:[function(t,n,e){var r=t(11),o=t(84)("iterator"),i=t(46);n.exports=t(17).getIteratorMethod=function(t){return void 0!=t?t[o]||t["@@iterator"]||i[r(t)]:void 0}},{11:11,17:17,46:46,84:84}],86:[function(t,n,e){"use strict";var r,o=t(47),i=t(21),u=t(61),c=t(33),a=t(22),s=t(31),f=t(12),l=t(19),h=t(34),p=t(9),v=t(83)("__proto__"),g=t(39),y=t(5),d=t(3),m=t(81),x=t(79),S=t(78),b=t(77),w=t(80),E=t(35),O=t(25),P=Object.prototype,_=[],M=_.slice,F=_.join,A=o.setDesc,j=o.getDesc,N=o.setDescs,I=t(8)(!1),k={};i||(r=!O(function(){return 7!=A(a("div"),"a",{get:function(){return 7}}).a}),o.setDesc=function(t,n,e){if(r)try{return A(t,n,e)}catch(o){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(y(t)[n]=e.value),t},o.getDesc=function(t,n){if(r)try{return j(t,n)}catch(e){}return s(t,n)?u(!P.propertyIsEnumerable.call(t,n),t[n]):void 0},o.setDescs=N=function(t,n){y(t);for(var e,r=o.getKeys(n),i=r.length,u=0;i>u;)o.setDesc(t,e=r[u++],n[e]);return t}),l(l.S+l.F*!i,"Object",{getOwnPropertyDescriptor:o.getDesc,defineProperty:o.setDesc,defineProperties:N});var D="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),T=D.concat("length","prototype"),L=D.length,R=function(){var t,n=a("iframe"),e=L,r=">";for(n.style.display="none",c.appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(" + + + + + + + + + + + + +

+
+ + + From ffa50452189dc6db3413c9f2cda173dc44c4ddd6 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:15:57 -0500 Subject: [PATCH 05/43] Added entrypoint for client-side JS code that sets up ReactJS with React-Router SPA routing and a Redux wrapper for global state management --- assets/js/dev-index.jsx | 24 ++++++++++++++++++++++++ assets/js/prod-index.jsx | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 assets/js/dev-index.jsx create mode 100644 assets/js/prod-index.jsx diff --git a/assets/js/dev-index.jsx b/assets/js/dev-index.jsx new file mode 100644 index 0000000..2465a51 --- /dev/null +++ b/assets/js/dev-index.jsx @@ -0,0 +1,24 @@ +'use strict'; + +import React from 'react'; +import { render } from 'react-dom'; +import configureStore from './store/configureStore'; +import { Provider } from 'react-redux'; +import { Router, browserHistory, hashHistory } from 'react-router'; +import { syncHistoryWithStore } from 'react-router-redux'; +import routes from './routes'; + +const store = configureStore(); + +const historyType = window.IEVersion && window.IEVersion < 10 ? hashHistory : browserHistory; + +const history = syncHistoryWithStore(historyType, store, {selectLocationState: state => state.router}); + +render( + + + {routes} + + , + document.getElementById('react-root') +); diff --git a/assets/js/prod-index.jsx b/assets/js/prod-index.jsx new file mode 100644 index 0000000..f04b6c0 --- /dev/null +++ b/assets/js/prod-index.jsx @@ -0,0 +1,24 @@ +'use strict'; + +import React from 'react'; +import { render } from 'react-dom'; +import configureStore from './store/configureStore'; +import { Provider } from 'react-redux'; +import { Router, browserHistory, hashHistory } from 'react-router'; +import { syncHistoryWithStore } from 'react-router-redux'; +import routes from './routes'; + +const store = configureStore('prod'); + +const historyType = window.IEVersion && window.IEVersion < 10 ? hashHistory : browserHistory; + +const history = syncHistoryWithStore(historyType, store, {selectLocationState: state => state.router}); + +render( + + + {routes} + + , + document.getElementById('react-root') +); From 18818c3d1c4b6531fcd917a5c3a209cb46104305 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:31:56 -0500 Subject: [PATCH 06/43] Added a module that configures the Redux store and all of its middleware --- assets/js/store/configureStore.jsx | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 assets/js/store/configureStore.jsx diff --git a/assets/js/store/configureStore.jsx b/assets/js/store/configureStore.jsx new file mode 100644 index 0000000..75650a5 --- /dev/null +++ b/assets/js/store/configureStore.jsx @@ -0,0 +1,45 @@ +'use strict'; + +import { createStore, applyMiddleware } from 'redux'; +import { routerMiddleware } from 'react-router-redux'; +import { browserHistory, hashHistory } from 'react-router'; +import api from '../middleware/api'; +import localStore from '../middleware/localStore'; +import actionLogger, { initActionLogger } from '../middleware/actionLogger'; +import thunk from 'redux-thunk'; +import createLogger from 'redux-logger'; +import rootReducer from '../reducers'; +import { fromJS } from 'immutable'; + +// For IE 9 and lower we need to use hashHistory. All other browsers should support browserHistory +const reduxRouterMiddleware = routerMiddleware(window.IEVersion && window.IEVersion < 10 ? hashHistory : browserHistory); + +// Initialize the action logger +initActionLogger(); + +// Compose a store creator for dev +const createStoreDev = applyMiddleware( + reduxRouterMiddleware, // Connects redux-router data to the Redux store + thunk, // Middleware that allows for Asynchronous redux actions + api, // Provides an interface for creating actions that make AJAX requests to an API + localStore, // Provides an interface for creating actions that store state in the localStore + actionLogger, // Keeps track of actions so we can rerun a user's entire session + createLogger() // Logs each action and relevant info for debugging +)(createStore); + +// Compose a store creator for prod +const createStoreProd = applyMiddleware( + reduxRouterMiddleware, + thunk, + api, + localStore, + actionLogger +)(createStore); + +export default function configureStore(env = 'dev') { + if (env === 'prod') { + return createStoreProd(rootReducer, {settings: fromJS({env})}); + } else { + return createStoreDev(rootReducer, {settings: fromJS({env})}); + } +} From bd292403832e36573b11c0dcb9e01f52e0523580 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:40:26 -0500 Subject: [PATCH 07/43] Added the route definitions of the SPA using react-router --- assets/js/routes.jsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 assets/js/routes.jsx diff --git a/assets/js/routes.jsx b/assets/js/routes.jsx new file mode 100644 index 0000000..ae3b0ac --- /dev/null +++ b/assets/js/routes.jsx @@ -0,0 +1,25 @@ +'use strict'; + +import React from 'react'; +import { Route, IndexRoute } from 'react-router'; + +import App from './containers/App'; +import ExampleSection from './containers/ExampleSection'; +import ExamplePage from './containers/ExamplePage'; + +// This route tree defines the urls for our UI and how they map to container components. Each route's "component" will be rendered +// as the child of it's parent route's component. For example, the url "/example/page/" will produce this component tree: +// +// +// +// +// +export default ( + + + + + + + +); From c5d41fa69ae00aa3ecca51f9edb2f1dd51af74a5 Mon Sep 17 00:00:00 2001 From: Corey Pauley Date: Tue, 23 Aug 2016 00:55:31 -0500 Subject: [PATCH 08/43] Added container components that make up the different route configurations --- assets/js/containers/App.jsx | 85 +++++++++++++++++++ assets/js/containers/BasePage.jsx | 48 +++++++++++ assets/js/containers/ExamplePage.jsx | 103 ++++++++++++++++++++++++ assets/js/containers/ExampleSection.jsx | 43 ++++++++++ 4 files changed, 279 insertions(+) create mode 100644 assets/js/containers/App.jsx create mode 100644 assets/js/containers/BasePage.jsx create mode 100644 assets/js/containers/ExamplePage.jsx create mode 100644 assets/js/containers/ExampleSection.jsx diff --git a/assets/js/containers/App.jsx b/assets/js/containers/App.jsx new file mode 100644 index 0000000..453bb8e --- /dev/null +++ b/assets/js/containers/App.jsx @@ -0,0 +1,85 @@ +'use strict'; + +import React, { Component, PropTypes } from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { Map, List, fromJS } from 'immutable'; +import { buildProps } from '../utils'; +//import { pushState } from 'redux-router'; +import { push } from 'react-router-redux'; +import { connect } from 'react-redux'; +import { Nav } from '../components/nav'; +import _ from 'lodash'; +import moment from 'moment'; +import classNames from 'classnames'; + +class App extends Component { + + static childContextTypes = { + 'url_query': PropTypes.any + }; + + // Initial state + state = { + }; + + constructor(props) { + super(props); + } + + getChildContext() { + const { url_query } = this.props; + + return { url_query }; + } + + componentWillMount() { + } + + componentWillReceiveProps(nextProps) { + } + + componentDidUpdate(prevProps, prevState) { + } + + render() { + const { pathname, url_query, debug } = this.props; + + let nav = user ?