ducky/web

Paddy 2015-05-03 Child:2cd4e16a669e

0:99a43a6d1d30 Browse Files

First commit. Setup project structure, start getting our registration flow set up. At this point, it runs successfully locally, assuming the auth server is running locally at slightly.local:8080. So, uh... on my computer. Also, we currently have the Register button (on the register page) disabled always, because we still need to hook up form validation and set the this.state.valid property. If that property is set to true, then the button is enabled again. Still to do: validation, logging in. Then what we have written works, minus some configuration stuff that still needs to be figured out.

.hgignore bin/dev-server index.html package.json src/components/cog.svg src/components/ducky.svg src/components/hero.jsx src/config.js src/main.js src/models/me.js src/models/profile.js src/models/profiles.js src/pages/.register.jsx.swp src/pages/login.jsx src/pages/message.jsx src/pages/onboard.jsx src/pages/register.jsx src/router.jsx src/styles/._button.scss.swp src/styles/_button.scss src/styles/base/_base.scss src/styles/base/_buttons.scss src/styles/base/_forms.scss src/styles/base/_grid-settings.scss src/styles/base/_lists.scss src/styles/base/_tables.scss src/styles/base/_typography.scss src/styles/base/_variables.scss src/styles/hero.scss src/styles/main.scss src/styles/onboarding.scss webpack.config.js

     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/.hgignore	Sun May 03 23:25:12 2015 -0400
     1.3 @@ -0,0 +1,2 @@
     1.4 +build/
     1.5 +node_modules/
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/bin/dev-server	Sun May 03 23:25:12 2015 -0400
     2.3 @@ -0,0 +1,31 @@
     2.4 +#!/usr/bin/env node
     2.5 +
     2.6 +var fs = require('fs')
     2.7 +var path = require('path')
     2.8 +var webpack = require('webpack')
     2.9 +var WebpackDevServer = require('webpack-dev-server')
    2.10 +var argv = require('minimist')(process.argv.slice(2))
    2.11 +var findRoot = require('find-root')
    2.12 +var rootFolder = findRoot(process.env.PWD)
    2.13 +
    2.14 +var configfile = '';
    2.15 +
    2.16 +// get config
    2.17 +if (argv.config) {
    2.18 +  configfile = path.resolve(argv.config)
    2.19 +} else {
    2.20 +  configfile = path.resolve(path.join(rootFolder, 'webpack.config.js'))
    2.21 +}
    2.22 +argv.config = require(configfile);
    2.23 +
    2.24 +// run it
    2.25 +new WebpackDevServer(webpack(argv.config), {
    2.26 +  historyApiFallback: true,
    2.27 +  hot: true,
    2.28 +  publicPath: argv.config.output.publicPath,
    2.29 +}).listen(argv.config.port, argv.config.host, function (err, result) {
    2.30 +  if (err) {
    2.31 +    console.log(err)
    2.32 +  }
    2.33 +  console.log('development server running at: http://' + argv.config.host + ':' + argv.config.port)
    2.34 +})
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/index.html	Sun May 03 23:25:12 2015 -0400
     3.3 @@ -0,0 +1,11 @@
     3.4 +<!DOCTYPE html>
     3.5 +<html>
     3.6 +<head>
     3.7 +	<meta charset="utf-8">
     3.8 +  <link rel="stylesheet" href="/static/main.css" />
     3.9 +</head>
    3.10 +<body>
    3.11 +</body>
    3.12 +<script src="/static/common.js"></script>
    3.13 +<script src="/static/bundle.js"></script>
    3.14 +</html>
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/package.json	Sun May 03 23:25:12 2015 -0400
     4.3 @@ -0,0 +1,43 @@
     4.4 +{
     4.5 +  "name": "ducky",
     4.6 +  "version": "0.0.1",
     4.7 +  "author": "Second Bit",
     4.8 +  "license": "MIT",
     4.9 +  "dependencies": {
    4.10 +    "ampersand-app": "^1.0.4",
    4.11 +    "ampersand-collection": "^1.4.5",
    4.12 +    "ampersand-model": "^5.0.3",
    4.13 +    "ampersand-react-mixin": "^0.1.2",
    4.14 +    "ampersand-router": "^3.0.2",
    4.15 +    "ampersand-sync": "^3.0.7",
    4.16 +    "babel": "^5.1.13",
    4.17 +    "babel-loader": "^5.0.0",
    4.18 +    "css-loader": "^0.12.0",
    4.19 +    "extract-text-webpack-plugin": "^0.7.0",
    4.20 +    "file-loader": "^0.8.1",
    4.21 +    "find-root": "^0.1.1",
    4.22 +    "ladda": "^0.9.8",
    4.23 +    "local-links": "^1.4.0",
    4.24 +    "lodash.isobject": "^3.0.1",
    4.25 +    "minimist": "^1.1.1",
    4.26 +    "node-bourbon": "^4.2.1-beta1",
    4.27 +    "node-neat": "^1.7.1-beta1",
    4.28 +    "node-sass": "^2.1.1",
    4.29 +    "normalize.css": "^3.0.3",
    4.30 +    "qs": "^2.4.1",
    4.31 +    "react": "^0.13.2",
    4.32 +    "react-ladda": "^2.0.2",
    4.33 +    "sass-loader": "0.4.2",
    4.34 +    "style-loader": "^0.12.0",
    4.35 +    "url-loader": "^0.5.5",
    4.36 +    "webpack": "^1.8.9"
    4.37 +  },
    4.38 +  "devDependencies": {
    4.39 +    "react-hot-loader": "^1.2.5",
    4.40 +    "webpack-dev-server": "^1.8.2"
    4.41 +  },
    4.42 +  "scripts": {
    4.43 +    "build": "NODE_ENV=production webpack",
    4.44 +    "start": "bin/dev-server"
    4.45 +  }
    4.46 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/src/components/cog.svg	Sun May 03 23:25:12 2015 -0400
     5.3 @@ -0,0 +1,54 @@
     5.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
     5.5 +<svg
     5.6 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
     5.7 +   xmlns:cc="http://creativecommons.org/ns#"
     5.8 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     5.9 +   xmlns:svg="http://www.w3.org/2000/svg"
    5.10 +   xmlns="http://www.w3.org/2000/svg"
    5.11 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    5.12 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    5.13 +   width="8"
    5.14 +   height="8"
    5.15 +   viewBox="0 0 8 8"
    5.16 +   id="svg2"
    5.17 +   version="1.1"
    5.18 +   inkscape:version="0.48.2 r9819"
    5.19 +   sodipodi:docname="cog.svg">
    5.20 +  <metadata
    5.21 +     id="metadata10">
    5.22 +    <rdf:RDF>
    5.23 +      <cc:Work
    5.24 +         rdf:about="">
    5.25 +        <dc:format>image/svg+xml</dc:format>
    5.26 +        <dc:type
    5.27 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
    5.28 +      </cc:Work>
    5.29 +    </rdf:RDF>
    5.30 +  </metadata>
    5.31 +  <defs
    5.32 +     id="defs8" />
    5.33 +  <sodipodi:namedview
    5.34 +     pagecolor="#ffffff"
    5.35 +     bordercolor="#666666"
    5.36 +     borderopacity="1"
    5.37 +     objecttolerance="10"
    5.38 +     gridtolerance="10"
    5.39 +     guidetolerance="10"
    5.40 +     inkscape:pageopacity="0"
    5.41 +     inkscape:pageshadow="2"
    5.42 +     inkscape:window-width="640"
    5.43 +     inkscape:window-height="480"
    5.44 +     id="namedview6"
    5.45 +     showgrid="false"
    5.46 +     inkscape:zoom="29.5"
    5.47 +     inkscape:cx="4"
    5.48 +     inkscape:cy="4"
    5.49 +     inkscape:window-x="0"
    5.50 +     inkscape:window-y="0"
    5.51 +     inkscape:window-maximized="0"
    5.52 +     inkscape:current-layer="svg2" />
    5.53 +  <path
    5.54 +     d="M3.5 0l-.5 1.19c-.1.03-.19.08-.28.13l-1.19-.5-.72.72.5 1.19c-.05.1-.09.18-.13.28l-1.19.5v1l1.19.5c.04.1.08.18.13.28l-.5 1.19.72.72 1.19-.5c.09.04.18.09.28.13l.5 1.19h1l.5-1.19c.09-.04.19-.08.28-.13l1.19.5.72-.72-.5-1.19c.04-.09.09-.19.13-.28l1.19-.5v-1l-1.19-.5c-.03-.09-.08-.19-.13-.28l.5-1.19-.72-.72-1.19.5c-.09-.04-.19-.09-.28-.13l-.5-1.19h-1zm.5 2.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5-1.5-.67-1.5-1.5.67-1.5 1.5-1.5z"
    5.55 +     id="path4"
    5.56 +     style="fill:#ececec" />
    5.57 +</svg>
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/components/ducky.svg	Sun May 03 23:25:12 2015 -0400
     6.3 @@ -0,0 +1,679 @@
     6.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
     6.5 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
     6.6 +
     6.7 +<svg
     6.8 +   xmlns:dc="http://purl.org/dc/elements/1.1/"
     6.9 +   xmlns:cc="http://creativecommons.org/ns#"
    6.10 +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    6.11 +   xmlns:svg="http://www.w3.org/2000/svg"
    6.12 +   xmlns="http://www.w3.org/2000/svg"
    6.13 +   xmlns:xlink="http://www.w3.org/1999/xlink"
    6.14 +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    6.15 +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    6.16 +   width="290"
    6.17 +   height="290"
    6.18 +   id="svg2"
    6.19 +   version="1.1"
    6.20 +   inkscape:version="0.48.2 r9819"
    6.21 +   inkscape:export-filename="/Users/paddyforan/Desktop/ducky.png"
    6.22 +   inkscape:export-xdpi="180"
    6.23 +   inkscape:export-ydpi="180"
    6.24 +   sodipodi:docname="ducky.svg">
    6.25 +  <sodipodi:namedview
    6.26 +     id="base"
    6.27 +     pagecolor="#ffffff"
    6.28 +     bordercolor="#666666"
    6.29 +     borderopacity="1.0"
    6.30 +     inkscape:pageopacity="0.0"
    6.31 +     inkscape:pageshadow="2"
    6.32 +     inkscape:zoom="1"
    6.33 +     inkscape:cx="145"
    6.34 +     inkscape:cy="60.147186"
    6.35 +     inkscape:document-units="px"
    6.36 +     inkscape:current-layer="layer1"
    6.37 +     showgrid="false"
    6.38 +     showguides="true"
    6.39 +     fit-margin-top="20"
    6.40 +     fit-margin-left="20"
    6.41 +     fit-margin-right="20"
    6.42 +     fit-margin-bottom="20"
    6.43 +     inkscape:window-width="1294"
    6.44 +     inkscape:window-height="835"
    6.45 +     inkscape:window-x="839"
    6.46 +     inkscape:window-y="141"
    6.47 +     inkscape:window-maximized="0"
    6.48 +     inkscape:object-paths="true" />
    6.49 +  <defs
    6.50 +     id="defs4">
    6.51 +    <linearGradient
    6.52 +       inkscape:collect="always"
    6.53 +       id="linearGradient4376">
    6.54 +      <stop
    6.55 +         style="stop-color:#000000;stop-opacity:1;"
    6.56 +         offset="0"
    6.57 +         id="stop4378" />
    6.58 +      <stop
    6.59 +         style="stop-color:#000000;stop-opacity:0;"
    6.60 +         offset="1"
    6.61 +         id="stop4380" />
    6.62 +    </linearGradient>
    6.63 +    <linearGradient
    6.64 +       id="linearGradient4348">
    6.65 +      <stop
    6.66 +         style="stop-color:#ffffff;stop-opacity:0.720339;"
    6.67 +         offset="0"
    6.68 +         id="stop4350" />
    6.69 +      <stop
    6.70 +         id="stop4356"
    6.71 +         offset="0.3125"
    6.72 +         style="stop-color:#ffffff;stop-opacity:0.18644068;" />
    6.73 +      <stop
    6.74 +         style="stop-color:#ffffff;stop-opacity:0;"
    6.75 +         offset="1"
    6.76 +         id="stop4352" />
    6.77 +    </linearGradient>
    6.78 +    <linearGradient
    6.79 +       id="linearGradient4336">
    6.80 +      <stop
    6.81 +         style="stop-color:#f9f9f9;stop-opacity:1;"
    6.82 +         offset="0"
    6.83 +         id="stop4338" />
    6.84 +      <stop
    6.85 +         style="stop-color:#f9f9f9;stop-opacity:0;"
    6.86 +         offset="1"
    6.87 +         id="stop4340" />
    6.88 +    </linearGradient>
    6.89 +    <linearGradient
    6.90 +       id="linearGradient4048">
    6.91 +      <stop
    6.92 +         style="stop-color:#e0c700;stop-opacity:1;"
    6.93 +         offset="0"
    6.94 +         id="stop4050" />
    6.95 +      <stop
    6.96 +         id="stop4056"
    6.97 +         offset="0.27083334"
    6.98 +         style="stop-color:#ebd100;stop-opacity:1;" />
    6.99 +      <stop
   6.100 +         style="stop-color:#fce100;stop-opacity:1;"
   6.101 +         offset="0.63541669"
   6.102 +         id="stop4058" />
   6.103 +      <stop
   6.104 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.105 +         offset="1"
   6.106 +         id="stop4052" />
   6.107 +    </linearGradient>
   6.108 +    <linearGradient
   6.109 +       id="linearGradient3845">
   6.110 +      <stop
   6.111 +         style="stop-color:#e3e000;stop-opacity:0.58119661;"
   6.112 +         offset="0"
   6.113 +         id="stop3847" />
   6.114 +      <stop
   6.115 +         id="stop3853"
   6.116 +         offset="0.66666669"
   6.117 +         style="stop-color:#ffff3b;stop-opacity:0.52991456;" />
   6.118 +      <stop
   6.119 +         style="stop-color:#ffff65;stop-opacity:1;"
   6.120 +         offset="0.83333337"
   6.121 +         id="stop3913" />
   6.122 +      <stop
   6.123 +         style="stop-color:#ffff65;stop-opacity:1;"
   6.124 +         offset="1"
   6.125 +         id="stop3849" />
   6.126 +    </linearGradient>
   6.127 +    <linearGradient
   6.128 +       inkscape:collect="always"
   6.129 +       xlink:href="#linearGradient3845-4"
   6.130 +       id="linearGradient3851-7"
   6.131 +       x1="205"
   6.132 +       y1="194.26562"
   6.133 +       x2="330"
   6.134 +       y2="194.26562"
   6.135 +       gradientUnits="userSpaceOnUse" />
   6.136 +    <linearGradient
   6.137 +       id="linearGradient3845-4">
   6.138 +      <stop
   6.139 +         style="stop-color:#e3e000;stop-opacity:0.58119661;"
   6.140 +         offset="0"
   6.141 +         id="stop3847-0" />
   6.142 +      <stop
   6.143 +         id="stop3853-7"
   6.144 +         offset="0.66666669"
   6.145 +         style="stop-color:#ffff3b;stop-opacity:0.52991456;" />
   6.146 +      <stop
   6.147 +         style="stop-color:#ffff65;stop-opacity:1;"
   6.148 +         offset="0.83333337"
   6.149 +         id="stop3913-5" />
   6.150 +      <stop
   6.151 +         style="stop-color:#ffff65;stop-opacity:1;"
   6.152 +         offset="1"
   6.153 +         id="stop3849-0" />
   6.154 +    </linearGradient>
   6.155 +    <linearGradient
   6.156 +       inkscape:collect="always"
   6.157 +       xlink:href="#linearGradient4048-7"
   6.158 +       id="linearGradient4054-2"
   6.159 +       x1="205"
   6.160 +       y1="195"
   6.161 +       x2="330"
   6.162 +       y2="195"
   6.163 +       gradientUnits="userSpaceOnUse" />
   6.164 +    <linearGradient
   6.165 +       id="linearGradient4048-7">
   6.166 +      <stop
   6.167 +         style="stop-color:#9e8d00;stop-opacity:1;"
   6.168 +         offset="0"
   6.169 +         id="stop4050-8" />
   6.170 +      <stop
   6.171 +         id="stop4056-8"
   6.172 +         offset="0.27083334"
   6.173 +         style="stop-color:#d9c100;stop-opacity:1;" />
   6.174 +      <stop
   6.175 +         style="stop-color:#fce100;stop-opacity:1;"
   6.176 +         offset="0.63541669"
   6.177 +         id="stop4058-6" />
   6.178 +      <stop
   6.179 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.180 +         offset="1"
   6.181 +         id="stop4052-4" />
   6.182 +    </linearGradient>
   6.183 +    <linearGradient
   6.184 +       inkscape:collect="always"
   6.185 +       xlink:href="#linearGradient4048-2"
   6.186 +       id="linearGradient4054-26"
   6.187 +       x1="205"
   6.188 +       y1="195"
   6.189 +       x2="330"
   6.190 +       y2="195"
   6.191 +       gradientUnits="userSpaceOnUse" />
   6.192 +    <linearGradient
   6.193 +       id="linearGradient4048-2">
   6.194 +      <stop
   6.195 +         style="stop-color:#cfb800;stop-opacity:1;"
   6.196 +         offset="0"
   6.197 +         id="stop4050-81" />
   6.198 +      <stop
   6.199 +         id="stop4056-6"
   6.200 +         offset="0.27083334"
   6.201 +         style="stop-color:#d9c100;stop-opacity:1;" />
   6.202 +      <stop
   6.203 +         style="stop-color:#fce100;stop-opacity:1;"
   6.204 +         offset="0.63541669"
   6.205 +         id="stop4058-4" />
   6.206 +      <stop
   6.207 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.208 +         offset="1"
   6.209 +         id="stop4052-9" />
   6.210 +    </linearGradient>
   6.211 +    <linearGradient
   6.212 +       inkscape:collect="always"
   6.213 +       xlink:href="#linearGradient4048-6"
   6.214 +       id="linearGradient4054-0"
   6.215 +       x1="205"
   6.216 +       y1="195"
   6.217 +       x2="330"
   6.218 +       y2="195"
   6.219 +       gradientUnits="userSpaceOnUse" />
   6.220 +    <linearGradient
   6.221 +       id="linearGradient4048-6">
   6.222 +      <stop
   6.223 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.224 +         offset="0"
   6.225 +         id="stop4050-3" />
   6.226 +      <stop
   6.227 +         id="stop4056-86"
   6.228 +         offset="0.27083334"
   6.229 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.230 +      <stop
   6.231 +         style="stop-color:#fce100;stop-opacity:1;"
   6.232 +         offset="0.63541669"
   6.233 +         id="stop4058-3" />
   6.234 +      <stop
   6.235 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.236 +         offset="1"
   6.237 +         id="stop4052-93" />
   6.238 +    </linearGradient>
   6.239 +    <linearGradient
   6.240 +       inkscape:collect="always"
   6.241 +       xlink:href="#linearGradient4048"
   6.242 +       id="linearGradient4184"
   6.243 +       gradientUnits="userSpaceOnUse"
   6.244 +       x1="205"
   6.245 +       y1="195"
   6.246 +       x2="330"
   6.247 +       y2="195" />
   6.248 +    <linearGradient
   6.249 +       inkscape:collect="always"
   6.250 +       xlink:href="#linearGradient4048-6"
   6.251 +       id="linearGradient4186"
   6.252 +       gradientUnits="userSpaceOnUse"
   6.253 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.254 +       x1="205"
   6.255 +       y1="195"
   6.256 +       x2="330"
   6.257 +       y2="195" />
   6.258 +    <clipPath
   6.259 +       clipPathUnits="userSpaceOnUse"
   6.260 +       id="clipPath4222">
   6.261 +      <path
   6.262 +         sodipodi:type="star"
   6.263 +         style="fill:#008000;fill-opacity:1"
   6.264 +         id="path4224"
   6.265 +         sodipodi:sides="8"
   6.266 +         sodipodi:cx="119"
   6.267 +         sodipodi:cy="143"
   6.268 +         sodipodi:r1="102"
   6.269 +         sodipodi:r2="94.23571"
   6.270 +         sodipodi:arg1="0"
   6.271 +         sodipodi:arg2="0.39269908"
   6.272 +         inkscape:flatsided="true"
   6.273 +         inkscape:rounded="0"
   6.274 +         inkscape:randomized="0"
   6.275 +         d="M 221,143 191.12489,215.12489 119,245 46.875108,215.12489 17,143 46.875108,70.875108 119,41 191.12489,70.875108 z"
   6.276 +         transform="translate(-111.43993,46.15993)" />
   6.277 +    </clipPath>
   6.278 +    <clipPath
   6.279 +       clipPathUnits="userSpaceOnUse"
   6.280 +       id="clipPath4222-3">
   6.281 +      <path
   6.282 +         sodipodi:type="star"
   6.283 +         style="fill:#008000;fill-opacity:1"
   6.284 +         id="path4224-2"
   6.285 +         sodipodi:sides="8"
   6.286 +         sodipodi:cx="119"
   6.287 +         sodipodi:cy="143"
   6.288 +         sodipodi:r1="102"
   6.289 +         sodipodi:r2="94.23571"
   6.290 +         sodipodi:arg1="0"
   6.291 +         sodipodi:arg2="0.39269908"
   6.292 +         inkscape:flatsided="true"
   6.293 +         inkscape:rounded="0"
   6.294 +         inkscape:randomized="0"
   6.295 +         d="M 221,143 191.12489,215.12489 119,245 46.875108,215.12489 17,143 46.875108,70.875108 119,41 191.12489,70.875108 z"
   6.296 +         transform="translate(-111.43993,46.15993)" />
   6.297 +    </clipPath>
   6.298 +    <linearGradient
   6.299 +       inkscape:collect="always"
   6.300 +       xlink:href="#linearGradient4348"
   6.301 +       id="linearGradient4354"
   6.302 +       x1="217"
   6.303 +       y1="838.86218"
   6.304 +       x2="246"
   6.305 +       y2="838.86218"
   6.306 +       gradientUnits="userSpaceOnUse" />
   6.307 +    <linearGradient
   6.308 +       inkscape:collect="always"
   6.309 +       xlink:href="#linearGradient4376"
   6.310 +       id="linearGradient4382"
   6.311 +       x1="170"
   6.312 +       y1="188"
   6.313 +       x2="193"
   6.314 +       y2="188"
   6.315 +       gradientUnits="userSpaceOnUse" />
   6.316 +    <linearGradient
   6.317 +       inkscape:collect="always"
   6.318 +       xlink:href="#linearGradient4048-60"
   6.319 +       id="linearGradient4184-8"
   6.320 +       gradientUnits="userSpaceOnUse"
   6.321 +       x1="205"
   6.322 +       y1="195"
   6.323 +       x2="330"
   6.324 +       y2="195" />
   6.325 +    <linearGradient
   6.326 +       id="linearGradient4048-60">
   6.327 +      <stop
   6.328 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.329 +         offset="0"
   6.330 +         id="stop4050-9" />
   6.331 +      <stop
   6.332 +         id="stop4056-1"
   6.333 +         offset="0.27083334"
   6.334 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.335 +      <stop
   6.336 +         style="stop-color:#fce100;stop-opacity:1;"
   6.337 +         offset="0.63541669"
   6.338 +         id="stop4058-31" />
   6.339 +      <stop
   6.340 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.341 +         offset="1"
   6.342 +         id="stop4052-8" />
   6.343 +    </linearGradient>
   6.344 +    <linearGradient
   6.345 +       inkscape:collect="always"
   6.346 +       xlink:href="#linearGradient4048-6-4"
   6.347 +       id="linearGradient4186-9"
   6.348 +       gradientUnits="userSpaceOnUse"
   6.349 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.350 +       x1="205"
   6.351 +       y1="195"
   6.352 +       x2="330"
   6.353 +       y2="195" />
   6.354 +    <linearGradient
   6.355 +       id="linearGradient4048-6-4">
   6.356 +      <stop
   6.357 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.358 +         offset="0"
   6.359 +         id="stop4050-3-3" />
   6.360 +      <stop
   6.361 +         id="stop4056-86-7"
   6.362 +         offset="0.27083334"
   6.363 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.364 +      <stop
   6.365 +         style="stop-color:#fce100;stop-opacity:1;"
   6.366 +         offset="0.63541669"
   6.367 +         id="stop4058-3-5" />
   6.368 +      <stop
   6.369 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.370 +         offset="1"
   6.371 +         id="stop4052-93-1" />
   6.372 +    </linearGradient>
   6.373 +    <linearGradient
   6.374 +       y2="195"
   6.375 +       x2="330"
   6.376 +       y1="195"
   6.377 +       x1="205"
   6.378 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.379 +       gradientUnits="userSpaceOnUse"
   6.380 +       id="linearGradient5318"
   6.381 +       xlink:href="#linearGradient4048-6-4"
   6.382 +       inkscape:collect="always" />
   6.383 +    <linearGradient
   6.384 +       id="linearGradient4048-4">
   6.385 +      <stop
   6.386 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.387 +         offset="0"
   6.388 +         id="stop4050-30" />
   6.389 +      <stop
   6.390 +         id="stop4056-4"
   6.391 +         offset="0.27083334"
   6.392 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.393 +      <stop
   6.394 +         style="stop-color:#fce100;stop-opacity:1;"
   6.395 +         offset="0.63541669"
   6.396 +         id="stop4058-7" />
   6.397 +      <stop
   6.398 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.399 +         offset="1"
   6.400 +         id="stop4052-7" />
   6.401 +    </linearGradient>
   6.402 +    <linearGradient
   6.403 +       inkscape:collect="always"
   6.404 +       xlink:href="#linearGradient4048-6-46"
   6.405 +       id="linearGradient4186-2"
   6.406 +       gradientUnits="userSpaceOnUse"
   6.407 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.408 +       x1="205"
   6.409 +       y1="195"
   6.410 +       x2="330"
   6.411 +       y2="195" />
   6.412 +    <linearGradient
   6.413 +       id="linearGradient4048-6-46">
   6.414 +      <stop
   6.415 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.416 +         offset="0"
   6.417 +         id="stop4050-3-6" />
   6.418 +      <stop
   6.419 +         id="stop4056-86-4"
   6.420 +         offset="0.27083334"
   6.421 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.422 +      <stop
   6.423 +         style="stop-color:#fce100;stop-opacity:1;"
   6.424 +         offset="0.63541669"
   6.425 +         id="stop4058-3-8" />
   6.426 +      <stop
   6.427 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.428 +         offset="1"
   6.429 +         id="stop4052-93-3" />
   6.430 +    </linearGradient>
   6.431 +    <linearGradient
   6.432 +       inkscape:collect="always"
   6.433 +       xlink:href="#linearGradient4048-5"
   6.434 +       id="linearGradient4184-7"
   6.435 +       gradientUnits="userSpaceOnUse"
   6.436 +       x1="205"
   6.437 +       y1="195"
   6.438 +       x2="330"
   6.439 +       y2="195" />
   6.440 +    <linearGradient
   6.441 +       id="linearGradient4048-5">
   6.442 +      <stop
   6.443 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.444 +         offset="0"
   6.445 +         id="stop4050-2" />
   6.446 +      <stop
   6.447 +         id="stop4056-9"
   6.448 +         offset="0.27083334"
   6.449 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.450 +      <stop
   6.451 +         style="stop-color:#fce100;stop-opacity:1;"
   6.452 +         offset="0.63541669"
   6.453 +         id="stop4058-9" />
   6.454 +      <stop
   6.455 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.456 +         offset="1"
   6.457 +         id="stop4052-88" />
   6.458 +    </linearGradient>
   6.459 +    <linearGradient
   6.460 +       inkscape:collect="always"
   6.461 +       xlink:href="#linearGradient4048-6-3"
   6.462 +       id="linearGradient4186-4"
   6.463 +       gradientUnits="userSpaceOnUse"
   6.464 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.465 +       x1="205"
   6.466 +       y1="195"
   6.467 +       x2="330"
   6.468 +       y2="195" />
   6.469 +    <linearGradient
   6.470 +       id="linearGradient4048-6-3">
   6.471 +      <stop
   6.472 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.473 +         offset="0"
   6.474 +         id="stop4050-3-1" />
   6.475 +      <stop
   6.476 +         id="stop4056-86-3"
   6.477 +         offset="0.27083334"
   6.478 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.479 +      <stop
   6.480 +         style="stop-color:#fce100;stop-opacity:1;"
   6.481 +         offset="0.63541669"
   6.482 +         id="stop4058-3-2" />
   6.483 +      <stop
   6.484 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.485 +         offset="1"
   6.486 +         id="stop4052-93-0" />
   6.487 +    </linearGradient>
   6.488 +    <linearGradient
   6.489 +       y2="195"
   6.490 +       x2="330"
   6.491 +       y1="195"
   6.492 +       x1="205"
   6.493 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.494 +       gradientUnits="userSpaceOnUse"
   6.495 +       id="linearGradient7857"
   6.496 +       xlink:href="#linearGradient4048-6-3"
   6.497 +       inkscape:collect="always" />
   6.498 +    <linearGradient
   6.499 +       inkscape:collect="always"
   6.500 +       xlink:href="#linearGradient4048"
   6.501 +       id="linearGradient8538"
   6.502 +       gradientUnits="userSpaceOnUse"
   6.503 +       x1="205"
   6.504 +       y1="195"
   6.505 +       x2="330"
   6.506 +       y2="195" />
   6.507 +    <linearGradient
   6.508 +       inkscape:collect="always"
   6.509 +       xlink:href="#linearGradient4048-6"
   6.510 +       id="linearGradient8540"
   6.511 +       gradientUnits="userSpaceOnUse"
   6.512 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.513 +       x1="205"
   6.514 +       y1="195"
   6.515 +       x2="330"
   6.516 +       y2="195" />
   6.517 +    <linearGradient
   6.518 +       inkscape:collect="always"
   6.519 +       xlink:href="#linearGradient4048"
   6.520 +       id="linearGradient8550"
   6.521 +       gradientUnits="userSpaceOnUse"
   6.522 +       x1="205"
   6.523 +       y1="195"
   6.524 +       x2="330"
   6.525 +       y2="195" />
   6.526 +    <linearGradient
   6.527 +       inkscape:collect="always"
   6.528 +       xlink:href="#linearGradient4048-6"
   6.529 +       id="linearGradient8552"
   6.530 +       gradientUnits="userSpaceOnUse"
   6.531 +       gradientTransform="matrix(-1,0,0,1,410,652.36218)"
   6.532 +       x1="205"
   6.533 +       y1="195"
   6.534 +       x2="330"
   6.535 +       y2="195" />
   6.536 +    <linearGradient
   6.537 +       inkscape:collect="always"
   6.538 +       xlink:href="#linearGradient4048-6"
   6.539 +       id="linearGradient8555"
   6.540 +       gradientUnits="userSpaceOnUse"
   6.541 +       gradientTransform="matrix(-1,0,0,1,410,636.36218)"
   6.542 +       x1="205"
   6.543 +       y1="195"
   6.544 +       x2="330"
   6.545 +       y2="195" />
   6.546 +    <linearGradient
   6.547 +       inkscape:collect="always"
   6.548 +       xlink:href="#linearGradient4048"
   6.549 +       id="linearGradient8558"
   6.550 +       gradientUnits="userSpaceOnUse"
   6.551 +       x1="205"
   6.552 +       y1="195"
   6.553 +       x2="330"
   6.554 +       y2="195"
   6.555 +       gradientTransform="translate(0,636.36218)" />
   6.556 +    <linearGradient
   6.557 +       inkscape:collect="always"
   6.558 +       xlink:href="#linearGradient4048-25"
   6.559 +       id="linearGradient8558-8"
   6.560 +       gradientUnits="userSpaceOnUse"
   6.561 +       x1="205"
   6.562 +       y1="195"
   6.563 +       x2="330"
   6.564 +       y2="195"
   6.565 +       gradientTransform="translate(0,636.36218)" />
   6.566 +    <linearGradient
   6.567 +       id="linearGradient4048-25">
   6.568 +      <stop
   6.569 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.570 +         offset="0"
   6.571 +         id="stop4050-5" />
   6.572 +      <stop
   6.573 +         id="stop4056-7"
   6.574 +         offset="0.27083334"
   6.575 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.576 +      <stop
   6.577 +         style="stop-color:#fce100;stop-opacity:1;"
   6.578 +         offset="0.63541669"
   6.579 +         id="stop4058-0" />
   6.580 +      <stop
   6.581 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.582 +         offset="1"
   6.583 +         id="stop4052-2" />
   6.584 +    </linearGradient>
   6.585 +    <linearGradient
   6.586 +       inkscape:collect="always"
   6.587 +       xlink:href="#linearGradient4048-6-8"
   6.588 +       id="linearGradient8555-6"
   6.589 +       gradientUnits="userSpaceOnUse"
   6.590 +       gradientTransform="matrix(-0.99999999,0,0,1,410,626.36218)"
   6.591 +       x1="205"
   6.592 +       y1="195"
   6.593 +       x2="330"
   6.594 +       y2="195" />
   6.595 +    <linearGradient
   6.596 +       id="linearGradient4048-6-8">
   6.597 +      <stop
   6.598 +         style="stop-color:#e0c700;stop-opacity:1;"
   6.599 +         offset="0"
   6.600 +         id="stop4050-3-9" />
   6.601 +      <stop
   6.602 +         id="stop4056-86-78"
   6.603 +         offset="0.27083334"
   6.604 +         style="stop-color:#ebd100;stop-opacity:1;" />
   6.605 +      <stop
   6.606 +         style="stop-color:#fce100;stop-opacity:1;"
   6.607 +         offset="0.63541669"
   6.608 +         id="stop4058-3-9" />
   6.609 +      <stop
   6.610 +         style="stop-color:#ffe300;stop-opacity:1;"
   6.611 +         offset="1"
   6.612 +         id="stop4052-93-6" />
   6.613 +    </linearGradient>
   6.614 +    <linearGradient
   6.615 +       y2="195"
   6.616 +       x2="330"
   6.617 +       y1="195"
   6.618 +       x1="205"
   6.619 +       gradientTransform="translate(-6.04e-6,626.36218)"
   6.620 +       gradientUnits="userSpaceOnUse"
   6.621 +       id="linearGradient8584"
   6.622 +       xlink:href="#linearGradient4048-25"
   6.623 +       inkscape:collect="always" />
   6.624 +  </defs>
   6.625 +  <metadata
   6.626 +     id="metadata7">
   6.627 +    <rdf:RDF>
   6.628 +      <cc:Work
   6.629 +         rdf:about="">
   6.630 +        <dc:format>image/svg+xml</dc:format>
   6.631 +        <dc:type
   6.632 +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
   6.633 +        <dc:title></dc:title>
   6.634 +      </cc:Work>
   6.635 +    </rdf:RDF>
   6.636 +  </metadata>
   6.637 +  <g
   6.638 +     inkscape:label="Layer 1"
   6.639 +     inkscape:groupmode="layer"
   6.640 +     id="layer1"
   6.641 +     transform="translate(-59.999997,-686.36218)">
   6.642 +    <g
   6.643 +       id="g10687">
   6.644 +      <path
   6.645 +         id="path3999-6"
   6.646 +         d="m 205,706.36218 0,250 51.78125,0 L 330,883.14343 l 0,-103.5625 -73.21875,-73.21875 -51.78125,0 z"
   6.647 +         style="fill:url(#linearGradient8558);fill-opacity:1"
   6.648 +         inkscape:connector-curvature="0" />
   6.649 +      <path
   6.650 +         id="path3999-6-6"
   6.651 +         d="m 205,706.36218 0,250 -51.78125,0 L 80,883.14343 l 0,-103.5625 73.21875,-73.21875 51.78125,0 z"
   6.652 +         style="fill:url(#linearGradient8555);fill-opacity:1"
   6.653 +         inkscape:connector-curvature="0" />
   6.654 +    </g>
   6.655 +    <path
   6.656 +       inkscape:connector-curvature="0"
   6.657 +       id="path4388"
   6.658 +       d="m 257,808.4383 0,53.84777 -17.57359,38.07611 -24.85282,0 L 197,862.28606 l 0,-53.84776 17.57359,-38.07612 24.85282,0 z"
   6.659 +       style="fill:#f9f9f9;fill-opacity:1" />
   6.660 +    <path
   6.661 +       inkscape:connector-curvature="0"
   6.662 +       id="path4388-3"
   6.663 +       d="m 214.99999,808.4383 0,53.84777 -17.57359,38.07611 -24.85281,0 -17.5736,-38.07612 0,-53.84776 17.57359,-38.07612 24.85282,0 z"
   6.664 +       style="fill:#f9f9f9;fill-opacity:1" />
   6.665 +    <path
   6.666 +       inkscape:connector-curvature="0"
   6.667 +       id="path4388-3-2"
   6.668 +       d="m 199,830.42105 0,19.88225 -6.44365,14.05888 -9.1127,0 L 177,850.3033 l 0,-19.88225 6.44365,-14.05887 9.1127,0 z"
   6.669 +       style="fill:#000000;fill-opacity:1" />
   6.670 +    <path
   6.671 +       inkscape:connector-curvature="0"
   6.672 +       id="path4388-3-2-3"
   6.673 +       d="m 237,830.42105 0,19.88225 -6.44365,14.05888 -9.1127,0 L 215,850.3033 l 0,-19.88225 6.44365,-14.05887 9.1127,0 z"
   6.674 +       style="fill:#000000;fill-opacity:1" />
   6.675 +    <path
   6.676 +       style="fill:#ff8b00;fill-opacity:1;stroke:none"
   6.677 +       d="m 302.02397,911.28458 -45.24272,45.0776 -103.38652,0 -44.35762,-45.0776 44.35762,-44.85924 103.21095,0 z"
   6.678 +       id="path7828"
   6.679 +       inkscape:connector-curvature="0"
   6.680 +       sodipodi:nodetypes="ccccccc" />
   6.681 +  </g>
   6.682 +</svg>
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/components/hero.jsx	Sun May 03 23:25:12 2015 -0400
     7.3 @@ -0,0 +1,20 @@
     7.4 +import React from 'react'
     7.5 +import heroStyles from '../styles/hero.scss'
     7.6 +
     7.7 +export default React.createClass({
     7.8 +  displayName: 'HeroUnit',
     7.9 +
    7.10 +  render () {
    7.11 +    return (
    7.12 +      <div className='hero'>
    7.13 +        <div className='hero-inner'>
    7.14 +          <img src={require('./ducky.svg')} className='hero-logo'/>
    7.15 +          <div className='hero-copy'>
    7.16 +            <h1>{this.props.title}</h1>
    7.17 +            <p>{this.props.children}</p>
    7.18 +          </div>
    7.19 +        </div>
    7.20 +      </div>
    7.21 +    )
    7.22 +  }
    7.23 +})
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/src/config.js	Sun May 03 23:25:12 2015 -0400
     8.3 @@ -0,0 +1,5 @@
     8.4 +export default {
     8.5 +  'urlBase': 'http://slightly.local:8080',
     8.6 +  'clientID': '881eeaaf-42d8-4212-a727-b33f23d5c526',
     8.7 +  'clientSecret': '2df53f4b9e4cb588821f6a3a8c65990b6416fc568b7836199594ebfbf7d1c0ca',
     8.8 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/src/main.js	Sun May 03 23:25:12 2015 -0400
     9.3 @@ -0,0 +1,17 @@
     9.4 +import app from 'ampersand-app'
     9.5 +import Router from './router'
     9.6 +import Profiles from './models/profiles'
     9.7 +import Me from './models/me'
     9.8 +import normalize from 'normalize.css/normalize.css'
     9.9 +import styles from './styles/main.scss'
    9.10 +
    9.11 +window.app = app.extend({
    9.12 +  init () {
    9.13 +    this.profiles = new Profiles()
    9.14 +    this.me = new Me()
    9.15 +    this.router = new Router()
    9.16 +    this.router.history.start({ pushState: true })
    9.17 +  }
    9.18 +})
    9.19 +
    9.20 +app.init()
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/src/models/me.js	Sun May 03 23:25:12 2015 -0400
    10.3 @@ -0,0 +1,70 @@
    10.4 +import Model from 'ampersand-model'
    10.5 +import Sync from 'ampersand-sync'
    10.6 +import qs from 'qs'
    10.7 +import config from '../config'
    10.8 +import isObject from 'lodash.isobject'
    10.9 +
   10.10 +export default Model.extend({
   10.11 +  url: config.urlBase + '/token',
   10.12 +  ajaxConfig: {
   10.13 +    headers: {
   10.14 +      'Content-Type': 'application/x-www-form-urlencoded',
   10.15 +      'Authorization': 'Basic ' + btoa(config.clientID + ':' + config.clientSecret),
   10.16 +    }
   10.17 +  },
   10.18 +
   10.19 +  props: {
   10.20 +    access_token: 'string',
   10.21 +    refresh_token: 'string',
   10.22 +    expires_in: 'int',
   10.23 +    token_created: 'date',
   10.24 +    name: 'string',
   10.25 +  },
   10.26 +
   10.27 +  derived: {
   10.28 +    loggedIn () {
   10.29 +      return !!this.access_token
   10.30 +    },
   10.31 +    needsRefresh () {
   10.32 +      let d = this.token_created
   10.33 +      return !!this.refresh_token && (new Date() >= d.setSeconds(d.getSeconds() + this.expires_in - 900))
   10.34 +    },
   10.35 +  },
   10.36 +
   10.37 +  login (email, password) {
   10.38 +    let options = {
   10.39 +      data: qs.stringify({
   10.40 +        'username': email,
   10.41 +        'password': password,
   10.42 +        'grant_type': 'password',
   10.43 +      }),
   10.44 +    }
   10.45 +    let moc = this
   10.46 +    options.success = function(resp) {
   10.47 +      if (!resp.access_token) {
   10.48 +        return false
   10.49 +      }
   10.50 +      let serverAttrs = moc.parse(resp, options)
   10.51 +      serverAttrs.token_created = new Date()
   10.52 +      console.log(serverAttrs)
   10.53 +      if (options.wait) serverAttrs = assign({}, serverAttrs)
   10.54 +      if (isObject(serverAttrs) && !moc.set(serverAttrs, options)) {
   10.55 +        return false
   10.56 +      }
   10.57 +      moc.trigger('sync', moc, resp, options)
   10.58 +    }
   10.59 +    options.error = function(resp) {
   10.60 +      moc.trigger('error', moc, resp, options)
   10.61 +    }
   10.62 +    let sync = Sync('create', moc, options)
   10.63 +  },
   10.64 +
   10.65 +  writeToCache () {
   10.66 +    // TODO: write this to chrome.storage.local
   10.67 +  },
   10.68 +
   10.69 +  logout () {
   10.70 +    // TODO: clear all cached data
   10.71 +  },
   10.72 +
   10.73 +})
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/src/models/profile.js	Sun May 03 23:25:12 2015 -0400
    11.3 @@ -0,0 +1,10 @@
    11.4 +import Model from 'ampersand-model'
    11.5 +
    11.6 +export default Model.extend({
    11.7 +  props: {
    11.8 +    'id': 'string',
    11.9 +    'name': 'string',
   11.10 +    'created': 'date',
   11.11 +    'last_seen': 'date',
   11.12 +  },
   11.13 +})
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/src/models/profiles.js	Sun May 03 23:25:12 2015 -0400
    12.3 @@ -0,0 +1,41 @@
    12.4 +import Collection from 'ampersand-collection'
    12.5 +import Sync from 'ampersand-sync'
    12.6 +import Profile from './profile'
    12.7 +import config from '../config'
    12.8 +import isObject from 'lodash.isobject'
    12.9 +
   12.10 +export default Collection.extend({
   12.11 +  model: Profile,
   12.12 +  url: config.urlBase + '/profiles',
   12.13 +  ajaxConfig: {
   12.14 +    headers: {
   12.15 +      'Content-Type': 'application/json',
   12.16 +    }
   12.17 +  },
   12.18 +
   12.19 +  register (email, passphrase) {
   12.20 +    let options = {
   12.21 +      data: JSON.stringify({
   12.22 +        'email': email,
   12.23 +        'passphrase': passphrase,
   12.24 +      })
   12.25 +    }
   12.26 +    let moc = this
   12.27 +    options.success = function(resp) {
   12.28 +      if (!resp.profiles || resp.profiles.length < 1) {
   12.29 +        return false
   12.30 +      }
   12.31 +      let serverAttrs = moc.parse(resp.profiles[0], options)
   12.32 +      if (options.wait) serverAttrs = assign({}, serverAttrs)
   12.33 +      if (isObject(serverAttrs) && !moc.add(serverAttrs, options)) {
   12.34 +        return false
   12.35 +      }
   12.36 +      moc.trigger('sync', moc, resp, options)
   12.37 +    }
   12.38 +    options.error = function(resp) {
   12.39 +      moc.trigger('error', moc, resp, options)
   12.40 +    }
   12.41 +    let sync = Sync('create', moc, options)
   12.42 +    return sync
   12.43 +  },
   12.44 +})
    13.1 Binary file src/pages/.register.jsx.swp has changed
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/src/pages/login.jsx	Sun May 03 23:25:12 2015 -0400
    14.3 @@ -0,0 +1,50 @@
    14.4 +import app from 'ampersand-app'
    14.5 +import React from 'react'
    14.6 +import localLinks from 'local-links'
    14.7 +import LaddaButton from 'react-ladda'
    14.8 +import LaddaCSS from '../../node_modules/ladda/dist/ladda.min.css'
    14.9 +import HeroUnit from '../components/hero'
   14.10 +import onboardingStyles from '../styles/onboarding.scss'
   14.11 +
   14.12 +export default React.createClass({
   14.13 +  displayName: 'LoginPage',
   14.14 +
   14.15 +  getInitialState () {
   14.16 +    return {active: false, progress: 0}
   14.17 +  },
   14.18 +
   14.19 +  toggle () {
   14.20 +    this.setState({active: !this.state.active})
   14.21 +  },
   14.22 +
   14.23 +  onBackClick (event) {
   14.24 +    event.preventDefault()
   14.25 +    window.history.back()
   14.26 +  },
   14.27 +
   14.28 +  render () {
   14.29 +    return (
   14.30 +      <div className='container'>
   14.31 +        <HeroUnit title='Welcome Back'>We missed you.</HeroUnit>
   14.32 +        <article className='onboarding login'>
   14.33 +          <form>
   14.34 +            <div>
   14.35 +              <label htmlFor='emailLoginInput'>Email</label>
   14.36 +              <input id='emailLoginInput' type='email'/>
   14.37 +
   14.38 +              <label htmlFor='passwordLoginInput'>Passphrase</label>
   14.39 +              <input id='passwordLoginInput' type='password'/>
   14.40 +
   14.41 +            </div>
   14.42 +          </form>
   14.43 +          <div className='actionbuttons'>
   14.44 +            <button onClick={this.onBackClick}>Back</button>
   14.45 +            <LaddaButton style='expand-right' active={this.state.active} progress={this.state.progress}>
   14.46 +              <button onClick={this.toggle} className='primary'>Login</button>
   14.47 +            </LaddaButton>
   14.48 +          </div>
   14.49 +        </article>
   14.50 +      </div>
   14.51 +    )
   14.52 +  }
   14.53 +})
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/src/pages/message.jsx	Sun May 03 23:25:12 2015 -0400
    15.3 @@ -0,0 +1,20 @@
    15.4 +import React from 'react'
    15.5 +
    15.6 +export default React.createClass({
    15.7 +  displayName: 'ErrorPage',
    15.8 +
    15.9 +  propTypes: {
   15.10 +    title: React.PropTypes.string,
   15.11 +    message: React.PropTypes.string.isRequired
   15.12 +  },
   15.13 +
   15.14 +  render () {
   15.15 +    const {title, message} = this.props
   15.16 +    return (
   15.17 +      <div>
   15.18 +        <h1>{title}</h1>
   15.19 +        <p>{message}</p>
   15.20 +      </div>
   15.21 +    )
   15.22 +  }
   15.23 +})
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/src/pages/onboard.jsx	Sun May 03 23:25:12 2015 -0400
    16.3 @@ -0,0 +1,35 @@
    16.4 +import app from 'ampersand-app'
    16.5 +import React from 'react'
    16.6 +import localLinks from 'local-links'
    16.7 +import HeroUnit from '../components/hero'
    16.8 +import onboardStyles from '../styles/onboarding.scss'
    16.9 +
   16.10 +export default React.createClass({
   16.11 +  displayName: 'OnboardingPage',
   16.12 +
   16.13 +  onLoginClick (event) {
   16.14 +    event.preventDefault()
   16.15 +    app.router.navigate('/login')
   16.16 +  },
   16.17 +
   16.18 +  onRegisterClick (event) {
   16.19 +    event.preventDefault()
   16.20 +    app.router.navigate('/register')
   16.21 +  },
   16.22 +
   16.23 +  render () {
   16.24 +    return (
   16.25 +      <div className='container'>
   16.26 +        <HeroUnit title='Welcome to Ducky' settings='true'>Let’s get our ducks in a row.</HeroUnit>
   16.27 +        <article className='onboarding'>
   16.28 +          <p>We’re just as excited as you are, but we need some more information before we can do anything. Don’t worry, this won’t take long</p>
   16.29 +          <p>First of all, who <em>are</em> you? If you have a Ducky account already, we need you to sign in. If you don’t have one, don’t sweat it. Click that fancy “Register” button below.</p>
   16.30 +          <div className='actionbuttons'>
   16.31 +            <button onClick={this.onLoginClick}>Sign in</button>
   16.32 +            <button onClick={this.onRegisterClick}>Register</button>
   16.33 +          </div>
   16.34 +        </article>
   16.35 +      </div>
   16.36 +    )
   16.37 +  }
   16.38 +})
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/src/pages/register.jsx	Sun May 03 23:25:12 2015 -0400
    17.3 @@ -0,0 +1,80 @@
    17.4 +import app from 'ampersand-app'
    17.5 +import React from 'react/addons'
    17.6 +import localLinks from 'local-links'
    17.7 +import LaddaButton from 'react-ladda'
    17.8 +import LaddaCSS from '../../node_modules/ladda/dist/ladda.min.css'
    17.9 +import HeroUnit from '../components/hero'
   17.10 +import onboardingStyles from '../styles/onboarding.scss'
   17.11 +
   17.12 +export default React.createClass({
   17.13 +  displayName: 'RegisterPage',
   17.14 +  mixins: [React.addons.LinkedStateMixin],
   17.15 +
   17.16 +  getInitialState () {
   17.17 +    return {
   17.18 +      email: null,
   17.19 +      emailConfirmation: null,
   17.20 +      passphrase: null,
   17.21 +      passphraseConfirmation: null,
   17.22 +      active: false,
   17.23 +      valid: false,
   17.24 +    }
   17.25 +  },
   17.26 +
   17.27 +  componentDidMount () {
   17.28 +    app.profiles.on('request', (moc, xhr, options) => {
   17.29 +      this.setState({active: true})
   17.30 +    })
   17.31 +    app.profiles.on('error', (moc, xhr, options) => {
   17.32 +      this.setState({active: false})
   17.33 +    })
   17.34 +    app.profiles.on('sync', (moc, xhr, options) => {
   17.35 +      app.me.login(this.state.email, this.state.passphrase)
   17.36 +    })
   17.37 +    app.me.on('sync', (moc, xhr, options) => {
   17.38 +      this.setState({active: false})
   17.39 +      console.log("logged in, continuing on to billing")
   17.40 +    })
   17.41 +  },
   17.42 +
   17.43 +  register (e) {
   17.44 +    e.preventDefault()
   17.45 +    app.profiles.register(this.state.email, this.state.passphrase)
   17.46 +  },
   17.47 +
   17.48 +  onBackClick (event) {
   17.49 +    event.preventDefault()
   17.50 +    window.history.back()
   17.51 +  },
   17.52 +
   17.53 +  render () {
   17.54 +    return (
   17.55 +      <div className='container'>
   17.56 +        <HeroUnit title='Create an Account'>We’d like to get to know you better.</HeroUnit>
   17.57 +        <article className='onboarding register'>
   17.58 +          <form onSubmit={this.register}>
   17.59 +            <div>
   17.60 +              <label htmlFor='emailRegisterInput'>Email</label>
   17.61 +              <input id='emailRegisterInput' type='email' placeholder='Ours is quack@useducky.com' valueLink={this.linkState('email')} disabled={this.state.active} />
   17.62 +
   17.63 +              <label htmlFor='emailVerificationInput'>Verify Email</label>
   17.64 +              <input id='emailVerificationInput' type='email' placeholder='Typos are the absolute worst.' valueLink={this.linkState('emailConfirmation')} disabled={this.state.active} />
   17.65 +
   17.66 +              <label htmlFor='passwordRegisterInput'>Passphrase</label>
   17.67 +              <input id='passwordRegisterInput' type='password' placeholder='We use a sentence. Try it!' valueLink={this.linkState('passphrase')} disabled={this.state.active} />
   17.68 +
   17.69 +              <label htmlFor='passwordVerificationInput'>Verify Passphrase</label>
   17.70 +              <input id='passwordVerificationInput' type='password' placeholder='Just to make sure you know it.' valueLink={this.linkState('passphraseConfirmation')} disabled={this.state.active} />
   17.71 +            </div>
   17.72 +            <div className='actionbuttons'>
   17.73 +              <button onClick={this.onBackClick} disabled={this.state.active} type='button' className='ladda-button'>Back</button>
   17.74 +              <LaddaButton style='expand-right' active={this.state.active}>
   17.75 +                <button type='submit' className='primary' disabled={this.state.active || !this.state.valid}>Register</button>
   17.76 +              </LaddaButton>
   17.77 +            </div>
   17.78 +          </form>
   17.79 +        </article>
   17.80 +      </div>
   17.81 +    )
   17.82 +  }
   17.83 +})
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/src/router.jsx	Sun May 03 23:25:12 2015 -0400
    18.3 @@ -0,0 +1,37 @@
    18.4 +import Router from 'ampersand-router'
    18.5 +import React from 'react'
    18.6 +import MessagePage from './pages/message'
    18.7 +import OnboardingPage from './pages/onboard'
    18.8 +import RegisterPage from './pages/register'
    18.9 +import LoginPage from './pages/login'
   18.10 +
   18.11 +export default Router.extend({
   18.12 +  routes: {
   18.13 +    '': 'home',
   18.14 +    'register': 'register',
   18.15 +    'login': 'login',
   18.16 +    'logout': 'logout',
   18.17 +    '*404': 'fourOhFour'
   18.18 +  },
   18.19 +
   18.20 +  home () {
   18.21 +    React.render(<OnboardingPage/>, document.body)
   18.22 +  },
   18.23 +
   18.24 +  register () {
   18.25 +    React.render(<RegisterPage/>, document.body)
   18.26 +  },
   18.27 +
   18.28 +  login () {
   18.29 +    React.render(<LoginPage/>, document.body)
   18.30 +  },
   18.31 +
   18.32 +  logout () {
   18.33 +    window.localStorage.clear()
   18.34 +    window.location = '/'
   18.35 +  },
   18.36 +
   18.37 +  fourOhFour () {
   18.38 +    this.renderPage(MessagePage, {title: '404', message: 'Oops. Page not found.'})
   18.39 +  }
   18.40 +})
    19.1 Binary file src/styles/._button.scss.swp has changed
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/src/styles/_button.scss	Sun May 03 23:25:12 2015 -0400
    20.3 @@ -0,0 +1,31 @@
    20.4 +@import 'bourbon';
    20.5 +@import 'base/base';
    20.6 +
    20.7 +$primary-button-color: #3FA743;
    20.8 +$base-button-color: $blue;
    20.9 +
   20.10 +button, button[type='button'], .button {
   20.11 +	position: relative;
   20.12 +	display: inline-block;
   20.13 +	background-color: $base-button-color;
   20.14 +
   20.15 +	&.primary, &.primary.ladda-button {
   20.16 +		background-color: $primary-button-color;
   20.17 +	}
   20.18 +
   20.19 +	&.ladda-button {
   20.20 +		background-color: $base-button-color;
   20.21 +	}
   20.22 +
   20.23 +	&.primary:hover, &.primary:focus, &.primary.ladda-button:hover, &.primary.ladda-button:focus {
   20.24 +		background-color: darken($primary-button-color, 15);
   20.25 +	}
   20.26 +
   20.27 +	&.ladda-button:hover, &.ladda-button:focus {
   20.28 +		background-color: darken($base-button-color, 15);
   20.29 +	}
   20.30 +}
   20.31 +
   20.32 +button:hover, .button:hover {
   20.33 +	background-color: darken($base-button-color, 15);
   20.34 +}
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/src/styles/base/_base.scss	Sun May 03 23:25:12 2015 -0400
    21.3 @@ -0,0 +1,15 @@
    21.4 +// Bitters 1.0.0
    21.5 +// http://bitters.bourbon.io
    21.6 +// Copyright 2013-2015 thoughtbot, inc.
    21.7 +// MIT License
    21.8 +
    21.9 +@import "variables";
   21.10 +
   21.11 +// Neat Settings -- uncomment if using Neat -- must be imported before Neat
   21.12 +// @import "grid-settings";
   21.13 +
   21.14 +@import "buttons";
   21.15 +@import "forms";
   21.16 +@import "lists";
   21.17 +@import "tables";
   21.18 +@import "typography";
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/src/styles/base/_buttons.scss	Sun May 03 23:25:12 2015 -0400
    22.3 @@ -0,0 +1,31 @@
    22.4 +#{$all-button-inputs},
    22.5 +button {
    22.6 +  @include appearance(none);
    22.7 +  -webkit-font-smoothing: antialiased;
    22.8 +  background-color: $action-color;
    22.9 +  border-radius: $base-border-radius;
   22.10 +  border: none;
   22.11 +  color: #fff;
   22.12 +  cursor: pointer;
   22.13 +  display: inline-block;
   22.14 +  font-family: $base-font-family;
   22.15 +  font-size: $base-font-size;
   22.16 +  font-weight: 600;
   22.17 +  line-height: 1;
   22.18 +  padding: 0.75em 1em;
   22.19 +  text-decoration: none;
   22.20 +  user-select: none;
   22.21 +  vertical-align: middle;
   22.22 +  white-space: nowrap;
   22.23 +
   22.24 +  &:hover,
   22.25 +  &:focus {
   22.26 +    background-color: darken($action-color, 15%);
   22.27 +    color: #fff;
   22.28 +  }
   22.29 +
   22.30 +  &:disabled {
   22.31 +    cursor: not-allowed;
   22.32 +    opacity: 0.5;
   22.33 +  }
   22.34 +}
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/src/styles/base/_forms.scss	Sun May 03 23:25:12 2015 -0400
    23.3 @@ -0,0 +1,78 @@
    23.4 +fieldset {
    23.5 +  background-color: lighten($base-border-color, 10%);
    23.6 +  border: $base-border;
    23.7 +  margin: 0 0 $small-spacing;
    23.8 +  padding: $base-spacing;
    23.9 +}
   23.10 +
   23.11 +input,
   23.12 +label,
   23.13 +select {
   23.14 +  display: block;
   23.15 +  font-family: $base-font-family;
   23.16 +  font-size: $base-font-size;
   23.17 +}
   23.18 +
   23.19 +label {
   23.20 +  font-weight: 600;
   23.21 +  margin-bottom: $small-spacing / 2;
   23.22 +
   23.23 +  &.required::after {
   23.24 +    content: "*";
   23.25 +  }
   23.26 +
   23.27 +  abbr {
   23.28 +    display: none;
   23.29 +  }
   23.30 +}
   23.31 +
   23.32 +#{$all-text-inputs},
   23.33 +select[multiple=multiple],
   23.34 +textarea {
   23.35 +  background-color: $base-background-color;
   23.36 +  border: $base-border;
   23.37 +  border-radius: $base-border-radius;
   23.38 +  box-shadow: $form-box-shadow;
   23.39 +  box-sizing: border-box;
   23.40 +  font-family: $base-font-family;
   23.41 +  font-size: $base-font-size;
   23.42 +  margin-bottom: $base-spacing / 2;
   23.43 +  padding: $base-spacing / 3;
   23.44 +  transition: border-color;
   23.45 +  width: 100%;
   23.46 +
   23.47 +  &:hover {
   23.48 +    border-color: darken($base-border-color, 10%);
   23.49 +  }
   23.50 +
   23.51 +  &:focus {
   23.52 +    border-color: $action-color;
   23.53 +    box-shadow: $form-box-shadow-focus;
   23.54 +    outline: none;
   23.55 +  }
   23.56 +}
   23.57 +
   23.58 +textarea {
   23.59 +  resize: vertical;
   23.60 +}
   23.61 +
   23.62 +input[type="search"] {
   23.63 +  @include appearance(none);
   23.64 +}
   23.65 +
   23.66 +input[type="checkbox"],
   23.67 +input[type="radio"] {
   23.68 +  display: inline;
   23.69 +  margin-right: $small-spacing / 2;
   23.70 +}
   23.71 +
   23.72 +input[type="file"] {
   23.73 +  padding-bottom: $small-spacing;
   23.74 +  width: 100%;
   23.75 +}
   23.76 +
   23.77 +select {
   23.78 +  margin-bottom: $base-spacing;
   23.79 +  max-width: 100%;
   23.80 +  width: auto;
   23.81 +}
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/src/styles/base/_grid-settings.scss	Sun May 03 23:25:12 2015 -0400
    24.3 @@ -0,0 +1,14 @@
    24.4 +@import "neat-helpers"; // or "../neat/neat-helpers" when not in Rails
    24.5 +
    24.6 +// Neat Overrides
    24.7 +// $column: 90px;
    24.8 +// $gutter: 30px;
    24.9 +// $grid-columns: 12;
   24.10 +// $max-width: em(1088);
   24.11 +
   24.12 +// Neat Breakpoints
   24.13 +$medium-screen: em(640);
   24.14 +$large-screen: em(860);
   24.15 +
   24.16 +$medium-screen-up: new-breakpoint(min-width $medium-screen 4);
   24.17 +$large-screen-up: new-breakpoint(min-width $large-screen 8);
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/src/styles/base/_lists.scss	Sun May 03 23:25:12 2015 -0400
    25.3 @@ -0,0 +1,31 @@
    25.4 +ul,
    25.5 +ol {
    25.6 +  list-style-type: none;
    25.7 +  margin: 0;
    25.8 +  padding: 0;
    25.9 +
   25.10 +  &%default-ul {
   25.11 +    list-style-type: disc;
   25.12 +    margin-bottom: $small-spacing;
   25.13 +    padding-left: $base-spacing;
   25.14 +  }
   25.15 +
   25.16 +  &%default-ol {
   25.17 +    list-style-type: decimal;
   25.18 +    margin-bottom: $small-spacing;
   25.19 +    padding-left: $base-spacing;
   25.20 +  }
   25.21 +}
   25.22 +
   25.23 +dl {
   25.24 +  margin-bottom: $small-spacing;
   25.25 +
   25.26 +  dt {
   25.27 +    font-weight: bold;
   25.28 +    margin-top: $small-spacing;
   25.29 +  }
   25.30 +
   25.31 +  dd {
   25.32 +    margin: 0;
   25.33 +  }
   25.34 +}
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/src/styles/base/_tables.scss	Sun May 03 23:25:12 2015 -0400
    26.3 @@ -0,0 +1,25 @@
    26.4 +table {
    26.5 +  @include font-feature-settings("kern", "liga", "tnum");
    26.6 +  border-collapse: collapse;
    26.7 +  margin: $small-spacing 0;
    26.8 +  table-layout: fixed;
    26.9 +  width: 100%;
   26.10 +}
   26.11 +
   26.12 +th {
   26.13 +  border-bottom: 1px solid darken($base-border-color, 15%);
   26.14 +  font-weight: 600;
   26.15 +  padding: $small-spacing 0;
   26.16 +  text-align: left;
   26.17 +}
   26.18 +
   26.19 +td {
   26.20 +  border-bottom: $base-border;
   26.21 +  padding: $small-spacing 0;
   26.22 +}
   26.23 +
   26.24 +tr,
   26.25 +td,
   26.26 +th {
   26.27 +  vertical-align: middle;
   26.28 +}
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/src/styles/base/_typography.scss	Sun May 03 23:25:12 2015 -0400
    27.3 @@ -0,0 +1,55 @@
    27.4 +body {
    27.5 +  @include font-feature-settings("kern", "liga", "pnum");
    27.6 +  -webkit-font-smoothing: antialiased;
    27.7 +  color: $base-font-color;
    27.8 +  font-family: $base-font-family;
    27.9 +  font-size: $base-font-size;
   27.10 +  line-height: $base-line-height;
   27.11 +}
   27.12 +
   27.13 +h1,
   27.14 +h2,
   27.15 +h3,
   27.16 +h4,
   27.17 +h5,
   27.18 +h6 {
   27.19 +  font-family: $heading-font-family;
   27.20 +  font-size: $base-font-size;
   27.21 +  line-height: $heading-line-height;
   27.22 +  margin: 0 0 $small-spacing;
   27.23 +}
   27.24 +
   27.25 +p {
   27.26 +  margin: 0 0 $small-spacing;
   27.27 +}
   27.28 +
   27.29 +a {
   27.30 +  color: $action-color;
   27.31 +  text-decoration: none;
   27.32 +  transition: color 0.1s linear;
   27.33 +
   27.34 +  &:active,
   27.35 +  &:focus,
   27.36 +  &:hover {
   27.37 +    color: darken($action-color, 15%);
   27.38 +  }
   27.39 +
   27.40 +  &:active,
   27.41 +  &:focus {
   27.42 +    outline: none;
   27.43 +  }
   27.44 +}
   27.45 +
   27.46 +hr {
   27.47 +  border-bottom: $base-border;
   27.48 +  border-left: none;
   27.49 +  border-right: none;
   27.50 +  border-top: none;
   27.51 +  margin: $base-spacing 0;
   27.52 +}
   27.53 +
   27.54 +img,
   27.55 +picture {
   27.56 +  margin: 0;
   27.57 +  max-width: 100%;
   27.58 +}
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/src/styles/base/_variables.scss	Sun May 03 23:25:12 2015 -0400
    28.3 @@ -0,0 +1,35 @@
    28.4 +// Typography
    28.5 +$base-font-family: $helvetica;
    28.6 +$heading-font-family: $base-font-family;
    28.7 +
    28.8 +// Font Sizes
    28.9 +$base-font-size: 1em;
   28.10 +
   28.11 +// Line height
   28.12 +$base-line-height: 1.5;
   28.13 +$heading-line-height: 1.2;
   28.14 +
   28.15 +// Other Sizes
   28.16 +$base-border-radius: 3px;
   28.17 +$base-spacing: $base-line-height * 1em;
   28.18 +$small-spacing: $base-spacing / 2;
   28.19 +$base-z-index: 0;
   28.20 +
   28.21 +// Colors
   28.22 +$blue: #477dca;
   28.23 +$dark-gray: #333;
   28.24 +$medium-gray: #999;
   28.25 +$light-gray: #ddd;
   28.26 +
   28.27 +// Font Colors
   28.28 +$base-background-color: #fff;
   28.29 +$base-font-color: $dark-gray;
   28.30 +$action-color: $blue;
   28.31 +
   28.32 +// Border
   28.33 +$base-border-color: $light-gray;
   28.34 +$base-border: 1px solid $base-border-color;
   28.35 +
   28.36 +// Forms
   28.37 +$form-box-shadow: inset 0 1px 3px rgba(#000, 0.06);
   28.38 +$form-box-shadow-focus: $form-box-shadow, 0 0 5px adjust-color($action-color, $lightness: -5%, $alpha: -0.3);
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/src/styles/hero.scss	Sun May 03 23:25:12 2015 -0400
    29.3 @@ -0,0 +1,42 @@
    29.4 +@import 'bourbon';
    29.5 +@import "neat";
    29.6 +@import "base/base";
    29.7 +
    29.8 +$hero-background: #40526b;
    29.9 +$hero-color: white;
   29.10 +
   29.11 +.hero {
   29.12 +	background-color: $hero-background;
   29.13 +	background-repeat: no-repeat;
   29.14 +	background-position: top;
   29.15 +	background-size: cover;
   29.16 +
   29.17 +	img.hero-logo {
   29.18 +		height: 80px;
   29.19 +		margin-bottom: 1em;
   29.20 +	}
   29.21 +	.hero-inner {
   29.22 +		@include outer-container;
   29.23 +		@include clearfix;
   29.24 +		padding: 3em 3em 0 3em;
   29.25 +		margin: auto;
   29.26 +		text-align: center;
   29.27 +		color: $hero-color;
   29.28 +
   29.29 +		.hero-copy {
   29.30 +			text-align: center;
   29.31 +			
   29.32 +			h1 {
   29.33 +				font-size: 2.5em;
   29.34 +				margin-bottom: .2em;
   29.35 +			}
   29.36 +
   29.37 +			p {
   29.38 +				margin: auto;
   29.39 +				margin-bottom: 3em;
   29.40 +				font-weight: 200;
   29.41 +				font-size: 1.25em;
   29.42 +			}
   29.43 +		}
   29.44 +	}
   29.45 +}
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/src/styles/main.scss	Sun May 03 23:25:12 2015 -0400
    30.3 @@ -0,0 +1,5 @@
    30.4 +$color: #fff;
    30.5 +
    30.6 +body {
    30.7 +	background-color: $color;
    30.8 +}
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/src/styles/onboarding.scss	Sun May 03 23:25:12 2015 -0400
    31.3 @@ -0,0 +1,85 @@
    31.4 +@import "bourbon";
    31.5 +@Import "neat";
    31.6 +@import "base/base";
    31.7 +@import "hero";
    31.8 +@import "button";
    31.9 +
   31.10 +.onboarding {
   31.11 +	$content-max-width: 600px;
   31.12 +	$content-width: 100%;
   31.13 +
   31.14 +	padding: 1.5em;
   31.15 +	font-size: 1.25em;
   31.16 +	max-width: $content-max-width;
   31.17 +	width: $content-width;
   31.18 +	margin: 0px auto;
   31.19 +
   31.20 +	ul, ol {
   31.21 +		list-style-type: square;
   31.22 +	}
   31.23 +
   31.24 +	#{$all-text-inputs}, label {
   31.25 +		display: inline-block;
   31.26 +	}
   31.27 +
   31.28 +	label {
   31.29 +		max-width: 35%;
   31.30 +	}
   31.31 +
   31.32 +	#{$all-text-inputs} {
   31.33 +		width: 65%;
   31.34 +	}
   31.35 +
   31.36 +	&.register {
   31.37 +		#{$all-text-inputs} {
   31.38 +			width: 60%;
   31.39 +		}
   31.40 +
   31.41 +		label {
   31.42 +			width: 35%;
   31.43 +			text-align: right;
   31.44 +			padding-right: 1em;
   31.45 +		}
   31.46 +
   31.47 +		form {
   31.48 +			font-size: 75%;
   31.49 +			margin: 0px auto;
   31.50 +		}
   31.51 +	}
   31.52 +	&.login {
   31.53 +		label {
   31.54 +			width: 25%;
   31.55 +			text-align: right;
   31.56 +			padding-right: 1em;
   31.57 +		}
   31.58 +
   31.59 +		form {
   31.60 +			font-size: 85%;
   31.61 +			margin: 0px auto;
   31.62 +		}
   31.63 +	}
   31.64 +}
   31.65 +
   31.66 +.hero img.settings-toggle {
   31.67 +	width: 1.25em;
   31.68 +	top: 0px;
   31.69 +	float: right;
   31.70 +	margin: 1em;
   31.71 +	cursor: pointer;
   31.72 +}
   31.73 +
   31.74 +.actionbuttons {
   31.75 +	padding-top: 1em;
   31.76 +	text-align: center;
   31.77 +	max-width: 400px;
   31.78 +	margin: 0px auto;
   31.79 +
   31.80 +	button {
   31.81 +		min-width: 48%;
   31.82 +		margin: 0px 1%;
   31.83 +	}
   31.84 +
   31.85 +	button:focus {
   31.86 +		outline: none;
   31.87 +	}
   31.88 +}
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/webpack.config.js	Sun May 03 23:25:12 2015 -0400
    32.3 @@ -0,0 +1,87 @@
    32.4 +require('babel/register')
    32.5 +var webpack = require('webpack')
    32.6 +var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js')
    32.7 +var ExtractTextPlugin = require('extract-text-webpack-plugin')
    32.8 +var path = require('path')
    32.9 +var neat = require('node-neat').includePaths
   32.10 +var env = process.env.NODE_ENV || 'development'
   32.11 +
   32.12 +module.exports = function () {
   32.13 +  var isDev = env !== 'production'
   32.14 +  var cssLoader = isDev ? 'css-loader?sourceMap' : 'css-loader'
   32.15 +  var sassLoader = isDev ? 'sass-loader?sourceMap' : 'sass-loader'
   32.16 +  var bourbonPaths = neat.map(function(p) {
   32.17 +    return "includePaths[]=" + p
   32.18 +  }).join("&")
   32.19 +  if (sassLoader.indexOf('?') === -1) {
   32.20 +    sassLoader += '?'
   32.21 +  } else {
   32.22 +    sassLoader += '&'
   32.23 +  }
   32.24 +  sassLoader += bourbonPaths
   32.25 +  var manifest = {
   32.26 +    entry: path.join(__dirname, 'src', 'main.js'),
   32.27 +    output: {
   32.28 +      path: path.join(__dirname, 'build'),
   32.29 +      publicPath: '/static/',
   32.30 +      filename: 'bundle.js'
   32.31 +    },
   32.32 +    module: {
   32.33 +      loaders: [
   32.34 +        { test: /(\.js$)|(\.jsx$)/, loader: 'babel-loader', exclude: /node_modules/ },
   32.35 +        { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', cssLoader) },
   32.36 +        { test: /\.scss$/, loader: ExtractTextPlugin.extract('style-loader', cssLoader + '!' + sassLoader) },
   32.37 +        { test: /\.(svg|png|jpg|jpeg)$/, loader: 'url-loader?limit=8192'}
   32.38 +      ]
   32.39 +    },
   32.40 +    resolve: {
   32.41 +      extensions: ['', '.js', '.jsx', '.scss']
   32.42 +    },
   32.43 +    plugins: [commonsPlugin, new ExtractTextPlugin("main.css")],
   32.44 +    modulesDirectoires: ["node_modules"],
   32.45 +  }
   32.46 +  if (isDev) {
   32.47 +    manifest.host = '0.0.0.0'
   32.48 +    manifest.port = '3000'
   32.49 +    manifest.devtool = 'source-map'
   32.50 +    
   32.51 +    if (typeof manifest.entry === 'string') {
   32.52 +      manifest.entry = [manifest.entry]
   32.53 +    }
   32.54 +
   32.55 +    manifest.entry.unshift(
   32.56 +      'webpack-dev-server/client?http://' + manifest.host + ':' + manifest.port,
   32.57 +      'webpack/hot/dev-server'
   32.58 +    )
   32.59 +
   32.60 +    manifest.plugins = manifest.plugins.concat([
   32.61 +      new webpack.HotModuleReplacementPlugin(),
   32.62 +      new webpack.NoErrorsPlugin()
   32.63 +    ])
   32.64 +
   32.65 +    if (manifest.module.loaders[0].loader && !manifest.module.loaders[0].loaders) {
   32.66 +      manifest.module.loaders[0].loaders = [manifest.module.loaders[0].loader]
   32.67 +      delete manifest.module.loaders[0].loader
   32.68 +    }
   32.69 +
   32.70 +    manifest.module.loaders[0].loaders.unshift('react-hot')
   32.71 +  } else {
   32.72 +    manifest.plugins.push(
   32.73 +      new webpack.optimize.DedupePlugin(),
   32.74 +      new webpack.optimize.OccurenceOrderPlugin(true),
   32.75 +      new webpack.optimize.UglifyJsPlugin({
   32.76 +        compress: {
   32.77 +          warnings: false
   32.78 +        },
   32.79 +        output: {
   32.80 +          comments: false
   32.81 +        },
   32.82 +        sourceMap: false
   32.83 +      }),
   32.84 +      new webpack.DefinePlugin({
   32.85 +        'process.env': {NODE_ENV: JSON.stringify('production')}
   32.86 +      })
   32.87 +    )
   32.88 +  }
   32.89 +  return manifest
   32.90 +}()