├── .babelrc
├── .eslintrc.json
├── .gitignore
├── .npmignore
├── LICENSE
├── Readme.md
├── app.js
├── devServer.js
├── index.html
├── index.js
├── index.tmpl
├── package.json
├── src
├── actions
│ └── index.js
├── api.js
├── assets
│ ├── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.svg
│ │ ├── fontawesome-webfont.ttf
│ │ ├── fontawesome-webfont.woff
│ │ └── fontawesome-webfont.woff2
│ ├── imgs
│ │ └── user.png
│ └── style
│ │ ├── antd.css
│ │ ├── font-awesome.css
│ │ └── style.css
├── components
│ ├── displayPannel
│ │ ├── displayPannel.css
│ │ └── index.js
│ ├── header
│ │ ├── header.css
│ │ └── index.js
│ ├── index.js
│ └── searchForm
│ │ ├── index.js
│ │ └── searchForm.css
├── constants
│ └── index.js
├── pages
│ ├── base.js
│ ├── forks.js
│ ├── home.js
│ ├── index.js
│ └── pulls.js
├── reducers
│ ├── index.js
│ └── main.reducer.js
├── service
│ └── index.js
└── store
│ ├── configureStore.dev.js
│ ├── configureStore.prod.js
│ └── index.js
├── webpack.config.dev.js
└── webpack.config.prod.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["react", "es2015", "stage-0"],
3 | "env": {
4 | "development": {
5 | "presets": ["react-hmre"]
6 | }
7 | },
8 | "plugins": ["lodash"]
9 | }
10 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "airbnb",
3 | "rules": {
4 | "semi": [2, "never"]
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
3 | dist
4 | lib
5 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | bower_components/
2 | *.cfg
3 | node_modules/
4 | nohup.out
5 | *.iml
6 | .idea/
7 | .ipr
8 | .iws
9 | *~
10 | ~*
11 | *.diff
12 | *.log
13 | *.patch
14 | *.bak
15 | .DS_Store
16 | Thumbs.db
17 | .project
18 | .*proj
19 | .svn/
20 | *.swp
21 | out/
22 | .build
23 | node_modules
24 | _site
25 | .cache
26 | dist
27 | tests/*.css
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 魏嘉汛
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # React-Redux-Intro
2 |
3 | 该项目中包含初始化一个React-Redux项目所需的基本配置,并包含一个基于ant-design的demo。
4 |
5 | 启动:
6 |
7 | ```
8 | npm install
9 | npm start
10 | ```
11 |
12 | 该项目建议使用chrome应用商店提供的`Redux DevTools`。
13 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import { Provider } from 'react-redux'
3 | import { Router, Route, IndexRoute, hashHistory } from 'react-router'
4 | import { syncHistory } from 'react-router-redux'
5 |
6 | import 'SRC/assets/style/antd.css'
7 | import 'SRC/assets/style/font-awesome.css'
8 | import 'SRC/assets/style/style.css'
9 |
10 | import configureStore from 'SRC/store'
11 |
12 | import { Base, Home, Forks, Pulls } from 'SRC/pages'
13 |
14 | const reduxRouterMiddleware = syncHistory(hashHistory)
15 | const store = configureStore()
16 | reduxRouterMiddleware.listenForReplays(store)
17 |
18 | export default class App extends Component {
19 | render() {
20 | return (
21 |
22 | {window.scrollTo(0, 0)}}>
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | )
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/devServer.js:
--------------------------------------------------------------------------------
1 | var path = require('path');
2 | var express = require('express');
3 | var webpack = require('webpack');
4 | var config = require('./webpack.config.dev');
5 |
6 | var app = express();
7 | var compiler = webpack(config);
8 |
9 | app.use(require('webpack-dev-middleware')(compiler, {
10 | noInfo: true,
11 | publicPath: config.output.publicPath
12 | }));
13 |
14 | app.use(require('webpack-hot-middleware')(compiler));
15 |
16 | app.get('*', function(req, res) {
17 | res.sendFile(path.join(__dirname, 'index.html'));
18 | });
19 |
20 | app.listen(8000, 'localhost', function(err) {
21 | if (err) {
22 | console.log(err);
23 | return;
24 | }
25 |
26 | console.log('Listening at http://localhost:8000');
27 | });
28 |
29 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 查看fackbook开源项目的demo
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /* vim: set filetype=javascript.jsx */
2 |
3 | import React from 'react'
4 | import ReactDOM from 'react-dom'
5 | import App from './app'
6 |
7 | ReactDOM.render(
8 | ,
9 | document.getElementById('container')
10 | )
11 |
12 | // ReactDOM.render(, document.getElementById('container'));
13 |
--------------------------------------------------------------------------------
/index.tmpl:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 查看fackbook开源项目的demo
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-redux-intro",
3 | "version": "1.0.0",
4 | "description": "react-init",
5 | "scripts": {
6 | "clean": "rimraf dist",
7 | "build:webpack": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js",
8 | "build": "npm run clean && npm run build:webpack",
9 | "start": "node devServer.js",
10 | "lint": "eslint src"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/ant-design/ant-design"
15 | },
16 | "dependencies": {
17 | "antd": "^1.6.2",
18 | "classnames": "^2.2.3",
19 | "immutable": "^3.7.6",
20 | "isomorphic-fetch": "^2.2.0",
21 | "lodash": "^3.10.1",
22 | "react": "^15.1.0",
23 | "react-css-modules": "^3.7.4",
24 | "react-dom": "^15.1.0",
25 | "react-redux": "^4.0.0",
26 | "react-router": "^2.0.0",
27 | "react-router-redux": "^2.0",
28 | "redux": "^3.0.4",
29 | "redux-thunk": "^1.0.3",
30 | "webpack": "^1.12.14"
31 | },
32 | "devDependencies": {
33 | "babel-core": "^6.3.15",
34 | "babel-loader": "^6.2.0",
35 | "babel-plugin-lodash": "^1.0.2",
36 | "babel-preset-es2015": "^6.3.13",
37 | "babel-preset-react": "^6.3.13",
38 | "babel-preset-react-hmre": "^1.0.0",
39 | "babel-preset-stage-0": "^6.3.13",
40 | "cross-env": "^1.0.6",
41 | "css-loader": "~0.21.0",
42 | "eslint": "^2.13.1",
43 | "eslint-config-airbnb": "^9.0.1",
44 | "eslint-plugin-import": "^1.9.2",
45 | "eslint-plugin-jsx-a11y": "^1.5.3",
46 | "eslint-plugin-react": "^5.2.2",
47 | "eventsource-polyfill": "^0.9.6",
48 | "express": "^4.13.3",
49 | "extract-text-webpack-plugin": "^1.0.1",
50 | "file-loader": "~0.8.4",
51 | "html-webpack-plugin": "^2.8.1",
52 | "object-assign": "~3.0.0",
53 | "pre-commit": "^1.1.2",
54 | "rimraf": "^2.4.3",
55 | "style-loader": "^0.8.3",
56 | "url-loader": "~0.5.6",
57 | "webpack": "^1.12.9",
58 | "webpack-dev-middleware": "^1.4.0",
59 | "webpack-hot-middleware": "^2.6.0"
60 | },
61 | "pre-commit": [
62 | "lint"
63 | ],
64 | "keywords": [],
65 | "author": "",
66 | "license": "MIT"
67 | }
68 |
--------------------------------------------------------------------------------
/src/actions/index.js:
--------------------------------------------------------------------------------
1 | import fetch from 'isomorphic-fetch'
2 | import api from 'SRC/api'
3 |
4 | import { SET_SEARCH_KEY, RECEIVE_DATA } from 'SRC/constants'
5 |
6 | export function setSearchKey(category, key) {
7 | return {
8 | type: SET_SEARCH_KEY,
9 | category,
10 | key
11 | }
12 | }
13 |
14 | function receiveData(use, json) {
15 | return {
16 | type: RECEIVE_DATA,
17 | use: use,
18 | data: json
19 | }
20 | }
21 |
22 | function fetchData(main, use) {
23 | const { keySet } = main.toJS()
24 |
25 | let url = api[use](keySet[use])
26 |
27 | return dispatch => {
28 | return fetch(url)
29 | .then(response => response.json())
30 | .then(json => dispatch(receiveData(use, json)))
31 | }
32 | }
33 |
34 | export function fetchAll(use) {
35 | return (dispatch, getState) => {
36 | const { main } = getState()
37 | return dispatch(fetchData(main, use))
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/api.js:
--------------------------------------------------------------------------------
1 | // 所有的 API
2 |
3 | const host = 'https://api.github.com/repos/facebook'
4 |
5 | const api = {
6 | forks(repos) {
7 | return `${host}/${repos}/forks`
8 | },
9 | pulls(repos) {
10 | return `${host}/${repos}/pulls`
11 | }
12 | }
13 |
14 | export default api
15 |
--------------------------------------------------------------------------------
/src/assets/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/src/assets/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/src/assets/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/src/assets/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/src/assets/imgs/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/imgs/user.png
--------------------------------------------------------------------------------
/src/assets/style/font-awesome.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 | /* FONT PATH
6 | * -------------------------- */
7 | @font-face {
8 | font-family: 'FontAwesome';
9 | src: url('../fonts/fontawesome-webfont.eot?v=4.5.0');
10 | src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');
11 | font-weight: normal;
12 | font-style: normal;
13 | }
14 | .fa {
15 | display: inline-block;
16 | font: normal normal normal 14px/1 FontAwesome;
17 | font-size: inherit;
18 | text-rendering: auto;
19 | -webkit-font-smoothing: antialiased;
20 | -moz-osx-font-smoothing: grayscale;
21 | }
22 | /* makes the font 33% larger relative to the icon container */
23 | .fa-lg {
24 | font-size: 1.33333333em;
25 | line-height: 0.75em;
26 | vertical-align: -15%;
27 | }
28 | .fa-2x {
29 | font-size: 2em;
30 | }
31 | .fa-3x {
32 | font-size: 3em;
33 | }
34 | .fa-4x {
35 | font-size: 4em;
36 | }
37 | .fa-5x {
38 | font-size: 5em;
39 | }
40 | .fa-fw {
41 | width: 1.28571429em;
42 | text-align: center;
43 | }
44 | .fa-ul {
45 | padding-left: 0;
46 | margin-left: 2.14285714em;
47 | list-style-type: none;
48 | }
49 | .fa-ul > li {
50 | position: relative;
51 | }
52 | .fa-li {
53 | position: absolute;
54 | left: -2.14285714em;
55 | width: 2.14285714em;
56 | top: 0.14285714em;
57 | text-align: center;
58 | }
59 | .fa-li.fa-lg {
60 | left: -1.85714286em;
61 | }
62 | .fa-border {
63 | padding: .2em .25em .15em;
64 | border: solid 0.08em #eeeeee;
65 | border-radius: .1em;
66 | }
67 | .fa-pull-left {
68 | float: left;
69 | }
70 | .fa-pull-right {
71 | float: right;
72 | }
73 | .fa.fa-pull-left {
74 | margin-right: .3em;
75 | }
76 | .fa.fa-pull-right {
77 | margin-left: .3em;
78 | }
79 | /* Deprecated as of 4.4.0 */
80 | .pull-right {
81 | float: right;
82 | }
83 | .pull-left {
84 | float: left;
85 | }
86 | .fa.pull-left {
87 | margin-right: .3em;
88 | }
89 | .fa.pull-right {
90 | margin-left: .3em;
91 | }
92 | .fa-spin {
93 | -webkit-animation: fa-spin 2s infinite linear;
94 | animation: fa-spin 2s infinite linear;
95 | }
96 | .fa-pulse {
97 | -webkit-animation: fa-spin 1s infinite steps(8);
98 | animation: fa-spin 1s infinite steps(8);
99 | }
100 | @-webkit-keyframes fa-spin {
101 | 0% {
102 | -webkit-transform: rotate(0deg);
103 | transform: rotate(0deg);
104 | }
105 | 100% {
106 | -webkit-transform: rotate(359deg);
107 | transform: rotate(359deg);
108 | }
109 | }
110 | @keyframes fa-spin {
111 | 0% {
112 | -webkit-transform: rotate(0deg);
113 | transform: rotate(0deg);
114 | }
115 | 100% {
116 | -webkit-transform: rotate(359deg);
117 | transform: rotate(359deg);
118 | }
119 | }
120 | .fa-rotate-90 {
121 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
122 | -webkit-transform: rotate(90deg);
123 | -ms-transform: rotate(90deg);
124 | transform: rotate(90deg);
125 | }
126 | .fa-rotate-180 {
127 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
128 | -webkit-transform: rotate(180deg);
129 | -ms-transform: rotate(180deg);
130 | transform: rotate(180deg);
131 | }
132 | .fa-rotate-270 {
133 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
134 | -webkit-transform: rotate(270deg);
135 | -ms-transform: rotate(270deg);
136 | transform: rotate(270deg);
137 | }
138 | .fa-flip-horizontal {
139 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
140 | -webkit-transform: scale(-1, 1);
141 | -ms-transform: scale(-1, 1);
142 | transform: scale(-1, 1);
143 | }
144 | .fa-flip-vertical {
145 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
146 | -webkit-transform: scale(1, -1);
147 | -ms-transform: scale(1, -1);
148 | transform: scale(1, -1);
149 | }
150 | :root .fa-rotate-90,
151 | :root .fa-rotate-180,
152 | :root .fa-rotate-270,
153 | :root .fa-flip-horizontal,
154 | :root .fa-flip-vertical {
155 | filter: none;
156 | }
157 | .fa-stack {
158 | position: relative;
159 | display: inline-block;
160 | width: 2em;
161 | height: 2em;
162 | line-height: 2em;
163 | vertical-align: middle;
164 | }
165 | .fa-stack-1x,
166 | .fa-stack-2x {
167 | position: absolute;
168 | left: 0;
169 | width: 100%;
170 | text-align: center;
171 | }
172 | .fa-stack-1x {
173 | line-height: inherit;
174 | }
175 | .fa-stack-2x {
176 | font-size: 2em;
177 | }
178 | .fa-inverse {
179 | color: #ffffff;
180 | }
181 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
182 | readers do not read off random characters that represent icons */
183 | .fa-glass:before {
184 | content: "\f000";
185 | }
186 | .fa-music:before {
187 | content: "\f001";
188 | }
189 | .fa-search:before {
190 | content: "\f002";
191 | }
192 | .fa-envelope-o:before {
193 | content: "\f003";
194 | }
195 | .fa-heart:before {
196 | content: "\f004";
197 | }
198 | .fa-star:before {
199 | content: "\f005";
200 | }
201 | .fa-star-o:before {
202 | content: "\f006";
203 | }
204 | .fa-user:before {
205 | content: "\f007";
206 | }
207 | .fa-film:before {
208 | content: "\f008";
209 | }
210 | .fa-th-large:before {
211 | content: "\f009";
212 | }
213 | .fa-th:before {
214 | content: "\f00a";
215 | }
216 | .fa-th-list:before {
217 | content: "\f00b";
218 | }
219 | .fa-check:before {
220 | content: "\f00c";
221 | }
222 | .fa-remove:before,
223 | .fa-close:before,
224 | .fa-times:before {
225 | content: "\f00d";
226 | }
227 | .fa-search-plus:before {
228 | content: "\f00e";
229 | }
230 | .fa-search-minus:before {
231 | content: "\f010";
232 | }
233 | .fa-power-off:before {
234 | content: "\f011";
235 | }
236 | .fa-signal:before {
237 | content: "\f012";
238 | }
239 | .fa-gear:before,
240 | .fa-cog:before {
241 | content: "\f013";
242 | }
243 | .fa-trash-o:before {
244 | content: "\f014";
245 | }
246 | .fa-home:before {
247 | content: "\f015";
248 | }
249 | .fa-file-o:before {
250 | content: "\f016";
251 | }
252 | .fa-clock-o:before {
253 | content: "\f017";
254 | }
255 | .fa-road:before {
256 | content: "\f018";
257 | }
258 | .fa-download:before {
259 | content: "\f019";
260 | }
261 | .fa-arrow-circle-o-down:before {
262 | content: "\f01a";
263 | }
264 | .fa-arrow-circle-o-up:before {
265 | content: "\f01b";
266 | }
267 | .fa-inbox:before {
268 | content: "\f01c";
269 | }
270 | .fa-play-circle-o:before {
271 | content: "\f01d";
272 | }
273 | .fa-rotate-right:before,
274 | .fa-repeat:before {
275 | content: "\f01e";
276 | }
277 | .fa-refresh:before {
278 | content: "\f021";
279 | }
280 | .fa-list-alt:before {
281 | content: "\f022";
282 | }
283 | .fa-lock:before {
284 | content: "\f023";
285 | }
286 | .fa-flag:before {
287 | content: "\f024";
288 | }
289 | .fa-headphones:before {
290 | content: "\f025";
291 | }
292 | .fa-volume-off:before {
293 | content: "\f026";
294 | }
295 | .fa-volume-down:before {
296 | content: "\f027";
297 | }
298 | .fa-volume-up:before {
299 | content: "\f028";
300 | }
301 | .fa-qrcode:before {
302 | content: "\f029";
303 | }
304 | .fa-barcode:before {
305 | content: "\f02a";
306 | }
307 | .fa-tag:before {
308 | content: "\f02b";
309 | }
310 | .fa-tags:before {
311 | content: "\f02c";
312 | }
313 | .fa-book:before {
314 | content: "\f02d";
315 | }
316 | .fa-bookmark:before {
317 | content: "\f02e";
318 | }
319 | .fa-print:before {
320 | content: "\f02f";
321 | }
322 | .fa-camera:before {
323 | content: "\f030";
324 | }
325 | .fa-font:before {
326 | content: "\f031";
327 | }
328 | .fa-bold:before {
329 | content: "\f032";
330 | }
331 | .fa-italic:before {
332 | content: "\f033";
333 | }
334 | .fa-text-height:before {
335 | content: "\f034";
336 | }
337 | .fa-text-width:before {
338 | content: "\f035";
339 | }
340 | .fa-align-left:before {
341 | content: "\f036";
342 | }
343 | .fa-align-center:before {
344 | content: "\f037";
345 | }
346 | .fa-align-right:before {
347 | content: "\f038";
348 | }
349 | .fa-align-justify:before {
350 | content: "\f039";
351 | }
352 | .fa-list:before {
353 | content: "\f03a";
354 | }
355 | .fa-dedent:before,
356 | .fa-outdent:before {
357 | content: "\f03b";
358 | }
359 | .fa-indent:before {
360 | content: "\f03c";
361 | }
362 | .fa-video-camera:before {
363 | content: "\f03d";
364 | }
365 | .fa-photo:before,
366 | .fa-image:before,
367 | .fa-picture-o:before {
368 | content: "\f03e";
369 | }
370 | .fa-pencil:before {
371 | content: "\f040";
372 | }
373 | .fa-map-marker:before {
374 | content: "\f041";
375 | }
376 | .fa-adjust:before {
377 | content: "\f042";
378 | }
379 | .fa-tint:before {
380 | content: "\f043";
381 | }
382 | .fa-edit:before,
383 | .fa-pencil-square-o:before {
384 | content: "\f044";
385 | }
386 | .fa-share-square-o:before {
387 | content: "\f045";
388 | }
389 | .fa-check-square-o:before {
390 | content: "\f046";
391 | }
392 | .fa-arrows:before {
393 | content: "\f047";
394 | }
395 | .fa-step-backward:before {
396 | content: "\f048";
397 | }
398 | .fa-fast-backward:before {
399 | content: "\f049";
400 | }
401 | .fa-backward:before {
402 | content: "\f04a";
403 | }
404 | .fa-play:before {
405 | content: "\f04b";
406 | }
407 | .fa-pause:before {
408 | content: "\f04c";
409 | }
410 | .fa-stop:before {
411 | content: "\f04d";
412 | }
413 | .fa-forward:before {
414 | content: "\f04e";
415 | }
416 | .fa-fast-forward:before {
417 | content: "\f050";
418 | }
419 | .fa-step-forward:before {
420 | content: "\f051";
421 | }
422 | .fa-eject:before {
423 | content: "\f052";
424 | }
425 | .fa-chevron-left:before {
426 | content: "\f053";
427 | }
428 | .fa-chevron-right:before {
429 | content: "\f054";
430 | }
431 | .fa-plus-circle:before {
432 | content: "\f055";
433 | }
434 | .fa-minus-circle:before {
435 | content: "\f056";
436 | }
437 | .fa-times-circle:before {
438 | content: "\f057";
439 | }
440 | .fa-check-circle:before {
441 | content: "\f058";
442 | }
443 | .fa-question-circle:before {
444 | content: "\f059";
445 | }
446 | .fa-info-circle:before {
447 | content: "\f05a";
448 | }
449 | .fa-crosshairs:before {
450 | content: "\f05b";
451 | }
452 | .fa-times-circle-o:before {
453 | content: "\f05c";
454 | }
455 | .fa-check-circle-o:before {
456 | content: "\f05d";
457 | }
458 | .fa-ban:before {
459 | content: "\f05e";
460 | }
461 | .fa-arrow-left:before {
462 | content: "\f060";
463 | }
464 | .fa-arrow-right:before {
465 | content: "\f061";
466 | }
467 | .fa-arrow-up:before {
468 | content: "\f062";
469 | }
470 | .fa-arrow-down:before {
471 | content: "\f063";
472 | }
473 | .fa-mail-forward:before,
474 | .fa-share:before {
475 | content: "\f064";
476 | }
477 | .fa-expand:before {
478 | content: "\f065";
479 | }
480 | .fa-compress:before {
481 | content: "\f066";
482 | }
483 | .fa-plus:before {
484 | content: "\f067";
485 | }
486 | .fa-minus:before {
487 | content: "\f068";
488 | }
489 | .fa-asterisk:before {
490 | content: "\f069";
491 | }
492 | .fa-exclamation-circle:before {
493 | content: "\f06a";
494 | }
495 | .fa-gift:before {
496 | content: "\f06b";
497 | }
498 | .fa-leaf:before {
499 | content: "\f06c";
500 | }
501 | .fa-fire:before {
502 | content: "\f06d";
503 | }
504 | .fa-eye:before {
505 | content: "\f06e";
506 | }
507 | .fa-eye-slash:before {
508 | content: "\f070";
509 | }
510 | .fa-warning:before,
511 | .fa-exclamation-triangle:before {
512 | content: "\f071";
513 | }
514 | .fa-plane:before {
515 | content: "\f072";
516 | }
517 | .fa-calendar:before {
518 | content: "\f073";
519 | }
520 | .fa-random:before {
521 | content: "\f074";
522 | }
523 | .fa-comment:before {
524 | content: "\f075";
525 | }
526 | .fa-magnet:before {
527 | content: "\f076";
528 | }
529 | .fa-chevron-up:before {
530 | content: "\f077";
531 | }
532 | .fa-chevron-down:before {
533 | content: "\f078";
534 | }
535 | .fa-retweet:before {
536 | content: "\f079";
537 | }
538 | .fa-shopping-cart:before {
539 | content: "\f07a";
540 | }
541 | .fa-folder:before {
542 | content: "\f07b";
543 | }
544 | .fa-folder-open:before {
545 | content: "\f07c";
546 | }
547 | .fa-arrows-v:before {
548 | content: "\f07d";
549 | }
550 | .fa-arrows-h:before {
551 | content: "\f07e";
552 | }
553 | .fa-bar-chart-o:before,
554 | .fa-bar-chart:before {
555 | content: "\f080";
556 | }
557 | .fa-twitter-square:before {
558 | content: "\f081";
559 | }
560 | .fa-facebook-square:before {
561 | content: "\f082";
562 | }
563 | .fa-camera-retro:before {
564 | content: "\f083";
565 | }
566 | .fa-key:before {
567 | content: "\f084";
568 | }
569 | .fa-gears:before,
570 | .fa-cogs:before {
571 | content: "\f085";
572 | }
573 | .fa-comments:before {
574 | content: "\f086";
575 | }
576 | .fa-thumbs-o-up:before {
577 | content: "\f087";
578 | }
579 | .fa-thumbs-o-down:before {
580 | content: "\f088";
581 | }
582 | .fa-star-half:before {
583 | content: "\f089";
584 | }
585 | .fa-heart-o:before {
586 | content: "\f08a";
587 | }
588 | .fa-sign-out:before {
589 | content: "\f08b";
590 | }
591 | .fa-linkedin-square:before {
592 | content: "\f08c";
593 | }
594 | .fa-thumb-tack:before {
595 | content: "\f08d";
596 | }
597 | .fa-external-link:before {
598 | content: "\f08e";
599 | }
600 | .fa-sign-in:before {
601 | content: "\f090";
602 | }
603 | .fa-trophy:before {
604 | content: "\f091";
605 | }
606 | .fa-github-square:before {
607 | content: "\f092";
608 | }
609 | .fa-upload:before {
610 | content: "\f093";
611 | }
612 | .fa-lemon-o:before {
613 | content: "\f094";
614 | }
615 | .fa-phone:before {
616 | content: "\f095";
617 | }
618 | .fa-square-o:before {
619 | content: "\f096";
620 | }
621 | .fa-bookmark-o:before {
622 | content: "\f097";
623 | }
624 | .fa-phone-square:before {
625 | content: "\f098";
626 | }
627 | .fa-twitter:before {
628 | content: "\f099";
629 | }
630 | .fa-facebook-f:before,
631 | .fa-facebook:before {
632 | content: "\f09a";
633 | }
634 | .fa-github:before {
635 | content: "\f09b";
636 | }
637 | .fa-unlock:before {
638 | content: "\f09c";
639 | }
640 | .fa-credit-card:before {
641 | content: "\f09d";
642 | }
643 | .fa-feed:before,
644 | .fa-rss:before {
645 | content: "\f09e";
646 | }
647 | .fa-hdd-o:before {
648 | content: "\f0a0";
649 | }
650 | .fa-bullhorn:before {
651 | content: "\f0a1";
652 | }
653 | .fa-bell:before {
654 | content: "\f0f3";
655 | }
656 | .fa-certificate:before {
657 | content: "\f0a3";
658 | }
659 | .fa-hand-o-right:before {
660 | content: "\f0a4";
661 | }
662 | .fa-hand-o-left:before {
663 | content: "\f0a5";
664 | }
665 | .fa-hand-o-up:before {
666 | content: "\f0a6";
667 | }
668 | .fa-hand-o-down:before {
669 | content: "\f0a7";
670 | }
671 | .fa-arrow-circle-left:before {
672 | content: "\f0a8";
673 | }
674 | .fa-arrow-circle-right:before {
675 | content: "\f0a9";
676 | }
677 | .fa-arrow-circle-up:before {
678 | content: "\f0aa";
679 | }
680 | .fa-arrow-circle-down:before {
681 | content: "\f0ab";
682 | }
683 | .fa-globe:before {
684 | content: "\f0ac";
685 | }
686 | .fa-wrench:before {
687 | content: "\f0ad";
688 | }
689 | .fa-tasks:before {
690 | content: "\f0ae";
691 | }
692 | .fa-filter:before {
693 | content: "\f0b0";
694 | }
695 | .fa-briefcase:before {
696 | content: "\f0b1";
697 | }
698 | .fa-arrows-alt:before {
699 | content: "\f0b2";
700 | }
701 | .fa-group:before,
702 | .fa-users:before {
703 | content: "\f0c0";
704 | }
705 | .fa-chain:before,
706 | .fa-link:before {
707 | content: "\f0c1";
708 | }
709 | .fa-cloud:before {
710 | content: "\f0c2";
711 | }
712 | .fa-flask:before {
713 | content: "\f0c3";
714 | }
715 | .fa-cut:before,
716 | .fa-scissors:before {
717 | content: "\f0c4";
718 | }
719 | .fa-copy:before,
720 | .fa-files-o:before {
721 | content: "\f0c5";
722 | }
723 | .fa-paperclip:before {
724 | content: "\f0c6";
725 | }
726 | .fa-save:before,
727 | .fa-floppy-o:before {
728 | content: "\f0c7";
729 | }
730 | .fa-square:before {
731 | content: "\f0c8";
732 | }
733 | .fa-navicon:before,
734 | .fa-reorder:before,
735 | .fa-bars:before {
736 | content: "\f0c9";
737 | }
738 | .fa-list-ul:before {
739 | content: "\f0ca";
740 | }
741 | .fa-list-ol:before {
742 | content: "\f0cb";
743 | }
744 | .fa-strikethrough:before {
745 | content: "\f0cc";
746 | }
747 | .fa-underline:before {
748 | content: "\f0cd";
749 | }
750 | .fa-table:before {
751 | content: "\f0ce";
752 | }
753 | .fa-magic:before {
754 | content: "\f0d0";
755 | }
756 | .fa-truck:before {
757 | content: "\f0d1";
758 | }
759 | .fa-pinterest:before {
760 | content: "\f0d2";
761 | }
762 | .fa-pinterest-square:before {
763 | content: "\f0d3";
764 | }
765 | .fa-google-plus-square:before {
766 | content: "\f0d4";
767 | }
768 | .fa-google-plus:before {
769 | content: "\f0d5";
770 | }
771 | .fa-money:before {
772 | content: "\f0d6";
773 | }
774 | .fa-caret-down:before {
775 | content: "\f0d7";
776 | }
777 | .fa-caret-up:before {
778 | content: "\f0d8";
779 | }
780 | .fa-caret-left:before {
781 | content: "\f0d9";
782 | }
783 | .fa-caret-right:before {
784 | content: "\f0da";
785 | }
786 | .fa-columns:before {
787 | content: "\f0db";
788 | }
789 | .fa-unsorted:before,
790 | .fa-sort:before {
791 | content: "\f0dc";
792 | }
793 | .fa-sort-down:before,
794 | .fa-sort-desc:before {
795 | content: "\f0dd";
796 | }
797 | .fa-sort-up:before,
798 | .fa-sort-asc:before {
799 | content: "\f0de";
800 | }
801 | .fa-envelope:before {
802 | content: "\f0e0";
803 | }
804 | .fa-linkedin:before {
805 | content: "\f0e1";
806 | }
807 | .fa-rotate-left:before,
808 | .fa-undo:before {
809 | content: "\f0e2";
810 | }
811 | .fa-legal:before,
812 | .fa-gavel:before {
813 | content: "\f0e3";
814 | }
815 | .fa-dashboard:before,
816 | .fa-tachometer:before {
817 | content: "\f0e4";
818 | }
819 | .fa-comment-o:before {
820 | content: "\f0e5";
821 | }
822 | .fa-comments-o:before {
823 | content: "\f0e6";
824 | }
825 | .fa-flash:before,
826 | .fa-bolt:before {
827 | content: "\f0e7";
828 | }
829 | .fa-sitemap:before {
830 | content: "\f0e8";
831 | }
832 | .fa-umbrella:before {
833 | content: "\f0e9";
834 | }
835 | .fa-paste:before,
836 | .fa-clipboard:before {
837 | content: "\f0ea";
838 | }
839 | .fa-lightbulb-o:before {
840 | content: "\f0eb";
841 | }
842 | .fa-exchange:before {
843 | content: "\f0ec";
844 | }
845 | .fa-cloud-download:before {
846 | content: "\f0ed";
847 | }
848 | .fa-cloud-upload:before {
849 | content: "\f0ee";
850 | }
851 | .fa-user-md:before {
852 | content: "\f0f0";
853 | }
854 | .fa-stethoscope:before {
855 | content: "\f0f1";
856 | }
857 | .fa-suitcase:before {
858 | content: "\f0f2";
859 | }
860 | .fa-bell-o:before {
861 | content: "\f0a2";
862 | }
863 | .fa-coffee:before {
864 | content: "\f0f4";
865 | }
866 | .fa-cutlery:before {
867 | content: "\f0f5";
868 | }
869 | .fa-file-text-o:before {
870 | content: "\f0f6";
871 | }
872 | .fa-building-o:before {
873 | content: "\f0f7";
874 | }
875 | .fa-hospital-o:before {
876 | content: "\f0f8";
877 | }
878 | .fa-ambulance:before {
879 | content: "\f0f9";
880 | }
881 | .fa-medkit:before {
882 | content: "\f0fa";
883 | }
884 | .fa-fighter-jet:before {
885 | content: "\f0fb";
886 | }
887 | .fa-beer:before {
888 | content: "\f0fc";
889 | }
890 | .fa-h-square:before {
891 | content: "\f0fd";
892 | }
893 | .fa-plus-square:before {
894 | content: "\f0fe";
895 | }
896 | .fa-angle-double-left:before {
897 | content: "\f100";
898 | }
899 | .fa-angle-double-right:before {
900 | content: "\f101";
901 | }
902 | .fa-angle-double-up:before {
903 | content: "\f102";
904 | }
905 | .fa-angle-double-down:before {
906 | content: "\f103";
907 | }
908 | .fa-angle-left:before {
909 | content: "\f104";
910 | }
911 | .fa-angle-right:before {
912 | content: "\f105";
913 | }
914 | .fa-angle-up:before {
915 | content: "\f106";
916 | }
917 | .fa-angle-down:before {
918 | content: "\f107";
919 | }
920 | .fa-desktop:before {
921 | content: "\f108";
922 | }
923 | .fa-laptop:before {
924 | content: "\f109";
925 | }
926 | .fa-tablet:before {
927 | content: "\f10a";
928 | }
929 | .fa-mobile-phone:before,
930 | .fa-mobile:before {
931 | content: "\f10b";
932 | }
933 | .fa-circle-o:before {
934 | content: "\f10c";
935 | }
936 | .fa-quote-left:before {
937 | content: "\f10d";
938 | }
939 | .fa-quote-right:before {
940 | content: "\f10e";
941 | }
942 | .fa-spinner:before {
943 | content: "\f110";
944 | }
945 | .fa-circle:before {
946 | content: "\f111";
947 | }
948 | .fa-mail-reply:before,
949 | .fa-reply:before {
950 | content: "\f112";
951 | }
952 | .fa-github-alt:before {
953 | content: "\f113";
954 | }
955 | .fa-folder-o:before {
956 | content: "\f114";
957 | }
958 | .fa-folder-open-o:before {
959 | content: "\f115";
960 | }
961 | .fa-smile-o:before {
962 | content: "\f118";
963 | }
964 | .fa-frown-o:before {
965 | content: "\f119";
966 | }
967 | .fa-meh-o:before {
968 | content: "\f11a";
969 | }
970 | .fa-gamepad:before {
971 | content: "\f11b";
972 | }
973 | .fa-keyboard-o:before {
974 | content: "\f11c";
975 | }
976 | .fa-flag-o:before {
977 | content: "\f11d";
978 | }
979 | .fa-flag-checkered:before {
980 | content: "\f11e";
981 | }
982 | .fa-terminal:before {
983 | content: "\f120";
984 | }
985 | .fa-code:before {
986 | content: "\f121";
987 | }
988 | .fa-mail-reply-all:before,
989 | .fa-reply-all:before {
990 | content: "\f122";
991 | }
992 | .fa-star-half-empty:before,
993 | .fa-star-half-full:before,
994 | .fa-star-half-o:before {
995 | content: "\f123";
996 | }
997 | .fa-location-arrow:before {
998 | content: "\f124";
999 | }
1000 | .fa-crop:before {
1001 | content: "\f125";
1002 | }
1003 | .fa-code-fork:before {
1004 | content: "\f126";
1005 | }
1006 | .fa-unlink:before,
1007 | .fa-chain-broken:before {
1008 | content: "\f127";
1009 | }
1010 | .fa-question:before {
1011 | content: "\f128";
1012 | }
1013 | .fa-info:before {
1014 | content: "\f129";
1015 | }
1016 | .fa-exclamation:before {
1017 | content: "\f12a";
1018 | }
1019 | .fa-superscript:before {
1020 | content: "\f12b";
1021 | }
1022 | .fa-subscript:before {
1023 | content: "\f12c";
1024 | }
1025 | .fa-eraser:before {
1026 | content: "\f12d";
1027 | }
1028 | .fa-puzzle-piece:before {
1029 | content: "\f12e";
1030 | }
1031 | .fa-microphone:before {
1032 | content: "\f130";
1033 | }
1034 | .fa-microphone-slash:before {
1035 | content: "\f131";
1036 | }
1037 | .fa-shield:before {
1038 | content: "\f132";
1039 | }
1040 | .fa-calendar-o:before {
1041 | content: "\f133";
1042 | }
1043 | .fa-fire-extinguisher:before {
1044 | content: "\f134";
1045 | }
1046 | .fa-rocket:before {
1047 | content: "\f135";
1048 | }
1049 | .fa-maxcdn:before {
1050 | content: "\f136";
1051 | }
1052 | .fa-chevron-circle-left:before {
1053 | content: "\f137";
1054 | }
1055 | .fa-chevron-circle-right:before {
1056 | content: "\f138";
1057 | }
1058 | .fa-chevron-circle-up:before {
1059 | content: "\f139";
1060 | }
1061 | .fa-chevron-circle-down:before {
1062 | content: "\f13a";
1063 | }
1064 | .fa-html5:before {
1065 | content: "\f13b";
1066 | }
1067 | .fa-css3:before {
1068 | content: "\f13c";
1069 | }
1070 | .fa-anchor:before {
1071 | content: "\f13d";
1072 | }
1073 | .fa-unlock-alt:before {
1074 | content: "\f13e";
1075 | }
1076 | .fa-bullseye:before {
1077 | content: "\f140";
1078 | }
1079 | .fa-ellipsis-h:before {
1080 | content: "\f141";
1081 | }
1082 | .fa-ellipsis-v:before {
1083 | content: "\f142";
1084 | }
1085 | .fa-rss-square:before {
1086 | content: "\f143";
1087 | }
1088 | .fa-play-circle:before {
1089 | content: "\f144";
1090 | }
1091 | .fa-ticket:before {
1092 | content: "\f145";
1093 | }
1094 | .fa-minus-square:before {
1095 | content: "\f146";
1096 | }
1097 | .fa-minus-square-o:before {
1098 | content: "\f147";
1099 | }
1100 | .fa-level-up:before {
1101 | content: "\f148";
1102 | }
1103 | .fa-level-down:before {
1104 | content: "\f149";
1105 | }
1106 | .fa-check-square:before {
1107 | content: "\f14a";
1108 | }
1109 | .fa-pencil-square:before {
1110 | content: "\f14b";
1111 | }
1112 | .fa-external-link-square:before {
1113 | content: "\f14c";
1114 | }
1115 | .fa-share-square:before {
1116 | content: "\f14d";
1117 | }
1118 | .fa-compass:before {
1119 | content: "\f14e";
1120 | }
1121 | .fa-toggle-down:before,
1122 | .fa-caret-square-o-down:before {
1123 | content: "\f150";
1124 | }
1125 | .fa-toggle-up:before,
1126 | .fa-caret-square-o-up:before {
1127 | content: "\f151";
1128 | }
1129 | .fa-toggle-right:before,
1130 | .fa-caret-square-o-right:before {
1131 | content: "\f152";
1132 | }
1133 | .fa-euro:before,
1134 | .fa-eur:before {
1135 | content: "\f153";
1136 | }
1137 | .fa-gbp:before {
1138 | content: "\f154";
1139 | }
1140 | .fa-dollar:before,
1141 | .fa-usd:before {
1142 | content: "\f155";
1143 | }
1144 | .fa-rupee:before,
1145 | .fa-inr:before {
1146 | content: "\f156";
1147 | }
1148 | .fa-cny:before,
1149 | .fa-rmb:before,
1150 | .fa-yen:before,
1151 | .fa-jpy:before {
1152 | content: "\f157";
1153 | }
1154 | .fa-ruble:before,
1155 | .fa-rouble:before,
1156 | .fa-rub:before {
1157 | content: "\f158";
1158 | }
1159 | .fa-won:before,
1160 | .fa-krw:before {
1161 | content: "\f159";
1162 | }
1163 | .fa-bitcoin:before,
1164 | .fa-btc:before {
1165 | content: "\f15a";
1166 | }
1167 | .fa-file:before {
1168 | content: "\f15b";
1169 | }
1170 | .fa-file-text:before {
1171 | content: "\f15c";
1172 | }
1173 | .fa-sort-alpha-asc:before {
1174 | content: "\f15d";
1175 | }
1176 | .fa-sort-alpha-desc:before {
1177 | content: "\f15e";
1178 | }
1179 | .fa-sort-amount-asc:before {
1180 | content: "\f160";
1181 | }
1182 | .fa-sort-amount-desc:before {
1183 | content: "\f161";
1184 | }
1185 | .fa-sort-numeric-asc:before {
1186 | content: "\f162";
1187 | }
1188 | .fa-sort-numeric-desc:before {
1189 | content: "\f163";
1190 | }
1191 | .fa-thumbs-up:before {
1192 | content: "\f164";
1193 | }
1194 | .fa-thumbs-down:before {
1195 | content: "\f165";
1196 | }
1197 | .fa-youtube-square:before {
1198 | content: "\f166";
1199 | }
1200 | .fa-youtube:before {
1201 | content: "\f167";
1202 | }
1203 | .fa-xing:before {
1204 | content: "\f168";
1205 | }
1206 | .fa-xing-square:before {
1207 | content: "\f169";
1208 | }
1209 | .fa-youtube-play:before {
1210 | content: "\f16a";
1211 | }
1212 | .fa-dropbox:before {
1213 | content: "\f16b";
1214 | }
1215 | .fa-stack-overflow:before {
1216 | content: "\f16c";
1217 | }
1218 | .fa-instagram:before {
1219 | content: "\f16d";
1220 | }
1221 | .fa-flickr:before {
1222 | content: "\f16e";
1223 | }
1224 | .fa-adn:before {
1225 | content: "\f170";
1226 | }
1227 | .fa-bitbucket:before {
1228 | content: "\f171";
1229 | }
1230 | .fa-bitbucket-square:before {
1231 | content: "\f172";
1232 | }
1233 | .fa-tumblr:before {
1234 | content: "\f173";
1235 | }
1236 | .fa-tumblr-square:before {
1237 | content: "\f174";
1238 | }
1239 | .fa-long-arrow-down:before {
1240 | content: "\f175";
1241 | }
1242 | .fa-long-arrow-up:before {
1243 | content: "\f176";
1244 | }
1245 | .fa-long-arrow-left:before {
1246 | content: "\f177";
1247 | }
1248 | .fa-long-arrow-right:before {
1249 | content: "\f178";
1250 | }
1251 | .fa-apple:before {
1252 | content: "\f179";
1253 | }
1254 | .fa-windows:before {
1255 | content: "\f17a";
1256 | }
1257 | .fa-android:before {
1258 | content: "\f17b";
1259 | }
1260 | .fa-linux:before {
1261 | content: "\f17c";
1262 | }
1263 | .fa-dribbble:before {
1264 | content: "\f17d";
1265 | }
1266 | .fa-skype:before {
1267 | content: "\f17e";
1268 | }
1269 | .fa-foursquare:before {
1270 | content: "\f180";
1271 | }
1272 | .fa-trello:before {
1273 | content: "\f181";
1274 | }
1275 | .fa-female:before {
1276 | content: "\f182";
1277 | }
1278 | .fa-male:before {
1279 | content: "\f183";
1280 | }
1281 | .fa-gittip:before,
1282 | .fa-gratipay:before {
1283 | content: "\f184";
1284 | }
1285 | .fa-sun-o:before {
1286 | content: "\f185";
1287 | }
1288 | .fa-moon-o:before {
1289 | content: "\f186";
1290 | }
1291 | .fa-archive:before {
1292 | content: "\f187";
1293 | }
1294 | .fa-bug:before {
1295 | content: "\f188";
1296 | }
1297 | .fa-vk:before {
1298 | content: "\f189";
1299 | }
1300 | .fa-weibo:before {
1301 | content: "\f18a";
1302 | }
1303 | .fa-renren:before {
1304 | content: "\f18b";
1305 | }
1306 | .fa-pagelines:before {
1307 | content: "\f18c";
1308 | }
1309 | .fa-stack-exchange:before {
1310 | content: "\f18d";
1311 | }
1312 | .fa-arrow-circle-o-right:before {
1313 | content: "\f18e";
1314 | }
1315 | .fa-arrow-circle-o-left:before {
1316 | content: "\f190";
1317 | }
1318 | .fa-toggle-left:before,
1319 | .fa-caret-square-o-left:before {
1320 | content: "\f191";
1321 | }
1322 | .fa-dot-circle-o:before {
1323 | content: "\f192";
1324 | }
1325 | .fa-wheelchair:before {
1326 | content: "\f193";
1327 | }
1328 | .fa-vimeo-square:before {
1329 | content: "\f194";
1330 | }
1331 | .fa-turkish-lira:before,
1332 | .fa-try:before {
1333 | content: "\f195";
1334 | }
1335 | .fa-plus-square-o:before {
1336 | content: "\f196";
1337 | }
1338 | .fa-space-shuttle:before {
1339 | content: "\f197";
1340 | }
1341 | .fa-slack:before {
1342 | content: "\f198";
1343 | }
1344 | .fa-envelope-square:before {
1345 | content: "\f199";
1346 | }
1347 | .fa-wordpress:before {
1348 | content: "\f19a";
1349 | }
1350 | .fa-openid:before {
1351 | content: "\f19b";
1352 | }
1353 | .fa-institution:before,
1354 | .fa-bank:before,
1355 | .fa-university:before {
1356 | content: "\f19c";
1357 | }
1358 | .fa-mortar-board:before,
1359 | .fa-graduation-cap:before {
1360 | content: "\f19d";
1361 | }
1362 | .fa-yahoo:before {
1363 | content: "\f19e";
1364 | }
1365 | .fa-google:before {
1366 | content: "\f1a0";
1367 | }
1368 | .fa-reddit:before {
1369 | content: "\f1a1";
1370 | }
1371 | .fa-reddit-square:before {
1372 | content: "\f1a2";
1373 | }
1374 | .fa-stumbleupon-circle:before {
1375 | content: "\f1a3";
1376 | }
1377 | .fa-stumbleupon:before {
1378 | content: "\f1a4";
1379 | }
1380 | .fa-delicious:before {
1381 | content: "\f1a5";
1382 | }
1383 | .fa-digg:before {
1384 | content: "\f1a6";
1385 | }
1386 | .fa-pied-piper:before {
1387 | content: "\f1a7";
1388 | }
1389 | .fa-pied-piper-alt:before {
1390 | content: "\f1a8";
1391 | }
1392 | .fa-drupal:before {
1393 | content: "\f1a9";
1394 | }
1395 | .fa-joomla:before {
1396 | content: "\f1aa";
1397 | }
1398 | .fa-language:before {
1399 | content: "\f1ab";
1400 | }
1401 | .fa-fax:before {
1402 | content: "\f1ac";
1403 | }
1404 | .fa-building:before {
1405 | content: "\f1ad";
1406 | }
1407 | .fa-child:before {
1408 | content: "\f1ae";
1409 | }
1410 | .fa-paw:before {
1411 | content: "\f1b0";
1412 | }
1413 | .fa-spoon:before {
1414 | content: "\f1b1";
1415 | }
1416 | .fa-cube:before {
1417 | content: "\f1b2";
1418 | }
1419 | .fa-cubes:before {
1420 | content: "\f1b3";
1421 | }
1422 | .fa-behance:before {
1423 | content: "\f1b4";
1424 | }
1425 | .fa-behance-square:before {
1426 | content: "\f1b5";
1427 | }
1428 | .fa-steam:before {
1429 | content: "\f1b6";
1430 | }
1431 | .fa-steam-square:before {
1432 | content: "\f1b7";
1433 | }
1434 | .fa-recycle:before {
1435 | content: "\f1b8";
1436 | }
1437 | .fa-automobile:before,
1438 | .fa-car:before {
1439 | content: "\f1b9";
1440 | }
1441 | .fa-cab:before,
1442 | .fa-taxi:before {
1443 | content: "\f1ba";
1444 | }
1445 | .fa-tree:before {
1446 | content: "\f1bb";
1447 | }
1448 | .fa-spotify:before {
1449 | content: "\f1bc";
1450 | }
1451 | .fa-deviantart:before {
1452 | content: "\f1bd";
1453 | }
1454 | .fa-soundcloud:before {
1455 | content: "\f1be";
1456 | }
1457 | .fa-database:before {
1458 | content: "\f1c0";
1459 | }
1460 | .fa-file-pdf-o:before {
1461 | content: "\f1c1";
1462 | }
1463 | .fa-file-word-o:before {
1464 | content: "\f1c2";
1465 | }
1466 | .fa-file-excel-o:before {
1467 | content: "\f1c3";
1468 | }
1469 | .fa-file-powerpoint-o:before {
1470 | content: "\f1c4";
1471 | }
1472 | .fa-file-photo-o:before,
1473 | .fa-file-picture-o:before,
1474 | .fa-file-image-o:before {
1475 | content: "\f1c5";
1476 | }
1477 | .fa-file-zip-o:before,
1478 | .fa-file-archive-o:before {
1479 | content: "\f1c6";
1480 | }
1481 | .fa-file-sound-o:before,
1482 | .fa-file-audio-o:before {
1483 | content: "\f1c7";
1484 | }
1485 | .fa-file-movie-o:before,
1486 | .fa-file-video-o:before {
1487 | content: "\f1c8";
1488 | }
1489 | .fa-file-code-o:before {
1490 | content: "\f1c9";
1491 | }
1492 | .fa-vine:before {
1493 | content: "\f1ca";
1494 | }
1495 | .fa-codepen:before {
1496 | content: "\f1cb";
1497 | }
1498 | .fa-jsfiddle:before {
1499 | content: "\f1cc";
1500 | }
1501 | .fa-life-bouy:before,
1502 | .fa-life-buoy:before,
1503 | .fa-life-saver:before,
1504 | .fa-support:before,
1505 | .fa-life-ring:before {
1506 | content: "\f1cd";
1507 | }
1508 | .fa-circle-o-notch:before {
1509 | content: "\f1ce";
1510 | }
1511 | .fa-ra:before,
1512 | .fa-rebel:before {
1513 | content: "\f1d0";
1514 | }
1515 | .fa-ge:before,
1516 | .fa-empire:before {
1517 | content: "\f1d1";
1518 | }
1519 | .fa-git-square:before {
1520 | content: "\f1d2";
1521 | }
1522 | .fa-git:before {
1523 | content: "\f1d3";
1524 | }
1525 | .fa-y-combinator-square:before,
1526 | .fa-yc-square:before,
1527 | .fa-hacker-news:before {
1528 | content: "\f1d4";
1529 | }
1530 | .fa-tencent-weibo:before {
1531 | content: "\f1d5";
1532 | }
1533 | .fa-qq:before {
1534 | content: "\f1d6";
1535 | }
1536 | .fa-wechat:before,
1537 | .fa-weixin:before {
1538 | content: "\f1d7";
1539 | }
1540 | .fa-send:before,
1541 | .fa-paper-plane:before {
1542 | content: "\f1d8";
1543 | }
1544 | .fa-send-o:before,
1545 | .fa-paper-plane-o:before {
1546 | content: "\f1d9";
1547 | }
1548 | .fa-history:before {
1549 | content: "\f1da";
1550 | }
1551 | .fa-circle-thin:before {
1552 | content: "\f1db";
1553 | }
1554 | .fa-header:before {
1555 | content: "\f1dc";
1556 | }
1557 | .fa-paragraph:before {
1558 | content: "\f1dd";
1559 | }
1560 | .fa-sliders:before {
1561 | content: "\f1de";
1562 | }
1563 | .fa-share-alt:before {
1564 | content: "\f1e0";
1565 | }
1566 | .fa-share-alt-square:before {
1567 | content: "\f1e1";
1568 | }
1569 | .fa-bomb:before {
1570 | content: "\f1e2";
1571 | }
1572 | .fa-soccer-ball-o:before,
1573 | .fa-futbol-o:before {
1574 | content: "\f1e3";
1575 | }
1576 | .fa-tty:before {
1577 | content: "\f1e4";
1578 | }
1579 | .fa-binoculars:before {
1580 | content: "\f1e5";
1581 | }
1582 | .fa-plug:before {
1583 | content: "\f1e6";
1584 | }
1585 | .fa-slideshare:before {
1586 | content: "\f1e7";
1587 | }
1588 | .fa-twitch:before {
1589 | content: "\f1e8";
1590 | }
1591 | .fa-yelp:before {
1592 | content: "\f1e9";
1593 | }
1594 | .fa-newspaper-o:before {
1595 | content: "\f1ea";
1596 | }
1597 | .fa-wifi:before {
1598 | content: "\f1eb";
1599 | }
1600 | .fa-calculator:before {
1601 | content: "\f1ec";
1602 | }
1603 | .fa-paypal:before {
1604 | content: "\f1ed";
1605 | }
1606 | .fa-google-wallet:before {
1607 | content: "\f1ee";
1608 | }
1609 | .fa-cc-visa:before {
1610 | content: "\f1f0";
1611 | }
1612 | .fa-cc-mastercard:before {
1613 | content: "\f1f1";
1614 | }
1615 | .fa-cc-discover:before {
1616 | content: "\f1f2";
1617 | }
1618 | .fa-cc-amex:before {
1619 | content: "\f1f3";
1620 | }
1621 | .fa-cc-paypal:before {
1622 | content: "\f1f4";
1623 | }
1624 | .fa-cc-stripe:before {
1625 | content: "\f1f5";
1626 | }
1627 | .fa-bell-slash:before {
1628 | content: "\f1f6";
1629 | }
1630 | .fa-bell-slash-o:before {
1631 | content: "\f1f7";
1632 | }
1633 | .fa-trash:before {
1634 | content: "\f1f8";
1635 | }
1636 | .fa-copyright:before {
1637 | content: "\f1f9";
1638 | }
1639 | .fa-at:before {
1640 | content: "\f1fa";
1641 | }
1642 | .fa-eyedropper:before {
1643 | content: "\f1fb";
1644 | }
1645 | .fa-paint-brush:before {
1646 | content: "\f1fc";
1647 | }
1648 | .fa-birthday-cake:before {
1649 | content: "\f1fd";
1650 | }
1651 | .fa-area-chart:before {
1652 | content: "\f1fe";
1653 | }
1654 | .fa-pie-chart:before {
1655 | content: "\f200";
1656 | }
1657 | .fa-line-chart:before {
1658 | content: "\f201";
1659 | }
1660 | .fa-lastfm:before {
1661 | content: "\f202";
1662 | }
1663 | .fa-lastfm-square:before {
1664 | content: "\f203";
1665 | }
1666 | .fa-toggle-off:before {
1667 | content: "\f204";
1668 | }
1669 | .fa-toggle-on:before {
1670 | content: "\f205";
1671 | }
1672 | .fa-bicycle:before {
1673 | content: "\f206";
1674 | }
1675 | .fa-bus:before {
1676 | content: "\f207";
1677 | }
1678 | .fa-ioxhost:before {
1679 | content: "\f208";
1680 | }
1681 | .fa-angellist:before {
1682 | content: "\f209";
1683 | }
1684 | .fa-cc:before {
1685 | content: "\f20a";
1686 | }
1687 | .fa-shekel:before,
1688 | .fa-sheqel:before,
1689 | .fa-ils:before {
1690 | content: "\f20b";
1691 | }
1692 | .fa-meanpath:before {
1693 | content: "\f20c";
1694 | }
1695 | .fa-buysellads:before {
1696 | content: "\f20d";
1697 | }
1698 | .fa-connectdevelop:before {
1699 | content: "\f20e";
1700 | }
1701 | .fa-dashcube:before {
1702 | content: "\f210";
1703 | }
1704 | .fa-forumbee:before {
1705 | content: "\f211";
1706 | }
1707 | .fa-leanpub:before {
1708 | content: "\f212";
1709 | }
1710 | .fa-sellsy:before {
1711 | content: "\f213";
1712 | }
1713 | .fa-shirtsinbulk:before {
1714 | content: "\f214";
1715 | }
1716 | .fa-simplybuilt:before {
1717 | content: "\f215";
1718 | }
1719 | .fa-skyatlas:before {
1720 | content: "\f216";
1721 | }
1722 | .fa-cart-plus:before {
1723 | content: "\f217";
1724 | }
1725 | .fa-cart-arrow-down:before {
1726 | content: "\f218";
1727 | }
1728 | .fa-diamond:before {
1729 | content: "\f219";
1730 | }
1731 | .fa-ship:before {
1732 | content: "\f21a";
1733 | }
1734 | .fa-user-secret:before {
1735 | content: "\f21b";
1736 | }
1737 | .fa-motorcycle:before {
1738 | content: "\f21c";
1739 | }
1740 | .fa-street-view:before {
1741 | content: "\f21d";
1742 | }
1743 | .fa-heartbeat:before {
1744 | content: "\f21e";
1745 | }
1746 | .fa-venus:before {
1747 | content: "\f221";
1748 | }
1749 | .fa-mars:before {
1750 | content: "\f222";
1751 | }
1752 | .fa-mercury:before {
1753 | content: "\f223";
1754 | }
1755 | .fa-intersex:before,
1756 | .fa-transgender:before {
1757 | content: "\f224";
1758 | }
1759 | .fa-transgender-alt:before {
1760 | content: "\f225";
1761 | }
1762 | .fa-venus-double:before {
1763 | content: "\f226";
1764 | }
1765 | .fa-mars-double:before {
1766 | content: "\f227";
1767 | }
1768 | .fa-venus-mars:before {
1769 | content: "\f228";
1770 | }
1771 | .fa-mars-stroke:before {
1772 | content: "\f229";
1773 | }
1774 | .fa-mars-stroke-v:before {
1775 | content: "\f22a";
1776 | }
1777 | .fa-mars-stroke-h:before {
1778 | content: "\f22b";
1779 | }
1780 | .fa-neuter:before {
1781 | content: "\f22c";
1782 | }
1783 | .fa-genderless:before {
1784 | content: "\f22d";
1785 | }
1786 | .fa-facebook-official:before {
1787 | content: "\f230";
1788 | }
1789 | .fa-pinterest-p:before {
1790 | content: "\f231";
1791 | }
1792 | .fa-whatsapp:before {
1793 | content: "\f232";
1794 | }
1795 | .fa-server:before {
1796 | content: "\f233";
1797 | }
1798 | .fa-user-plus:before {
1799 | content: "\f234";
1800 | }
1801 | .fa-user-times:before {
1802 | content: "\f235";
1803 | }
1804 | .fa-hotel:before,
1805 | .fa-bed:before {
1806 | content: "\f236";
1807 | }
1808 | .fa-viacoin:before {
1809 | content: "\f237";
1810 | }
1811 | .fa-train:before {
1812 | content: "\f238";
1813 | }
1814 | .fa-subway:before {
1815 | content: "\f239";
1816 | }
1817 | .fa-medium:before {
1818 | content: "\f23a";
1819 | }
1820 | .fa-yc:before,
1821 | .fa-y-combinator:before {
1822 | content: "\f23b";
1823 | }
1824 | .fa-optin-monster:before {
1825 | content: "\f23c";
1826 | }
1827 | .fa-opencart:before {
1828 | content: "\f23d";
1829 | }
1830 | .fa-expeditedssl:before {
1831 | content: "\f23e";
1832 | }
1833 | .fa-battery-4:before,
1834 | .fa-battery-full:before {
1835 | content: "\f240";
1836 | }
1837 | .fa-battery-3:before,
1838 | .fa-battery-three-quarters:before {
1839 | content: "\f241";
1840 | }
1841 | .fa-battery-2:before,
1842 | .fa-battery-half:before {
1843 | content: "\f242";
1844 | }
1845 | .fa-battery-1:before,
1846 | .fa-battery-quarter:before {
1847 | content: "\f243";
1848 | }
1849 | .fa-battery-0:before,
1850 | .fa-battery-empty:before {
1851 | content: "\f244";
1852 | }
1853 | .fa-mouse-pointer:before {
1854 | content: "\f245";
1855 | }
1856 | .fa-i-cursor:before {
1857 | content: "\f246";
1858 | }
1859 | .fa-object-group:before {
1860 | content: "\f247";
1861 | }
1862 | .fa-object-ungroup:before {
1863 | content: "\f248";
1864 | }
1865 | .fa-sticky-note:before {
1866 | content: "\f249";
1867 | }
1868 | .fa-sticky-note-o:before {
1869 | content: "\f24a";
1870 | }
1871 | .fa-cc-jcb:before {
1872 | content: "\f24b";
1873 | }
1874 | .fa-cc-diners-club:before {
1875 | content: "\f24c";
1876 | }
1877 | .fa-clone:before {
1878 | content: "\f24d";
1879 | }
1880 | .fa-balance-scale:before {
1881 | content: "\f24e";
1882 | }
1883 | .fa-hourglass-o:before {
1884 | content: "\f250";
1885 | }
1886 | .fa-hourglass-1:before,
1887 | .fa-hourglass-start:before {
1888 | content: "\f251";
1889 | }
1890 | .fa-hourglass-2:before,
1891 | .fa-hourglass-half:before {
1892 | content: "\f252";
1893 | }
1894 | .fa-hourglass-3:before,
1895 | .fa-hourglass-end:before {
1896 | content: "\f253";
1897 | }
1898 | .fa-hourglass:before {
1899 | content: "\f254";
1900 | }
1901 | .fa-hand-grab-o:before,
1902 | .fa-hand-rock-o:before {
1903 | content: "\f255";
1904 | }
1905 | .fa-hand-stop-o:before,
1906 | .fa-hand-paper-o:before {
1907 | content: "\f256";
1908 | }
1909 | .fa-hand-scissors-o:before {
1910 | content: "\f257";
1911 | }
1912 | .fa-hand-lizard-o:before {
1913 | content: "\f258";
1914 | }
1915 | .fa-hand-spock-o:before {
1916 | content: "\f259";
1917 | }
1918 | .fa-hand-pointer-o:before {
1919 | content: "\f25a";
1920 | }
1921 | .fa-hand-peace-o:before {
1922 | content: "\f25b";
1923 | }
1924 | .fa-trademark:before {
1925 | content: "\f25c";
1926 | }
1927 | .fa-registered:before {
1928 | content: "\f25d";
1929 | }
1930 | .fa-creative-commons:before {
1931 | content: "\f25e";
1932 | }
1933 | .fa-gg:before {
1934 | content: "\f260";
1935 | }
1936 | .fa-gg-circle:before {
1937 | content: "\f261";
1938 | }
1939 | .fa-tripadvisor:before {
1940 | content: "\f262";
1941 | }
1942 | .fa-odnoklassniki:before {
1943 | content: "\f263";
1944 | }
1945 | .fa-odnoklassniki-square:before {
1946 | content: "\f264";
1947 | }
1948 | .fa-get-pocket:before {
1949 | content: "\f265";
1950 | }
1951 | .fa-wikipedia-w:before {
1952 | content: "\f266";
1953 | }
1954 | .fa-safari:before {
1955 | content: "\f267";
1956 | }
1957 | .fa-chrome:before {
1958 | content: "\f268";
1959 | }
1960 | .fa-firefox:before {
1961 | content: "\f269";
1962 | }
1963 | .fa-opera:before {
1964 | content: "\f26a";
1965 | }
1966 | .fa-internet-explorer:before {
1967 | content: "\f26b";
1968 | }
1969 | .fa-tv:before,
1970 | .fa-television:before {
1971 | content: "\f26c";
1972 | }
1973 | .fa-contao:before {
1974 | content: "\f26d";
1975 | }
1976 | .fa-500px:before {
1977 | content: "\f26e";
1978 | }
1979 | .fa-amazon:before {
1980 | content: "\f270";
1981 | }
1982 | .fa-calendar-plus-o:before {
1983 | content: "\f271";
1984 | }
1985 | .fa-calendar-minus-o:before {
1986 | content: "\f272";
1987 | }
1988 | .fa-calendar-times-o:before {
1989 | content: "\f273";
1990 | }
1991 | .fa-calendar-check-o:before {
1992 | content: "\f274";
1993 | }
1994 | .fa-industry:before {
1995 | content: "\f275";
1996 | }
1997 | .fa-map-pin:before {
1998 | content: "\f276";
1999 | }
2000 | .fa-map-signs:before {
2001 | content: "\f277";
2002 | }
2003 | .fa-map-o:before {
2004 | content: "\f278";
2005 | }
2006 | .fa-map:before {
2007 | content: "\f279";
2008 | }
2009 | .fa-commenting:before {
2010 | content: "\f27a";
2011 | }
2012 | .fa-commenting-o:before {
2013 | content: "\f27b";
2014 | }
2015 | .fa-houzz:before {
2016 | content: "\f27c";
2017 | }
2018 | .fa-vimeo:before {
2019 | content: "\f27d";
2020 | }
2021 | .fa-black-tie:before {
2022 | content: "\f27e";
2023 | }
2024 | .fa-fonticons:before {
2025 | content: "\f280";
2026 | }
2027 | .fa-reddit-alien:before {
2028 | content: "\f281";
2029 | }
2030 | .fa-edge:before {
2031 | content: "\f282";
2032 | }
2033 | .fa-credit-card-alt:before {
2034 | content: "\f283";
2035 | }
2036 | .fa-codiepie:before {
2037 | content: "\f284";
2038 | }
2039 | .fa-modx:before {
2040 | content: "\f285";
2041 | }
2042 | .fa-fort-awesome:before {
2043 | content: "\f286";
2044 | }
2045 | .fa-usb:before {
2046 | content: "\f287";
2047 | }
2048 | .fa-product-hunt:before {
2049 | content: "\f288";
2050 | }
2051 | .fa-mixcloud:before {
2052 | content: "\f289";
2053 | }
2054 | .fa-scribd:before {
2055 | content: "\f28a";
2056 | }
2057 | .fa-pause-circle:before {
2058 | content: "\f28b";
2059 | }
2060 | .fa-pause-circle-o:before {
2061 | content: "\f28c";
2062 | }
2063 | .fa-stop-circle:before {
2064 | content: "\f28d";
2065 | }
2066 | .fa-stop-circle-o:before {
2067 | content: "\f28e";
2068 | }
2069 | .fa-shopping-bag:before {
2070 | content: "\f290";
2071 | }
2072 | .fa-shopping-basket:before {
2073 | content: "\f291";
2074 | }
2075 | .fa-hashtag:before {
2076 | content: "\f292";
2077 | }
2078 | .fa-bluetooth:before {
2079 | content: "\f293";
2080 | }
2081 | .fa-bluetooth-b:before {
2082 | content: "\f294";
2083 | }
2084 | .fa-percent:before {
2085 | content: "\f295";
2086 | }
2087 |
--------------------------------------------------------------------------------
/src/assets/style/style.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LeuisKen/react-redux-intro/041d51aa8a9979d6beaa44ba4a6689690e741f75/src/assets/style/style.css
--------------------------------------------------------------------------------
/src/components/displayPannel/displayPannel.css:
--------------------------------------------------------------------------------
1 | .table {
2 | margin-top: 15px;
3 | }
4 |
--------------------------------------------------------------------------------
/src/components/displayPannel/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import CSSModules from 'react-css-modules'
3 | import { Row, Col, Table } from 'antd'
4 |
5 | import styles from './displayPannel.css'
6 |
7 | class DisplayPannel extends Component {
8 | constructor(props) {
9 | super(props)
10 | }
11 | render() {
12 | const { columns, dataSource } = this.props
13 | return (
14 |
15 |
16 | index} columns={columns} dataSource={dataSource}/>
17 |
18 |
19 | )
20 | }
21 | }
22 |
23 | export default CSSModules(DisplayPannel, styles)
24 |
--------------------------------------------------------------------------------
/src/components/header/header.css:
--------------------------------------------------------------------------------
1 | .header {
2 | padding: 20px;
3 | text-align: center;
4 | }
5 | .nav {
6 | padding-left: 30px;
7 | margin-bottom: 15px;
8 | font-size: 16px;
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/header/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import CSSModules from 'react-css-modules'
3 | import { Link } from 'react-router'
4 | import { Menu } from 'antd'
5 |
6 | import styles from './header.css'
7 |
8 | const MenuItem = Menu.Item
9 |
10 | class Header extends Component {
11 | constructor(props) {
12 | super(props)
13 | let path = window.location.hash.slice(2, -10)
14 | this.state = {
15 | current: `${path}/.$${path}`
16 | }
17 | }
18 | handleClick(e) {
19 | this.setState({
20 | current: e.key
21 | });
22 | }
23 | render() {
24 | return (
25 |
26 |
查看fackbook开源项目的demo
27 |
34 |
35 | )
36 | }
37 | }
38 |
39 | export default CSSModules(Header, styles)
40 |
--------------------------------------------------------------------------------
/src/components/index.js:
--------------------------------------------------------------------------------
1 | export Header from './header'
2 | export SearchForm from './searchForm'
3 | export DisplayPannel from './displayPannel'
4 |
--------------------------------------------------------------------------------
/src/components/searchForm/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import CSSModules from 'react-css-modules'
3 | import { Row, Col, Form, Select, Button } from 'antd'
4 |
5 | import styles from './searchForm.css'
6 |
7 | const createForm = Form.create
8 | const FormItem = Form.Item
9 | const Option = Select.Option
10 |
11 | class SearchForm extends Component {
12 | constructor(props) {
13 | super(props)
14 | this.state = {
15 | value: this.props.defaultValue
16 | }
17 | }
18 | handleSubmit(e) {
19 | e.preventDefault();
20 | this.props.form.validateFields((errors, values) => {
21 | if (!!errors) {
22 | return;
23 | }
24 | this.props.onSearch(values.key)
25 | });
26 | }
27 | handleReset(e) {
28 | e.preventDefault();
29 | this.props.form.resetFields();
30 | }
31 | handleSelect(value) {
32 | this.setState({
33 | value
34 | })
35 | }
36 | render() {
37 | const { title, defaultValue } = this.props
38 | const { getFieldProps } = this.props.form
39 | return (
40 |
41 |
42 | {title}
43 |
72 |
73 |
74 | )
75 | }
76 | }
77 |
78 | export default createForm()(CSSModules(SearchForm, styles))
79 |
--------------------------------------------------------------------------------
/src/components/searchForm/searchForm.css:
--------------------------------------------------------------------------------
1 | .title {
2 | text-align: center;
3 | padding-bottom: 20px;
4 | }
5 | .buttonContainer {
6 | text-align: center;
7 | }
8 | .submit {
9 | margin-right: 25px;
10 | }
11 |
--------------------------------------------------------------------------------
/src/constants/index.js:
--------------------------------------------------------------------------------
1 | export const SET_SEARCH_KEY = 'SET_SEARCH_KEY'
2 | export const RECEIVE_DATA = 'RECEIVE_DATA'
3 |
--------------------------------------------------------------------------------
/src/pages/base.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import { connect } from 'react-redux'
3 | import { bindActionCreators } from 'redux'
4 |
5 | import { Header } from 'SRC/components'
6 |
7 | class Base extends Component {
8 | render() {
9 | return (
10 |
11 |
12 |
13 | { this.props.children }
14 |
15 |
16 | )
17 | }
18 | }
19 |
20 | export default connect(null)(Base)
21 |
--------------------------------------------------------------------------------
/src/pages/forks.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import { connect } from 'react-redux'
3 | import { bindActionCreators } from 'redux'
4 |
5 | import * as Actions from 'SRC/actions'
6 | import { getColumns } from 'SRC/service'
7 | import { SearchForm, DisplayPannel } from 'SRC/components'
8 |
9 | class Forks extends Component {
10 | constructor(props) {
11 | super(props)
12 | }
13 | componentWillMount() {
14 | const { keySet } = this.props.main.toJS()
15 | const { actions } = this.props
16 | if(keySet["forks"]) {
17 | actions.fetchAll('forks')
18 | }
19 | }
20 | componentWillReceiveProps(nextProps) {
21 | const { actions } = this.props
22 | var oldSource = this.props.main
23 | var nextSource = nextProps.main
24 |
25 | if (oldSource.get('keySet').toJS()['forks'] !== nextSource.get('keySet').toJS()['forks']
26 | ) {
27 | actions.fetchAll('forks')
28 | }
29 | }
30 | render() {
31 | const { keySet, dataSet } = this.props.main.toJS()
32 | const { actions } = this.props
33 |
34 | let columns = getColumns('forks')
35 | let dataSource
36 |
37 | if(dataSet['forks']) {
38 | dataSource = dataSet['forks'].map((fork, index) => {
39 | return {
40 | owner: fork.owner ? fork.owner.login : 'Anonymous',
41 | repo_url: fork.html_url,
42 | create_time: fork.created_at
43 | }
44 | })
45 | }
46 | return (
47 |
48 |
52 |
53 |
54 | )
55 | }
56 | }
57 |
58 | function mapState(state) {
59 | return {
60 | main: state.main
61 | }
62 | }
63 |
64 | function mapDispatch(dispatch) {
65 | return {
66 | actions: bindActionCreators(Actions, dispatch)
67 | }
68 | }
69 |
70 | export default connect(mapState, mapDispatch)(Forks)
71 |
--------------------------------------------------------------------------------
/src/pages/home.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import { connect } from 'react-redux'
3 |
4 | class Home extends Component {
5 | render() {
6 | return (
7 | 欢迎使用
8 | )
9 | }
10 | }
11 |
12 | export default connect(null)(Home)
13 |
--------------------------------------------------------------------------------
/src/pages/index.js:
--------------------------------------------------------------------------------
1 | export Base from './base'
2 | export Home from './home'
3 | export Forks from './forks'
4 | export Pulls from './pulls'
5 |
--------------------------------------------------------------------------------
/src/pages/pulls.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 | import { connect } from 'react-redux'
3 | import { bindActionCreators } from 'redux'
4 |
5 | import * as Actions from 'SRC/actions'
6 | import { getColumns } from 'SRC/service'
7 | import { SearchForm, DisplayPannel } from 'SRC/components'
8 |
9 | class Pulls extends Component {
10 | componentWillMount() {
11 | const { keySet } = this.props.main.toJS()
12 | const { actions } = this.props
13 | if(keySet["pulls"]) {
14 | actions.fetchAll('pulls')
15 | }
16 | }
17 | componentWillReceiveProps(nextProps) {
18 | const { actions } = this.props
19 | var oldSource = this.props.main
20 | var nextSource = nextProps.main
21 |
22 | if (oldSource.get('keySet').toJS()['pulls'] !== nextSource.get('keySet').toJS()['pulls']
23 | ) {
24 | actions.fetchAll('pulls')
25 | }
26 | }
27 | render() {
28 | const { keySet, dataSet } = this.props.main.toJS()
29 | const { actions } = this.props
30 |
31 | let columns = getColumns('pulls')
32 | let dataSource
33 |
34 | if(dataSet['pulls']) {
35 | dataSource = dataSet['pulls'].map((pull, index) => {
36 | return {
37 | user: pull.user ? pull.user.login : 'Anonymous',
38 | pull_url: pull.html_url,
39 | body: pull.body
40 | }
41 | })
42 | }
43 | return (
44 |
45 |
49 |
50 |
51 | )
52 | }
53 | }
54 |
55 | function mapState(state) {
56 | return {
57 | main: state.main
58 | }
59 | }
60 |
61 | function mapDispatch(dispatch) {
62 | return {
63 | actions: bindActionCreators(Actions, dispatch)
64 | }
65 | }
66 |
67 | export default connect(mapState, mapDispatch)(Pulls)
68 |
--------------------------------------------------------------------------------
/src/reducers/index.js:
--------------------------------------------------------------------------------
1 | // import createHistory from 'history/lib/createHashHistory'
2 | import { routeReducer } from 'react-router-redux'
3 | import { combineReducers } from 'redux'
4 | import main from './main.reducer'
5 |
6 | const rootReducer = combineReducers(Object.assign({}, {
7 | main,
8 | routing: routeReducer
9 | }));
10 |
11 | export default rootReducer
12 |
--------------------------------------------------------------------------------
/src/reducers/main.reducer.js:
--------------------------------------------------------------------------------
1 | import Immutable from 'immutable'
2 |
3 | var initialState = Immutable.fromJS({
4 | keySet: {},
5 | dataSet: {}
6 | })
7 |
8 | export default function (state = initialState, action) {
9 | let map = {
10 | SET_SEARCH_KEY: function() {
11 | let keySet = state.get('keySet').toJS()
12 | keySet[action.category] = action.key
13 | return state.set('keySet', Immutable.fromJS(keySet))
14 | },
15 | RECEIVE_DATA: function() {
16 | let dataSet = state.get('dataSet').toJS()
17 | dataSet[action.use] = action.data
18 | return state.set('dataSet', Immutable.fromJS(dataSet))
19 | }
20 | }
21 |
22 | if (map[action.type]) {
23 | return map[action.type]()
24 | } else {
25 | return state
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/src/service/index.js:
--------------------------------------------------------------------------------
1 | export function getColumns(type) {
2 | let columns = {
3 | forks: [
4 | {
5 | title: '用户名',
6 | dataIndex: 'owner',
7 | key: 'owner'
8 | },
9 | {
10 | title: '仓库地址',
11 | dataIndex: 'repo_url',
12 | key: 'repo_url'
13 | },
14 | {
15 | title: '创建时间',
16 | dataIndex: 'create_time',
17 | key: 'create_time'
18 | }
19 | ],
20 | pulls: [
21 | {
22 | title: '用户名',
23 | dataIndex: 'user',
24 | key: 'user'
25 | },
26 | {
27 | title: 'Pull Request 地址',
28 | dataIndex: 'pull_url',
29 | key: 'pull_url'
30 | },
31 | {
32 | title: '描述',
33 | dataIndex: 'body',
34 | key: 'body'
35 | }
36 | ]
37 | }
38 | return columns[type]
39 | }
40 |
--------------------------------------------------------------------------------
/src/store/configureStore.dev.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware, compose } from 'redux'
2 | import thunk from 'redux-thunk'
3 | import { syncHistory } from 'react-router-redux'
4 | import { hashHistory } from 'react-router'
5 | import reducer from '../reducers'
6 |
7 | const reduxRouterMiddleware = syncHistory(hashHistory)
8 |
9 | const finalCreateStore = compose(
10 | applyMiddleware(thunk),
11 | applyMiddleware(reduxRouterMiddleware),
12 | window.devToolsExtension ? window.devToolsExtension() : f => f
13 | )(createStore)
14 |
15 |
16 | export default function configureStore(initialState) {
17 | const store = finalCreateStore(reducer, initialState)
18 |
19 | if (module.hot) {
20 | module.hot.accept('../reducers', () => {
21 | store.replaceReducer(require('../reducers').default)
22 | })
23 | }
24 |
25 | return store
26 | }
27 |
--------------------------------------------------------------------------------
/src/store/configureStore.prod.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware, compose } from 'redux'
2 | import thunk from 'redux-thunk'
3 | import reducer from '../reducers'
4 | import { syncHistory } from 'react-router-redux'
5 | import { hashHistory } from 'react-router'
6 |
7 | const reduxRouterMiddleware = syncHistory(hashHistory)
8 |
9 | const finalCreateStore = compose(
10 | applyMiddleware(thunk),
11 | applyMiddleware(reduxRouterMiddleware)
12 | )(createStore)
13 |
14 |
15 | export default function configureStore(initialState) {
16 | return finalCreateStore(reducer, initialState)
17 | }
18 |
--------------------------------------------------------------------------------
/src/store/index.js:
--------------------------------------------------------------------------------
1 | import configureStoreProd from './configureStore.prod'
2 | import configureStoreDev from './configureStore.dev'
3 |
4 | const configureStore =
5 | process.env.NODE_ENV === 'production' ? configureStoreProd : configureStoreDev
6 |
7 | export default configureStore
8 |
--------------------------------------------------------------------------------
/webpack.config.dev.js:
--------------------------------------------------------------------------------
1 | var path = require('path');
2 | var webpack = require('webpack');
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin');
4 |
5 | module.exports = {
6 | cache: true,
7 | debug: true,
8 | devtool: 'cheap-module-eval-source-map',
9 | entry: {
10 | 'app': [
11 | 'eventsource-polyfill', // necessary for hot reloading with IE
12 | 'webpack-hot-middleware/client',
13 | './index.js']
14 | },
15 | output: {
16 | path: path.join(__dirname, './dist/static'),
17 | filename: '[name].js',
18 | publicPath: '/static/'
19 | },
20 | plugins: [
21 | new webpack.HotModuleReplacementPlugin(),
22 | new webpack.NoErrorsPlugin()
23 | ],
24 | resolve: {
25 | extensions: ['', '.js', '.jsx', '.css', '.scss'],
26 | alias: {
27 | 'SRC': path.resolve(__dirname, './src')
28 | }
29 | },
30 | module: {
31 | loaders: [{
32 | test: /\.jsx?/,
33 | loaders: ['babel'],
34 | exclude: /node_modules/
35 | },
36 | {
37 | test: /\.json$/,
38 | exclude: /node_modules/,
39 | loader: 'json-loader',
40 | include: path.join(__dirname, 'src')
41 | },
42 | {
43 | test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
44 | loader: 'url?limit=10000&minetype=application/font-woff',
45 | include: path.join(__dirname, 'src')
46 | },
47 | {
48 | test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
49 | loader: 'url?limit=10000&minetype=application/font-woff',
50 | include: path.join(__dirname, 'src')
51 | },
52 | {
53 | test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
54 | loader: 'url?limit=10000&minetype=application/octet-stream',
55 | include: path.join(__dirname, 'src')
56 | },
57 | {
58 | test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
59 | loader: 'file',
60 | include: path.join(__dirname, 'src')
61 | },
62 | {
63 | test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
64 | loader: 'url?limit=10000&minetype=image/svg+xml',
65 | include: path.join(__dirname, 'src')
66 | },
67 | {
68 | test: /.*\.(gif|png|jpe?g)$/i,
69 | loader: "url-loader?mimetype=image/png",
70 | include: path.join(__dirname, 'src')
71 | },
72 | {
73 | test: /\.css$/,
74 | loader: ExtractTextPlugin.extract('style-loader', 'css-loader'),
75 | include: path.join(__dirname, 'src/assets')
76 | // loader: 'style!css?sourceMap!autoprefixer-loader',
77 | },
78 | {
79 | test: /\.css$/,
80 | loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]'),
81 | include: path.join(__dirname, 'src/components')
82 | // loader: 'style!css?sourceMap!autoprefixer-loader',
83 | }
84 | ]
85 | },
86 | plugins: [
87 | new ExtractTextPlugin('[name].css', {
88 | disable: false,
89 | allChunks: true
90 | }),
91 | new webpack.DefinePlugin({
92 | 'process.env': {
93 | 'NODE_ENV': JSON.stringify('dev')
94 | }
95 | }),
96 | new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]),
97 | new webpack.optimize.OccurenceOrderPlugin(),
98 | new webpack.HotModuleReplacementPlugin(),
99 | new webpack.NoErrorsPlugin()
100 | ]
101 | };
102 |
--------------------------------------------------------------------------------
/webpack.config.prod.js:
--------------------------------------------------------------------------------
1 | var ExtractTextPlugin = require('extract-text-webpack-plugin');
2 | var HtmlWebpackPlugin = require('html-webpack-plugin');
3 | var path = require('path');
4 | var webpack = require('webpack');
5 |
6 | module.exports = {
7 | devtool: 'source-map',
8 | entry: {
9 | 'app': './index.js'
10 | },
11 | output: {
12 | path: path.resolve('./dist/static'),
13 | filename: '[name].[chunkhash].js',
14 | publicPath: '/static/'
15 | },
16 | resolve: {
17 | extensions: ['', '.js', '.jsx', '.css', '.scss'],
18 | alias: {
19 | 'SRC': __dirname + '/src'
20 | }
21 | },
22 | module: {
23 | "loaders": [
24 | {
25 | test: /\.jsx?/,
26 | exclude: /node_modules/,
27 | loader: 'babel'
28 | },
29 | {
30 | test: /\.json$/,
31 | exclude: /node_modules/,
32 | loader: 'json-loader',
33 | },
34 | {
35 | test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
36 | loader: 'url?limit=10000&minetype=application/font-woff',
37 | },
38 | {
39 | test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
40 | loader: 'url?limit=10000&minetype=application/font-woff',
41 | },
42 | {
43 | test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
44 | loader: 'url?limit=10000&minetype=application/octet-stream',
45 | },
46 | {
47 | test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
48 | loader: 'file',
49 | },
50 | {
51 | test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
52 | loader: 'url?limit=10000&minetype=image/svg+xml',
53 | },
54 | {
55 | test: /.*\.(gif|png|jpe?g)$/i,
56 | loader: "url-loader?mimetype=image/png"
57 | },
58 | {
59 | test: /\.scss$/,
60 | loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
61 | // loader: 'style!css?sourceMap!autoprefixer-loader',
62 | },
63 | {
64 | test: /\.css$/,
65 | loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]')
66 | // loader: 'style!css?sourceMap!autoprefixer-loader',
67 | },
68 | ]
69 | },
70 | plugins: [
71 | new ExtractTextPlugin('[name].[chunkhash].css', {
72 | disable: false,
73 | allChunks: true,
74 | }),
75 | new HtmlWebpackPlugin({
76 | template: path.resolve(__dirname, 'index.tmpl'),
77 | inject: true,
78 | hash: false,
79 | // 相对于`config.output.path`的路径
80 | filename: '../index.html',
81 | minify: false,
82 | favicon: false,
83 | }),
84 | new webpack.IgnorePlugin(/^\.\/locale$/, [/moment$/]),
85 |
86 | new webpack.DefinePlugin({
87 | 'process.env': {
88 | 'NODE_ENV': JSON.stringify('production')
89 | }
90 | }),
91 | new webpack.optimize.OccurenceOrderPlugin(),
92 |
93 | new webpack.optimize.UglifyJsPlugin({
94 | compress: {
95 | warnings: false,
96 | }
97 | })
98 |
99 | ]
100 | };
101 |
--------------------------------------------------------------------------------