ducky/web
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 +}()