84 | );
85 | }
86 | }
87 |
88 | const mapDispatchToProps = dispatch => ({
89 | createBook: book => {
90 | dispatch(createBook(book));
91 | },
92 | });
93 |
94 | BooksForm.propTypes = {
95 | createBook: PropTypes.func.isRequired,
96 | };
97 |
98 | export default connect(null, mapDispatchToProps)(BooksForm);
99 |
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Black.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-BlackItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-BlackItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Bold.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-ExtraBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-ExtraBold.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-ExtraLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-ExtraLight.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Italic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Light.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-LightItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Medium.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-MediumItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Regular.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-SemiBold.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-Thin.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/Montserrat-ThinItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Montserrat/Montserrat-ThinItalic.ttf
--------------------------------------------------------------------------------
/src/fonts/Montserrat/OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat)
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | http://scripts.sil.org/OFL
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------
/src/fonts/Roboto_Slab/LICENSE.txt:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [yyyy] [name of copyright owner]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/src/fonts/Roboto_Slab/README.txt:
--------------------------------------------------------------------------------
1 | Roboto Slab Variable Font
2 | =========================
3 |
4 | This download contains Roboto Slab as both a variable font and static fonts.
5 |
6 | Roboto Slab is a variable font with this axis:
7 | wght
8 |
9 | This means all the styles are contained in a single file:
10 | RobotoSlab-VariableFont_wght.ttf
11 |
12 | If your app fully supports variable fonts, you can now pick intermediate styles
13 | that aren’t available as static fonts. Not all apps support variable fonts, and
14 | in those cases you can use the static font files for Roboto Slab:
15 | static/RobotoSlab-Thin.ttf
16 | static/RobotoSlab-ExtraLight.ttf
17 | static/RobotoSlab-Light.ttf
18 | static/RobotoSlab-Regular.ttf
19 | static/RobotoSlab-Medium.ttf
20 | static/RobotoSlab-SemiBold.ttf
21 | static/RobotoSlab-Bold.ttf
22 | static/RobotoSlab-ExtraBold.ttf
23 | static/RobotoSlab-Black.ttf
24 |
25 | Get started
26 | -----------
27 |
28 | 1. Install the font files you want to use
29 |
30 | 2. Use your app's font picker to view the font family and all the
31 | available styles
32 |
33 | Learn more about variable fonts
34 | -------------------------------
35 |
36 | https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
37 | https://variablefonts.typenetwork.com
38 | https://medium.com/variable-fonts
39 |
40 | In desktop apps
41 |
42 | https://theblog.adobe.com/can-variable-fonts-illustrator-cc
43 | https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
44 |
45 | Online
46 |
47 | https://developers.google.com/fonts/docs/getting_started
48 | https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
49 | https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
50 |
51 | Installing fonts
52 |
53 | MacOS: https://support.apple.com/en-us/HT201749
54 | Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
55 | Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
56 |
57 | Android Apps
58 |
59 | https://developers.google.com/fonts/docs/android
60 | https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
61 |
62 | License
63 | -------
64 | Please read the full license text (LICENSE.txt) to understand the permissions,
65 | restrictions and requirements for usage, redistribution, and modification.
66 |
67 | You can use them freely in your products & projects - print or digital,
68 | commercial or otherwise. However, you can't sell the fonts on their own.
69 |
70 | This isn't legal advice, please consider consulting a lawyer and see the full
71 | license for all details.
72 |
--------------------------------------------------------------------------------
/src/fonts/Roboto_Slab/RobotoSlab-VariableFont_wght.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Roboto_Slab/RobotoSlab-VariableFont_wght.ttf
--------------------------------------------------------------------------------
/src/fonts/Roboto_Slab/static/RobotoSlab-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/macnick/react-bookstore/60a048cd8f257f38a1ee964997e915391172a796/src/fonts/Roboto_Slab/static/RobotoSlab-Bold.ttf
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import { createStore } from 'redux';
4 | import { Provider } from 'react-redux';
5 | import App from './components/App';
6 | import reducer from './reducers/index';
7 | import { randomId, randomCat } from './randomGen/random';
8 | import './styles/reset.css';
9 | import './styles/main.css';
10 |
11 | const categories = [
12 | 'Action',
13 | 'Biography',
14 | 'History',
15 | 'Horror',
16 | 'Kids',
17 | 'Learning',
18 | 'Sci-Fi',
19 | ];
20 |
21 | const initialState = {
22 | books: [
23 | {
24 | bookId: randomId(),
25 | category: categories[randomCat()],
26 | title: 'Steve Jobs by Walter Isaacson',
27 | },
28 | {
29 | bookId: randomId(),
30 | category: categories[randomCat()],
31 | title: "You don't know JavaScript",
32 | },
33 | {
34 | bookId: randomId(),
35 | category: categories[randomCat()],
36 | title: 'Eloquent JavaScript',
37 | },
38 | {
39 | bookId: randomId(),
40 | category: categories[randomCat()],
41 | title: 'Pride and Prejudice',
42 | },
43 | ],
44 | filter: 'All',
45 | };
46 |
47 | const store = createStore(reducer, initialState);
48 |
49 | ReactDOM.render(
50 |
51 |
52 | ,
53 | document.getElementById('root'),
54 | );
55 |
--------------------------------------------------------------------------------
/src/randomGen/random.js:
--------------------------------------------------------------------------------
1 | const randomId = () => Math.floor(Math.random() * 1000);
2 |
3 | const randomCat = () => Math.floor(Math.random() * 7);
4 |
5 | export { randomId, randomCat };
6 |
--------------------------------------------------------------------------------
/src/reducers/books.js:
--------------------------------------------------------------------------------
1 | const CREATE_BOOK = 'CREATE_BOOK';
2 | const REMOVE_BOOK = 'REMOVE_BOOK';
3 |
4 | const randomId = () => Math.floor(Math.random() * 1000);
5 |
6 | const books = (state = [], action) => {
7 | switch (action.type) {
8 | case CREATE_BOOK:
9 | return [
10 | ...state,
11 | {
12 | bookId: randomId(),
13 | title: action.book.title,
14 | category: action.book.category,
15 | },
16 | ];
17 | case REMOVE_BOOK:
18 | return state.filter(book => book.bookId !== action.bookId);
19 | default:
20 | return state;
21 | }
22 | };
23 |
24 | export default books;
25 |
--------------------------------------------------------------------------------
/src/reducers/filter.js:
--------------------------------------------------------------------------------
1 | import { CHANGE_FILTER } from '../actions/index';
2 |
3 | const filter = (state = 'All', action) => {
4 | switch (action.type) {
5 | case CHANGE_FILTER:
6 | return action.category;
7 | default:
8 | return state;
9 | }
10 | };
11 |
12 | export default filter;
13 |
--------------------------------------------------------------------------------
/src/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 | import books from './books';
3 | import filter from './filter';
4 |
5 | const reducer = combineReducers({ books, filter });
6 |
7 | export default reducer;
8 |
--------------------------------------------------------------------------------
/src/styles/main.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: Montserrat;
3 | src: url(../fonts/Montserrat/Montserrat-Bold.ttf);
4 | }
5 |
6 | @font-face {
7 | font-family: Montserrat-reg;
8 | src: url(../fonts/Montserrat/Montserrat-Regular.ttf);
9 | }
10 |
11 | @font-face {
12 | font-family: RobotoSlab;
13 | src: url(../fonts/Roboto_Slab/static/RobotoSlab-Bold.ttf);
14 | }
15 |
16 | body {
17 | margin: 0;
18 | padding: 0;
19 | background-color: #f5f6fa;
20 | }
21 |
22 | hr {
23 | margin: 10px 5%;
24 | color: #e8e8e8;
25 | }
26 |
27 | .header {
28 | display: flex;
29 | justify-content: space-between;
30 | font-family: Montserrat, Helvetica, sans-serif;
31 | font-size: larger;
32 | margin: 41px 5% 38px 5%;
33 | }
34 |
35 | .container {
36 | display: block;
37 | justify-content: center;
38 | margin: 0 5%;
39 | }
40 |
41 | .line {
42 | display: flex;
43 | flex-direction: row;
44 | justify-content: space-between;
45 | border: 1px solid #e8e8e8;
46 | border-radius: 4px;
47 | background-color: #fff;
48 | padding: 40px 30px;
49 | margin-bottom: 10px;
50 | }
51 |
52 | .line > td {
53 | padding: 25px;
54 | }
55 |
56 | #title,
57 | #category {
58 | color: #121212;
59 | }
60 |
61 | #title {
62 | font-family: RobotSlab, serif;
63 | font-size: 22px;
64 | letter-spacing: -0.2px;
65 | }
66 |
67 | #category {
68 | font-family: Montserrat, Helvetica, sans-serif;
69 | font-size: 14px;
70 | color: #999;
71 | }
72 |
73 | .container button {
74 | background-color: #0290ff;
75 | color: #fff;
76 | border-radius: 3px;
77 | border: none;
78 | padding: 10px;
79 | }
80 |
81 | #logo {
82 | font-size: 30px;
83 | color: #0290ff;
84 | }
85 |
86 | #select {
87 | font-family: Montserrat, Helvetica, sans-serif;
88 | font-size: 13px;
89 | letter-spacing: 1.9px;
90 | text-transform: uppercase;
91 | color: #121212;
92 | }
93 |
94 | #add {
95 | font-family: Montserrat, Helvetica, sans-serif;
96 | font-size: 20px;
97 | letter-spacing: -0.18px;
98 | text-transform: uppercase;
99 | color: #888;
100 | margin: 5px 5%;
101 | }
102 |
103 | form {
104 | display: flex;
105 | margin: 10px 5%;
106 | justify-content: space-between;
107 | }
108 |
109 | input[type='text'],
110 | select {
111 | padding: 12px 17px;
112 | border: 1px solid #888;
113 | border-radius: 4px;
114 | font-family: Montserrat-reg, Helvetica, sans-serif;
115 | font-size: 16px;
116 | color: #c4c4c4;
117 | }
118 |
119 | input[type='text'] {
120 | width: 50%;
121 | }
122 |
123 | #cat {
124 | width: 30%;
125 | }
126 |
127 | input[type='submit'] {
128 | width: 14%;
129 | background-color: #0290ff;
130 | color: #fff;
131 | border-radius: 3px;
132 | border: none;
133 | padding: 9px;
134 | }
135 |
136 | @media only screen and (max-width: 780px) {
137 | form {
138 | flex-direction: column;
139 | }
140 |
141 | input[type='text'] {
142 | padding: 12px 4% 12px 4%;
143 | width: 92%;
144 | }
145 |
146 | input[type='submit'],
147 | select {
148 | width: 100%;
149 | margin-top: 10px;
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/src/styles/reset.css:
--------------------------------------------------------------------------------
1 | /* http://meyerweb.com/eric/tools/css/reset/
2 | v2.0-modified | 20110126
3 | License: none (public domain)
4 | */
5 |
6 | html,
7 | body,
8 | div,
9 | span,
10 | applet,
11 | object,
12 | iframe,
13 | h1,
14 | h2,
15 | h3,
16 | h4,
17 | h5,
18 | h6,
19 | p,
20 | blockquote,
21 | pre,
22 | a,
23 | abbr,
24 | acronym,
25 | address,
26 | big,
27 | cite,
28 | code,
29 | del,
30 | dfn,
31 | em,
32 | img,
33 | ins,
34 | kbd,
35 | q,
36 | s,
37 | samp,
38 | small,
39 | strike,
40 | strong,
41 | sub,
42 | sup,
43 | tt,
44 | var,
45 | b,
46 | u,
47 | i,
48 | center,
49 | dl,
50 | dt,
51 | dd,
52 | ol,
53 | ul,
54 | li,
55 | fieldset,
56 | form,
57 | label,
58 | legend,
59 | table,
60 | caption,
61 | tbody,
62 | tfoot,
63 | thead,
64 | tr,
65 | th,
66 | td,
67 | article,
68 | aside,
69 | canvas,
70 | details,
71 | embed,
72 | figure,
73 | figcaption,
74 | footer,
75 | header,
76 | hgroup,
77 | menu,
78 | nav,
79 | output,
80 | ruby,
81 | section,
82 | summary,
83 | time,
84 | mark,
85 | audio,
86 | video {
87 | margin: 0;
88 | padding: 0;
89 | border: 0;
90 | font-size: 100%;
91 | font: inherit;
92 | vertical-align: baseline;
93 | }
94 |
95 | /* make sure to set some focus styles for accessibility */
96 | :focus {
97 | outline: 0;
98 | }
99 |
100 | /* HTML5 display-role reset for older browsers */
101 | article,
102 | aside,
103 | details,
104 | figcaption,
105 | figure,
106 | footer,
107 | header,
108 | hgroup,
109 | menu,
110 | nav,
111 | section {
112 | display: block;
113 | }
114 |
115 | body {
116 | line-height: 1;
117 | }
118 |
119 | ol,
120 | ul {
121 | list-style: none;
122 | }
123 |
124 | blockquote,
125 | q {
126 | quotes: none;
127 | }
128 |
129 | blockquote:before,
130 | blockquote:after,
131 | q:before,
132 | q:after {
133 | content: '';
134 | content: none;
135 | }
136 |
137 | table {
138 | border-collapse: collapse;
139 | border-spacing: 0;
140 | }
141 |
142 | input[type='search']::-webkit-search-cancel-button,
143 | input[type='search']::-webkit-search-decoration,
144 | input[type='search']::-webkit-search-results-button,
145 | input[type='search']::-webkit-search-results-decoration {
146 | -webkit-appearance: none;
147 | -moz-appearance: none;
148 | }
149 |
150 | input[type='search'] {
151 | -webkit-appearance: none;
152 | -moz-appearance: none;
153 | -webkit-box-sizing: content-box;
154 | -moz-box-sizing: content-box;
155 | box-sizing: content-box;
156 | }
157 |
158 | textarea {
159 | overflow: auto;
160 | vertical-align: top;
161 | resize: vertical;
162 | }
163 |
164 | /**
165 | * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
166 | */
167 |
168 | audio,
169 | canvas,
170 | video {
171 | display: inline-block;
172 | *display: inline;
173 | *zoom: 1;
174 | max-width: 100%;
175 | }
176 |
177 | /**
178 | * Prevent modern browsers from displaying `audio` without controls.
179 | * Remove excess height in iOS 5 devices.
180 | */
181 |
182 | audio:not([controls]) {
183 | display: none;
184 | height: 0;
185 | }
186 |
187 | /**
188 | * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
189 | * Known issue: no IE 6 support.
190 | */
191 |
192 | [hidden] {
193 | display: none;
194 | }
195 |
196 | /**
197 | * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
198 | * `em` units.
199 | * 2. Prevent iOS text size adjust after orientation change, without disabling
200 | * user zoom.
201 | */
202 |
203 | html {
204 | font-size: 100%; /* 1 */
205 | -webkit-text-size-adjust: 100%; /* 2 */
206 | -ms-text-size-adjust: 100%; /* 2 */
207 | }
208 |
209 | /**
210 | * Address `outline` inconsistency between Chrome and other browsers.
211 | */
212 |
213 | a:focus {
214 | outline: thin dotted;
215 | }
216 |
217 | /**
218 | * Improve readability when focused and also mouse hovered in all browsers.
219 | */
220 |
221 | a:active,
222 | a:hover {
223 | outline: 0;
224 | }
225 |
226 | /**
227 | * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
228 | * 2. Improve image quality when scaled in IE 7.
229 | */
230 |
231 | img {
232 | border: 0; /* 1 */
233 | -ms-interpolation-mode: bicubic; /* 2 */
234 | }
235 |
236 | /**
237 | * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
238 | */
239 |
240 | figure {
241 | margin: 0;
242 | }
243 |
244 | /**
245 | * Correct margin displayed oddly in IE 6/7.
246 | */
247 |
248 | form {
249 | margin: 0;
250 | }
251 |
252 | /**
253 | * Define consistent border, margin, and padding.
254 | */
255 |
256 | fieldset {
257 | border: 1px solid #c0c0c0;
258 | margin: 0 2px;
259 | padding: 0.35em 0.625em 0.75em;
260 | }
261 |
262 | /**
263 | * 1. Correct color not being inherited in IE 6/7/8/9.
264 | * 2. Correct text not wrapping in Firefox 3.
265 | * 3. Correct alignment displayed oddly in IE 6/7.
266 | */
267 |
268 | legend {
269 | border: 0; /* 1 */
270 | padding: 0;
271 | white-space: normal; /* 2 */
272 | *margin-left: -7px; /* 3 */
273 | }
274 |
275 | /**
276 | * 1. Correct font size not being inherited in all browsers.
277 | * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
278 | * and Chrome.
279 | * 3. Improve appearance and consistency in all browsers.
280 | */
281 |
282 | button,
283 | input,
284 | select,
285 | textarea {
286 | font-size: 100%; /* 1 */
287 | margin: 0; /* 2 */
288 | vertical-align: baseline; /* 3 */
289 | *vertical-align: middle; /* 3 */
290 | }
291 |
292 | /**
293 | * Address Firefox 3+ setting `line-height` on `input` using `!important` in
294 | * the UA stylesheet.
295 | */
296 |
297 | button,
298 | input {
299 | line-height: normal;
300 | }
301 |
302 | /**
303 | * Address inconsistent `text-transform` inheritance for `button` and `select`.
304 | * All other form control elements do not inherit `text-transform` values.
305 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
306 | * Correct `select` style inheritance in Firefox 4+ and Opera.
307 | */
308 |
309 | button,
310 | select {
311 | text-transform: none;
312 | }
313 |
314 | /**
315 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
316 | * and `video` controls.
317 | * 2. Correct inability to style clickable `input` types in iOS.
318 | * 3. Improve usability and consistency of cursor style between image-type
319 | * `input` and others.
320 | * 4. Remove inner spacing in IE 7 without affecting normal text inputs.
321 | * Known issue: inner spacing remains in IE 6.
322 | */
323 |
324 | button,
325 | html input[type="button"], /* 1 */
326 | input[type="reset"],
327 | input[type="submit"] {
328 | -webkit-appearance: button; /* 2 */
329 | cursor: pointer; /* 3 */
330 | *overflow: visible; /* 4 */
331 | }
332 |
333 | /**
334 | * Re-set default cursor for disabled elements.
335 | */
336 |
337 | button[disabled],
338 | html input[disabled] {
339 | cursor: default;
340 | }
341 |
342 | /**
343 | * 1. Address box sizing set to content-box in IE 8/9.
344 | * 2. Remove excess padding in IE 8/9.
345 | * 3. Remove excess padding in IE 7.
346 | * Known issue: excess padding remains in IE 6.
347 | */
348 |
349 | input[type='checkbox'],
350 | input[type='radio'] {
351 | box-sizing: border-box; /* 1 */
352 | padding: 0; /* 2 */
353 | *height: 13px; /* 3 */
354 | *width: 13px; /* 3 */
355 | }
356 |
357 | /**
358 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
359 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
360 | * (include `-moz` to future-proof).
361 | */
362 |
363 | input[type='search'] {
364 | -webkit-appearance: textfield; /* 1 */
365 | -moz-box-sizing: content-box;
366 | -webkit-box-sizing: content-box; /* 2 */
367 | box-sizing: content-box;
368 | }
369 |
370 | /**
371 | * Remove inner padding and search cancel button in Safari 5 and Chrome
372 | * on OS X.
373 | */
374 |
375 | input[type='search']::-webkit-search-cancel-button,
376 | input[type='search']::-webkit-search-decoration {
377 | -webkit-appearance: none;
378 | }
379 |
380 | /**
381 | * Remove inner padding and border in Firefox 3+.
382 | */
383 |
384 | button::-moz-focus-inner,
385 | input::-moz-focus-inner {
386 | border: 0;
387 | padding: 0;
388 | }
389 |
390 | /**
391 | * 1. Remove default vertical scrollbar in IE 6/7/8/9.
392 | * 2. Improve readability and alignment in all browsers.
393 | */
394 |
395 | textarea {
396 | overflow: auto; /* 1 */
397 | vertical-align: top; /* 2 */
398 | }
399 |
400 | /**
401 | * Remove most spacing between table cells.
402 | */
403 |
404 | table {
405 | border-collapse: collapse;
406 | border-spacing: 0;
407 | }
408 |
409 | html,
410 | button,
411 | input,
412 | select,
413 | textarea {
414 | color: #222;
415 | }
416 |
417 | ::-moz-selection {
418 | background: #b3d4fc;
419 | text-shadow: none;
420 | }
421 |
422 | ::selection {
423 | background: #b3d4fc;
424 | text-shadow: none;
425 | }
426 |
427 | img {
428 | vertical-align: middle;
429 | }
430 |
431 | fieldset {
432 | border: 0;
433 | margin: 0;
434 | padding: 0;
435 | }
436 |
437 | textarea {
438 | resize: vertical;
439 | }
440 |
441 | .chromeframe {
442 | margin: 0.2em 0;
443 | background: #ccc;
444 | color: #000;
445 | padding: 0.2em 0;
446 | }
447 |
--------------------------------------------------------------------------------