59 | );
60 | }
61 | }
62 |
63 | Products.propTypes = propTypes;
64 |
--------------------------------------------------------------------------------
/common/Products/index.styl:
--------------------------------------------------------------------------------
1 | .products {
2 | margin: 0 auto;
3 | max-width: 1200px;
4 | }
5 |
6 | .products-search {
7 | row();
8 | display: flex;
9 | justify-content: center;
10 | margin: 50px 0;
11 | }
12 |
13 | .products-search_input
14 | width 400px
15 | border none
16 | border-bottom 1px solid blue
17 | font-size 28px
18 | font-weight 100
19 | padding 12px 0 14px 50px
20 | color blue
21 | background url(/images/SearchIcon.png) no-repeat 0 12px
22 | background-size 45px auto
23 | &:focus
24 | box-shadow none
25 | outline none
26 | background url(/images/SearchIconActive.png) no-repeat 0 12px
27 | background-size 45px auto
28 | border-bottom 1px solid purple-dark
29 |
30 |
31 |
32 | .products-lists
33 | display flex
34 | flex-flow row wrap
35 | justify-content space-around
36 | margin-bottom 100px
37 |
38 | .empty
39 | display flex
40 | & h2
41 | padding-top 20px
42 | margin 0 auto
43 | font-weight 300x
44 | color blue
45 | font-size 36px
46 |
47 | .products-item
48 | border 1px solid blue
49 | border-radius 2px
50 | margin 40px 20px
51 | overflow hidden
52 | width 300px
53 | height 375px
54 |
55 | .products-item-name
56 | padding 5px 5px 0 10px
57 | color blue
58 | font-size 26px
59 |
60 | .products-item-description
61 | color fontGray
62 | font-weight 300
63 | height 88px
64 | margin 10px 5px
65 | overflow hidden
66 | padding 5px
67 |
68 |
69 | .products-item-footer
70 | display flex
71 | justify-content space-between
72 | align-items flex-end
73 |
74 | .products-item-cart
75 | .products-item-favorite
76 | padding 10px 12px
77 | background-color: transparent;
78 | border: none;
79 | img
80 | width 35px
81 |
82 | button
83 | background-color transparent
84 | &:focus
85 | outline none
86 |
87 |
88 | .products-item-stock-photo {
89 | overflow: hidden;
90 | }
91 |
--------------------------------------------------------------------------------
/common/api.js:
--------------------------------------------------------------------------------
1 | import makeFetch from './utils/make-fetch.js';
2 | import serializeForm from './utils/serialize-form.js';
3 |
4 | const api = '/api/users';
5 | const defaultOptions = {
6 | method: 'POST',
7 | headers: {
8 | 'Content-Type': 'application/json'
9 | }
10 | };
11 | export function fetchProducts() {
12 | return makeFetch('/api/products');
13 | }
14 |
15 | export const cartMethods = {
16 | ADD_TO_CART: 'add-to-cart',
17 | REMOVE_FROM_CART: 'remove-from-cart',
18 | DELETE_FROM_CART: 'delete-from-cart'
19 | };
20 | export function makeCartApiCall(type, id, token, itemId) {
21 | const method = cartMethods[type];
22 | const url = `${api}/${id}/${method}?access_token=${token}`;
23 | const options = {
24 | ...defaultOptions,
25 | body: JSON.stringify({ itemId })
26 | };
27 | return makeFetch(url, options);
28 | }
29 |
30 | makeCartApiCall.cartMethods = cartMethods;
31 |
32 | export function fetchUser(id, token) {
33 | const options = {
34 | ...defaultOptions,
35 | method: 'GET'
36 | };
37 | return makeFetch(api + `/${id}?access_token=${token}`, options)
38 | // normalize user data
39 | .then(user => ({ ...user, accessToken: token }));
40 | }
41 |
42 | export function auth(isSignUp, form) {
43 | const options = {
44 | ...defaultOptions,
45 | body: serializeForm(form)
46 | };
47 | const url = isSignUp ?
48 | api :
49 | api + '/login?include=user';
50 | return makeFetch(url, options)
51 | .then(res => (
52 | // normalize server response
53 | isSignUp ?
54 | res :
55 | { ...res.user, accessToken: res.id }
56 | ));
57 | }
58 |
--------------------------------------------------------------------------------
/common/index.styl:
--------------------------------------------------------------------------------
1 | @import "kouto-swiss"
2 | normalize();
3 | box-sizing-reset();
4 |
5 | @font-face
6 | font-family roboto
7 | src url(/fonts/roboto/Roboto-Regular.ttf)
8 | body {
9 | width: 100vw;
10 | font-family: roboto;
11 | }
12 |
13 | .app {
14 | gs('fluid');
15 | }
16 |
17 | .app-child {
18 | row();
19 | }
20 |
21 | a {
22 | text-decoration: none;
23 | }
24 |
25 | @import './vars.styl';
26 | @import './Auth';
27 | @import './Cart';
28 | @import './Nav';
29 | @import './Products';
30 |
--------------------------------------------------------------------------------
/common/utils/make-fetch.js:
--------------------------------------------------------------------------------
1 | export default function makeFetch(uri, options) {
2 | return fetch(uri, options).then(res => {
3 | if (!res.ok) {
4 | return Promise.reject(new Error(res.statusText));
5 | }
6 | return res.json();
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/common/utils/serialize-form.js:
--------------------------------------------------------------------------------
1 | export default function serializeForm(form) {
2 | const data = [].filter.call(form.elements, node => !!node.name)
3 | .reduce((data, node) => {
4 | data[node.name] = node.value;
5 | return data;
6 | }, {});
7 |
8 | return JSON.stringify(data);
9 | }
10 |
--------------------------------------------------------------------------------
/common/vars.styl:
--------------------------------------------------------------------------------
1 | blue = #02AEEF;
2 | blue-dark = #009AD4;
3 | purple = #BD10E0;
4 | purple-dark = #9F0CBE;
5 | gray = #C1C1C1;
6 | gray-dark = #565656;
7 | fontGray = #888888;
8 | roboto = "roboto", sans-serif;
9 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | process.env.DEBUG = process.env.DEBUG || 'ar:*';
2 | require('dotenv').load();
3 | var gulp = require('gulp');
4 | // var gutil = require('gulp-util');
5 | var notify = require('gulp-notify');
6 | var plumber = require('gulp-plumber');
7 | var sourcemaps = require('gulp-sourcemaps');
8 | var stylus = require('gulp-stylus');
9 |
10 | var swiss = require('kouto-swiss');
11 | var nodemon = require('nodemon');
12 | var debugFactory = require('debug');
13 |
14 | var webpack = require('webpack');
15 | var webpackDevMiddleware = require('webpack-dev-middleware');
16 | var webpackHotMiddleware = require('webpack-hot-middleware');
17 | var browserSync = require('browser-sync');
18 |
19 | var yargs = require('yargs');
20 |
21 | var pckg = require('./package.json');
22 | var webpackConfig = require('./webpack.config');
23 |
24 | var debug = debugFactory('ar:gulp');
25 |
26 | var sync = browserSync.create('ar-sync-server');
27 | var reload = sync.reload.bind(sync);
28 |
29 | // user definable ports
30 | var port = yargs.argv.port || process.env.PORT || '3001';
31 | var syncPort = yargs.argv['sync-port'] || process.env.SYNC_PORT || '3000';
32 | // make sure sync ui port does not interfere with proxy port
33 | var syncUIPort = yargs.argv['sync-ui-port'] ||
34 | process.env.SYNC_UI_PORT ||
35 | parseInt(syncPort, 10) + 2;
36 | var isNotSSR = !process.env.SSR;
37 | var paths = {
38 | server: pckg.main,
39 | serverIgnore: [
40 | 'client/**/*',
41 | 'package.json',
42 | 'gulpfile.js'
43 | ],
44 | stylus: './common/index.styl',
45 | stylusFiles: [
46 | './client/**/*.styl',
47 | './common/**/*.styl'
48 | ],
49 | public: './public',
50 | syncWatch: [
51 | './server/views/**.jade',
52 | './public/main.css'
53 | ]
54 | };
55 |
56 | if (isNotSSR) {
57 | debug('no ssr');
58 | paths.serverIgnore.push('common/**/*');
59 | }
60 |
61 | function errorHandler() {
62 | var args = Array.prototype.slice.call(arguments);
63 |
64 | // Send error to notification center with gulp-notify
65 | notify.onError({
66 | title: 'Compile Error',
67 | message: '<%= error %>'
68 | }).apply(this, args);
69 |
70 | // Keep gulp from hanging on this task
71 | this.emit('end');
72 | }
73 |
74 | gulp.task('serve', function(cb) {
75 | var called = false;
76 | const monitor = nodemon({
77 | script: paths.server,
78 | ext: '.jsx .js .json',
79 | ignore: paths.serverIgnore,
80 | // exec: path.join(__dirname, 'node_modules/.bin/babel-node'),
81 | env: {
82 | NODE_ENV: process.env.NODE_ENV || 'development',
83 | DEBUG: process.env.DEBUG || 'ar:*',
84 | PORT: port
85 | }
86 | })
87 | .on('start', function() {
88 | if (!called) {
89 | called = true;
90 | setTimeout(function() {
91 | cb();
92 | });
93 | }
94 | })
95 | .on('restart', function(files) {
96 | if (files) { debug('Files that changes: ', files); }
97 | });
98 | // add clean hear to prevent nodemon from running after
99 | // exit
100 | // see: JacksonGariety/gulp-nodemon/issues/77
101 | process.once('SIGINT', () => {
102 | monitor.once('exit', () => {
103 | /* eslint-disable no-process-exit */
104 | process.exit(0);
105 | /* eslint-enable no-process-exit */
106 | });
107 | });
108 | });
109 |
110 | gulp.task('stylus', function() {
111 | return gulp.src(paths.stylus)
112 | .pipe(plumber({ errorHandler: errorHandler }))
113 | .pipe(sourcemaps.init())
114 | .pipe(stylus({
115 | use: swiss()
116 | }))
117 | .pipe(sourcemaps.write())
118 | .pipe(gulp.dest(paths.public + '/css'))
119 | .pipe(reload({ stream: true }));
120 | });
121 |
122 | var syncDependents = [
123 | 'serve',
124 | 'stylus'
125 | ];
126 |
127 | gulp.task('dev-server', syncDependents, function() {
128 | webpackConfig.entry.bundle = [
129 | 'webpack/hot/dev-server',
130 | 'webpack-hot-middleware/client'
131 | ].concat(webpackConfig.entry.bundle);
132 |
133 | var bundler = webpack(webpackConfig);
134 |
135 | sync.init(null, {
136 | ui: {
137 | port: syncUIPort
138 | },
139 | proxy: 'http://localhost:' + port,
140 | logLeval: 'debug',
141 | files: paths.syncWatch,
142 | port: syncPort,
143 | open: false,
144 | middleware: [
145 | webpackDevMiddleware(bundler, {
146 | publicPath: webpackConfig.output.publicPath,
147 | stats: 'errors-only'
148 | }),
149 | webpackHotMiddleware(bundler)
150 | ]
151 | });
152 | });
153 |
154 | gulp.task('watch', function() {
155 | gulp.watch(paths.stylusFiles, ['stylus']);
156 | });
157 |
158 | gulp.task('default', [ 'serve', 'stylus', 'dev-server', 'watch' ]);
159 |
--------------------------------------------------------------------------------
/images/Cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/images/Cart.png
--------------------------------------------------------------------------------
/images/Store.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/images/Store.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "advanced-redux",
3 | "version": "0.0.1",
4 | "main": "server/server.js",
5 | "scripts": {
6 | "test": "NODE_ENV=test nyc ava",
7 | "test:watch": "ava --watch",
8 | "cover": "nyc report --reporter=html",
9 | "cover:watch": "nodemon --watch test/ --exec 'npm run test && npm run cover'",
10 | "cover:show": "open coverage/index.html",
11 | "cover:alls": "nyc report --reporter=text-lcov | coveralls",
12 | "lint": "eslint .",
13 | "start": "npm run create-env && gulp",
14 | "seed": "npm run create-env && node seed",
15 | "create-env": "node -e \"var fs = require('fs'); fs.access('./.env', function(err) { if (err) { console.log('\\n\\ncreating .env file\\n\\n'); return fs.writeFileSync('./.env', ''); } console.log('\\n\\n.env file present\\n\\n'); });\"",
16 | "static": "httpster -p 3003 -d public"
17 | },
18 | "dependencies": {
19 | "babel-core": "^6.14.0",
20 | "babel-plugin-add-module-exports": "^0.2.1",
21 | "babel-preset-es2015": "^6.14.0",
22 | "babel-preset-react": "^6.11.1",
23 | "babel-preset-stage-0": "^6.5.0",
24 | "babel-register": "^6.14.0",
25 | "compression": "^1.0.3",
26 | "cors": "^2.5.2",
27 | "debug": "^2.2.0",
28 | "dotenv": "^2.0.0",
29 | "express-state": "^1.4.0",
30 | "fetchr": "^0.5.37",
31 | "helmet": "^1.3.0",
32 | "lodash": "^4.15.0",
33 | "loopback": "^2.22.0",
34 | "loopback-boot": "^2.6.5",
35 | "loopback-component-explorer": "^2.4.0",
36 | "loopback-datasource-juggler": "^2.39.0",
37 | "morgan": "^1.7.0",
38 | "normalizr": "^2.2.1",
39 | "pug": "^2.0.0-beta6",
40 | "react": "15.3.2",
41 | "react-dom": "15.3.2",
42 | "react-redux": "^5.0.4",
43 | "react-redux-epic": "^0.3.1",
44 | "react-router": "^2.7.0",
45 | "react-router-dom": "^4.1.1",
46 | "react-router-redux": "^4.0.5",
47 | "redux": "^3.6.0",
48 | "redux-actions": "^1.1.0",
49 | "redux-observable": "^0.14.1",
50 | "redux-promise": "^0.5.3",
51 | "redux-thunk": "^2.1.0",
52 | "reselect": "^2.5.4",
53 | "rxjs": "^5.4.0",
54 | "serve-favicon": "^2.0.1",
55 | "strong-error-handler": "^1.0.1"
56 | },
57 | "devDependencies": {
58 | "ava": "^0.19.1",
59 | "babel-eslint": "^7.2.3",
60 | "babel-loader": "^6.2.5",
61 | "babel-plugin-istanbul": "^4.1.4",
62 | "browser-sync": "^2.15.0",
63 | "eslint": "^3.4.0",
64 | "eslint-config-loopback": "^4.0.0",
65 | "eslint-plugin-import": "^1.14.0",
66 | "eslint-plugin-react": "^6.2.0",
67 | "gulp": "^3.9.1",
68 | "gulp-notify": "^2.2.0",
69 | "gulp-plumber": "^1.1.0",
70 | "gulp-sourcemaps": "^1.6.0",
71 | "gulp-stylus": "^2.5.0",
72 | "gulp-util": "^3.0.7",
73 | "httpster": "^1.0.3",
74 | "json-loader": "^0.5.4",
75 | "kouto-swiss": "^0.12.0",
76 | "nodemon": "^1.10.2",
77 | "nyc": "^11.0.1",
78 | "react-hot-loader": "^1.3.0",
79 | "webpack": "^1.13.2",
80 | "webpack-dev-middleware": "^1.6.1",
81 | "webpack-hot-middleware": "^2.12.2",
82 | "yargs": "^5.0.0"
83 | },
84 | "ava": {
85 | "require": [
86 | "babel-register"
87 | ],
88 | "babel": "inherit",
89 | "failFast": true
90 | },
91 | "nyc": {
92 | "sourceMap": false,
93 | "instrument": false
94 | },
95 | "repository": {
96 | "type": "",
97 | "url": ""
98 | },
99 | "license": "BSD-3-Clause",
100 | "description": "advanced-redux"
101 | }
102 |
--------------------------------------------------------------------------------
/public/fonts/roboto/Apache License.txt:
--------------------------------------------------------------------------------
1 | Font data copyright Google 2012
2 |
3 | Apache License
4 | Version 2.0, January 2004
5 | http://www.apache.org/licenses/
6 |
7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8 |
9 | 1. Definitions.
10 |
11 | "License" shall mean the terms and conditions for use, reproduction,
12 | and distribution as defined by Sections 1 through 9 of this document.
13 |
14 | "Licensor" shall mean the copyright owner or entity authorized by
15 | the copyright owner that is granting the License.
16 |
17 | "Legal Entity" shall mean the union of the acting entity and all
18 | other entities that control, are controlled by, or are under common
19 | control with that entity. For the purposes of this definition,
20 | "control" means (i) the power, direct or indirect, to cause the
21 | direction or management of such entity, whether by contract or
22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
23 | outstanding shares, or (iii) beneficial ownership of such entity.
24 |
25 | "You" (or "Your") shall mean an individual or Legal Entity
26 | exercising permissions granted by this License.
27 |
28 | "Source" form shall mean the preferred form for making modifications,
29 | including but not limited to software source code, documentation
30 | source, and configuration files.
31 |
32 | "Object" form shall mean any form resulting from mechanical
33 | transformation or translation of a Source form, including but
34 | not limited to compiled object code, generated documentation,
35 | and conversions to other media types.
36 |
37 | "Work" shall mean the work of authorship, whether in Source or
38 | Object form, made available under the License, as indicated by a
39 | copyright notice that is included in or attached to the work
40 | (an example is provided in the Appendix below).
41 |
42 | "Derivative Works" shall mean any work, whether in Source or Object
43 | form, that is based on (or derived from) the Work and for which the
44 | editorial revisions, annotations, elaborations, or other modifications
45 | represent, as a whole, an original work of authorship. For the purposes
46 | of this License, Derivative Works shall not include works that remain
47 | separable from, or merely link (or bind by name) to the interfaces of,
48 | the Work and Derivative Works thereof.
49 |
50 | "Contribution" shall mean any work of authorship, including
51 | the original version of the Work and any modifications or additions
52 | to that Work or Derivative Works thereof, that is intentionally
53 | submitted to Licensor for inclusion in the Work by the copyright owner
54 | or by an individual or Legal Entity authorized to submit on behalf of
55 | the copyright owner. For the purposes of this definition, "submitted"
56 | means any form of electronic, verbal, or written communication sent
57 | to the Licensor or its representatives, including but not limited to
58 | communication on electronic mailing lists, source code control systems,
59 | and issue tracking systems that are managed by, or on behalf of, the
60 | Licensor for the purpose of discussing and improving the Work, but
61 | excluding communication that is conspicuously marked or otherwise
62 | designated in writing by the copyright owner as "Not a Contribution."
63 |
64 | "Contributor" shall mean Licensor and any individual or Legal Entity
65 | on behalf of whom a Contribution has been received by Licensor and
66 | subsequently incorporated within the Work.
67 |
68 | 2. Grant of Copyright License. Subject to the terms and conditions of
69 | this License, each Contributor hereby grants to You a perpetual,
70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71 | copyright license to reproduce, prepare Derivative Works of,
72 | publicly display, publicly perform, sublicense, and distribute the
73 | Work and such Derivative Works in Source or Object form.
74 |
75 | 3. Grant of Patent License. Subject to the terms and conditions of
76 | this License, each Contributor hereby grants to You a perpetual,
77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78 | (except as stated in this section) patent license to make, have made,
79 | use, offer to sell, sell, import, and otherwise transfer the Work,
80 | where such license applies only to those patent claims licensable
81 | by such Contributor that are necessarily infringed by their
82 | Contribution(s) alone or by combination of their Contribution(s)
83 | with the Work to which such Contribution(s) was submitted. If You
84 | institute patent litigation against any entity (including a
85 | cross-claim or counterclaim in a lawsuit) alleging that the Work
86 | or a Contribution incorporated within the Work constitutes direct
87 | or contributory patent infringement, then any patent licenses
88 | granted to You under this License for that Work shall terminate
89 | as of the date such litigation is filed.
90 |
91 | 4. Redistribution. You may reproduce and distribute copies of the
92 | Work or Derivative Works thereof in any medium, with or without
93 | modifications, and in Source or Object form, provided that You
94 | meet the following conditions:
95 |
96 | (a) You must give any other recipients of the Work or
97 | Derivative Works a copy of this License; and
98 |
99 | (b) You must cause any modified files to carry prominent notices
100 | stating that You changed the files; and
101 |
102 | (c) You must retain, in the Source form of any Derivative Works
103 | that You distribute, all copyright, patent, trademark, and
104 | attribution notices from the Source form of the Work,
105 | excluding those notices that do not pertain to any part of
106 | the Derivative Works; and
107 |
108 | (d) If the Work includes a "NOTICE" text file as part of its
109 | distribution, then any Derivative Works that You distribute must
110 | include a readable copy of the attribution notices contained
111 | within such NOTICE file, excluding those notices that do not
112 | pertain to any part of the Derivative Works, in at least one
113 | of the following places: within a NOTICE text file distributed
114 | as part of the Derivative Works; within the Source form or
115 | documentation, if provided along with the Derivative Works; or,
116 | within a display generated by the Derivative Works, if and
117 | wherever such third-party notices normally appear. The contents
118 | of the NOTICE file are for informational purposes only and
119 | do not modify the License. You may add Your own attribution
120 | notices within Derivative Works that You distribute, alongside
121 | or as an addendum to the NOTICE text from the Work, provided
122 | that such additional attribution notices cannot be construed
123 | as modifying the License.
124 |
125 | You may add Your own copyright statement to Your modifications and
126 | may provide additional or different license terms and conditions
127 | for use, reproduction, or distribution of Your modifications, or
128 | for any such Derivative Works as a whole, provided Your use,
129 | reproduction, and distribution of the Work otherwise complies with
130 | the conditions stated in this License.
131 |
132 | 5. Submission of Contributions. Unless You explicitly state otherwise,
133 | any Contribution intentionally submitted for inclusion in the Work
134 | by You to the Licensor shall be under the terms and conditions of
135 | this License, without any additional terms or conditions.
136 | Notwithstanding the above, nothing herein shall supersede or modify
137 | the terms of any separate license agreement you may have executed
138 | with Licensor regarding such Contributions.
139 |
140 | 6. Trademarks. This License does not grant permission to use the trade
141 | names, trademarks, service marks, or product names of the Licensor,
142 | except as required for reasonable and customary use in describing the
143 | origin of the Work and reproducing the content of the NOTICE file.
144 |
145 | 7. Disclaimer of Warranty. Unless required by applicable law or
146 | agreed to in writing, Licensor provides the Work (and each
147 | Contributor provides its Contributions) on an "AS IS" BASIS,
148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149 | implied, including, without limitation, any warranties or conditions
150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151 | PARTICULAR PURPOSE. You are solely responsible for determining the
152 | appropriateness of using or redistributing the Work and assume any
153 | risks associated with Your exercise of permissions under this License.
154 |
155 | 8. Limitation of Liability. In no event and under no legal theory,
156 | whether in tort (including negligence), contract, or otherwise,
157 | unless required by applicable law (such as deliberate and grossly
158 | negligent acts) or agreed to in writing, shall any Contributor be
159 | liable to You for damages, including any direct, indirect, special,
160 | incidental, or consequential damages of any character arising as a
161 | result of this License or out of the use or inability to use the
162 | Work (including but not limited to damages for loss of goodwill,
163 | work stoppage, computer failure or malfunction, or any and all
164 | other commercial damages or losses), even if such Contributor
165 | has been advised of the possibility of such damages.
166 |
167 | 9. Accepting Warranty or Additional Liability. While redistributing
168 | the Work or Derivative Works thereof, You may choose to offer,
169 | and charge a fee for, acceptance of support, warranty, indemnity,
170 | or other liability obligations and/or rights consistent with this
171 | License. However, in accepting such obligations, You may act only
172 | on Your own behalf and on Your sole responsibility, not on behalf
173 | of any other Contributor, and only if You agree to indemnify,
174 | defend, and hold each Contributor harmless for any liability
175 | incurred by, or claims asserted against, such Contributor by reason
176 | of your accepting any such warranty or additional liability.
177 |
178 | END OF TERMS AND CONDITIONS
179 |
180 | APPENDIX: How to apply the Apache License to your work.
181 |
182 | To apply the Apache License to your work, attach the following
183 | boilerplate notice, with the fields enclosed by brackets "[]"
184 | replaced with your own identifying information. (Don't include
185 | the brackets!) The text should be enclosed in the appropriate
186 | comment syntax for the file format. We also recommend that a
187 | file or class name and description of purpose be included on the
188 | same "printed page" as the copyright notice for easier
189 | identification within third-party archives.
190 |
191 | Copyright [yyyy] [name of copyright owner]
192 |
193 | Licensed under the Apache License, Version 2.0 (the "License");
194 | you may not use this file except in compliance with the License.
195 | You may obtain a copy of the License at
196 |
197 | http://www.apache.org/licenses/LICENSE-2.0
198 |
199 | Unless required by applicable law or agreed to in writing, software
200 | distributed under the License is distributed on an "AS IS" BASIS,
201 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202 | See the License for the specific language governing permissions and
203 | limitations under the License.
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Black.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-BlackItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-BlackItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Bold.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-BoldItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Italic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Light.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-LightItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-MediumItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-Thin.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/Roboto-ThinItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/Roboto-ThinItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-Bold.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-BoldItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-Italic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-Light.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-LightItalic.ttf
--------------------------------------------------------------------------------
/public/fonts/roboto/RobotoCondensed-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/fonts/roboto/RobotoCondensed-Regular.ttf
--------------------------------------------------------------------------------
/public/images/AddToCartSelected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/AddToCartSelected.png
--------------------------------------------------------------------------------
/public/images/AddToCartUnselected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/AddToCartUnselected.png
--------------------------------------------------------------------------------
/public/images/HeartItemSelected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/HeartItemSelected.png
--------------------------------------------------------------------------------
/public/images/HeartItemUnselected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/HeartItemUnselected.png
--------------------------------------------------------------------------------
/public/images/SearchIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/SearchIcon.png
--------------------------------------------------------------------------------
/public/images/SearchIconActive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/SearchIconActive.png
--------------------------------------------------------------------------------
/public/images/cart/AddOneItem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/cart/AddOneItem.png
--------------------------------------------------------------------------------
/public/images/cart/DeleteItem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/cart/DeleteItem.png
--------------------------------------------------------------------------------
/public/images/cart/SubtractOneItem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/cart/SubtractOneItem.png
--------------------------------------------------------------------------------
/public/images/navbar/CartIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/navbar/CartIcon.png
--------------------------------------------------------------------------------
/public/images/navbar/Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/navbar/Logo.png
--------------------------------------------------------------------------------
/public/images/navbar/UserLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/navbar/UserLogo.png
--------------------------------------------------------------------------------
/public/images/navbar/UserProfile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/navbar/UserProfile.png
--------------------------------------------------------------------------------
/public/images/navbar/rwr-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/navbar/rwr-logo.png
--------------------------------------------------------------------------------
/public/images/products/apple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/apple.png
--------------------------------------------------------------------------------
/public/images/products/apricot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/apricot.png
--------------------------------------------------------------------------------
/public/images/products/banana.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/banana.png
--------------------------------------------------------------------------------
/public/images/products/broccoli.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/broccoli.png
--------------------------------------------------------------------------------
/public/images/products/carrot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/carrot.png
--------------------------------------------------------------------------------
/public/images/products/cherry.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/cherry.png
--------------------------------------------------------------------------------
/public/images/products/dill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/dill.png
--------------------------------------------------------------------------------
/public/images/products/eggplant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/eggplant.png
--------------------------------------------------------------------------------
/public/images/products/garlic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/garlic.png
--------------------------------------------------------------------------------
/public/images/products/grape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/grape.png
--------------------------------------------------------------------------------
/public/images/products/honeydew.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/honeydew.png
--------------------------------------------------------------------------------
/public/images/products/kiwi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/kiwi.png
--------------------------------------------------------------------------------
/public/images/products/mango.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/mango.png
--------------------------------------------------------------------------------
/public/images/products/mushroom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/mushroom.png
--------------------------------------------------------------------------------
/public/images/products/nectarine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/nectarine.png
--------------------------------------------------------------------------------
/public/images/products/orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/orange.png
--------------------------------------------------------------------------------
/public/images/products/pear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/pear.png
--------------------------------------------------------------------------------
/public/images/products/pineapple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/realworldreact/react-shoppe/43e5b85d32dc21a569f261c7f60b3d7cf4f8a39f/public/images/products/pineapple.png
--------------------------------------------------------------------------------
/public/mocks/cart.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Cart
5 |
6 |
7 |
8 |