jekyll-theme-alta-docs 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,443 @@
1
+
2
+ ### 1. Naming convention
3
+
4
+ Cases:
5
+
6
+ * PascalCase
7
+ * camelCase
8
+ * snake_case
9
+ * SCREAMING_SNAKE_CASE or CONSTANT_CASE
10
+ * dash-case
11
+ * flatcase
12
+ * TRAIN-CASE
13
+ * Train-Case
14
+
15
+
16
+ Basic rules:
17
+
18
+ * Use **PascalCase** in models, classes or any kind of "blueprint" (when it's not an particular instance).
19
+ * Use **camelCase** in functions, methods and variables (when it is an instance). Use it also to name files containing helper functions (exports only functions or set of functions).
20
+ * Use **CONSTANT_CASE** with constants.
21
+
22
+ ```js
23
+ # PascalCase vs camelCase vs CONSTANT_CASE
24
+
25
+ const GOOGLE_API_KEY = 'xxxxxx'
26
+
27
+ class Product {
28
+ static resourceName = 'product'
29
+
30
+ getResourceName() {
31
+ return this.resourceName
32
+ }
33
+ }
34
+
35
+ const product = new Product()
36
+
37
+ ```
38
+
39
+ #### Plural vs Singular
40
+
41
+ Class, models, components and containers names should be Singular. Variables and constants should be singular, unless they contains a list. Also file names can be plural, i.e. `routes.js` because file defines a **list** of routes.
42
+
43
+
44
+ #### Verb vs noun
45
+
46
+ Functions and methods should be composed with (commanding) verbs: `getName()`, `convertText()`, `calculatePrice()`. Variables and class names should be nouns: `Product`, `products`.
47
+
48
+ #### Name decorators
49
+
50
+ * `_` use with private functions / methods (`_getName()`)
51
+
52
+
53
+ #### Prefixes & suffixes
54
+
55
+ * Components - `Resource.jsx`
56
+ * Routes - `ResourceRoute.jsx`, `NewResourceRoute.jsx`
57
+ * Containers - `ResourceContainer.jsx`
58
+ * Layouts - `MainLayout.jsx`
59
+
60
+
61
+ ### 2. REST naming
62
+
63
+ ```
64
+ [GET] /resources/ - index, list of resources
65
+ [GET] /resources/new - displays a form to create a new resource
66
+ [GET] /resources/:id - show a resource
67
+ [GET] /resources/:id/edit - edit form
68
+
69
+ [POST] /resources/ - create a new resource
70
+ [PUT] /resources/:id - update a resource
71
+ [DELETE] /resources/:id - delete a resource
72
+
73
+ # Related resources:
74
+ [GET] /resources/:id/comments - list of "comments" related to the "resource"
75
+ [GET] /resources/:id/comments/new - displays a form to create a new comment related with the "resource"
76
+ ( . . . )
77
+
78
+ ```
79
+
80
+
81
+ ### 3. Nest components and follow the context
82
+
83
+ 1. Group components with similar purposes, for example: UI components:
84
+
85
+ |-- components
86
+ |-- UI
87
+ |-- Button
88
+ |-- List
89
+ |-- Tooltip
90
+
91
+ 2. If components are strongly related to the specific component or they are used in the specific context, store them in particular component's folder:
92
+
93
+ |-- components
94
+ |-- Product
95
+ |-- components
96
+ | |-- ProductThumb
97
+ | | |-- ProductThumb.jsx
98
+ | | |-- ProductThumb.scss
99
+ | | |-- index.js
100
+ | |
101
+ | |-- ProductPrice
102
+ | |-- ProductPrice.jsx
103
+ | |-- ProductPrice.scss
104
+ | |-- index.js
105
+ |
106
+ |-- Product.jsx
107
+ |-- Product.scss
108
+ |-- index.js
109
+
110
+ ### 4. Components vs containers vs routes vs layouts
111
+
112
+ **Components - HTML components**<br>
113
+ Components are used to build HTML code. Components can be stateless or stateful.
114
+ Components cannot be directly connected with Redux.
115
+
116
+ **Containers - Logic**<br>
117
+ Containers implement the logic, connect with Redux, import components and provide data to components.
118
+ The amount of HTML code should be minimal in containers. Containers are not pages!
119
+
120
+ **Routes - pages**<br>
121
+ Routes are defined with `react-router` (or other library). Each route is a subpage of the website. The route's page should compose the whole subpage by setting up layout and building other view elements with containers and/or plain components.
122
+
123
+ **Layouts - the page frame**<br>
124
+ Layouts sets up a page fram. Layouts are used in routes.
125
+
126
+
127
+
128
+ ### 5. URL friendly routes
129
+
130
+ Routes are implemented in `src/routes/*` and they should follow REST naming convention:
131
+
132
+ ```
133
+ |-- routes
134
+ |-- products
135
+ | |-- new
136
+ | | |-- NewProductRoute.jsx
137
+ | |
138
+ | |-- :id
139
+ | | |-- edit
140
+ | | | |-- EditProductRoute.jsx
141
+ | | |
142
+ | | |-- ShowProductRoute.jsx
143
+ | |
144
+ | |-- IndexProductRoute.jsx
145
+ |
146
+ |-- routes.js
147
+ ```
148
+
149
+
150
+ ### 6. Small components
151
+
152
+ Keep components small. It's easier to test, reuse and keep code DRY.
153
+ Choose wisely between stateless and stateful components.
154
+ Containers should keep logic and components should focus on rendering the view.
155
+
156
+
157
+ ### 7. Configurability of components
158
+
159
+ Try to not hard-code any value in the components. Instead, give an option to pass in props and handle following cases:
160
+
161
+ 1. the prop is not passed > display default value (it can be hardcoded)
162
+ 2. the prop is passed > display the prop's value
163
+ 3. the prop's turn-off flag passed > do not display it at all
164
+
165
+ ```
166
+ const MyComponent = ({ title = null, titleOff = false }) => {
167
+ const defaultTitle = 'Hello World!'
168
+
169
+ return (
170
+ <div>
171
+ { !titleOff &&
172
+ <h1>{ title ? title : defaultTitle }</h1>
173
+ }
174
+ </div>
175
+ )
176
+ }
177
+
178
+
179
+ <MyComponent /> // Display default: "Hello World!"
180
+
181
+ <MyComponent title="Good morning!" /> // Display prop: "Good morning!"
182
+
183
+ <MyComponent titleOff="Good morning!" /> // Display nothing
184
+
185
+ ```
186
+
187
+
188
+
189
+ ### 8. Configurability of the project
190
+
191
+ Use `src/config/*` to store configuration in multiple files:
192
+
193
+ ```
194
+ |-- config
195
+ |-- app.js // Contains basic configuration
196
+ |-- aws.js // Contains AWS configuration
197
+ |-- resource.js // Contains "Resource" configuration
198
+ ```
199
+
200
+ Instead of setting constants in components, containers and other files, define them in `src/config/*.js` file and import to other files.
201
+
202
+
203
+
204
+ ### 9. Environment variables
205
+
206
+ In `src/config/*.js` use `process.env.NODE_ENV` to define the environment variables:
207
+
208
+ ```
209
+ const prod = {
210
+ MY_VAR = 'xxx'
211
+ }
212
+
213
+ const dev = {
214
+ MY_VAR = 'yyy'
215
+ }
216
+
217
+ const config = process.env.NODE_ENV === 'production'
218
+ ? prod
219
+ : dev
220
+
221
+ const GOOGLE_API_KEY = '1234567890'
222
+
223
+ export default {
224
+ ...config,
225
+ GOOGLE_API_KEY
226
+ }
227
+
228
+ ```
229
+
230
+
231
+ ### 10. Conditional Rendering
232
+
233
+ ```
234
+ // Wrong:
235
+ {
236
+ condition ?
237
+ <div>
238
+ // Do sth...
239
+ </div> :
240
+ null
241
+ }
242
+
243
+ // Good:
244
+ {condition &&
245
+ <div>
246
+ // Do sth...
247
+ </div>
248
+ }
249
+ ```
250
+
251
+ ### 9. Stylesheets
252
+
253
+ #### BEM
254
+
255
+ Follow BEM conventions:
256
+
257
+ * block - `.block`
258
+ * elements - `.block__element`
259
+ * modifier - `.block--modifier`, `.block__element--modifier`
260
+
261
+ Example:
262
+
263
+ ```sass
264
+
265
+ .product { }
266
+
267
+ .product .product__header { }
268
+
269
+ .product .product--dark { }
270
+
271
+ .product .product__header--dark { }
272
+
273
+ ```
274
+
275
+ #### SCSS
276
+
277
+ ```scss
278
+ // 1. Variables
279
+ $primary-color: #23ab56;
280
+
281
+ h1 {
282
+ color: $primary-color;
283
+ }
284
+
285
+
286
+ // 2. Nesting
287
+ .navbar {
288
+ .brand { }
289
+ }
290
+
291
+
292
+
293
+ // 3. Import
294
+ @import '_some_styles'
295
+
296
+
297
+
298
+
299
+ // 4. Mixins
300
+ @mixin shadow($alpha) {
301
+ -webkit-box-shadow: 0px 0px 10px -2px rgba(20,34,51,$alpha);
302
+ -moz-box-shadow: 0px 0px 10px -2px rgba(20,34,51,$alpha);
303
+ box-shadow: 0px 0px 10px -2px rgba(20,34,51,$alpha);
304
+ }
305
+
306
+ .box { @include shadow(0.2); }
307
+
308
+ // Optional argument
309
+ @mixin shadow($alpha: 0.5) { ... }
310
+
311
+ // Keyword arguments and @if
312
+ @mixin square($size, $radius: 0) {
313
+ width: $size;
314
+ height: $size;
315
+
316
+ @if $radius != 0 {
317
+ border-radius: $radius;
318
+ }
319
+ }
320
+
321
+ .avatar {
322
+ @include square(100px, $radius: 4px);
323
+ }
324
+
325
+
326
+
327
+ // 5. Extend/Inheritance
328
+ %message-shared {
329
+ border: 1px solid #ccc;
330
+ padding: 10px;
331
+ color: #333;
332
+ }
333
+
334
+ .message {
335
+ @extend %message-shared;
336
+ }
337
+
338
+ .success {
339
+ @extend %message-shared;
340
+ border-color: green;
341
+ }
342
+
343
+ .error {
344
+ @extend %message-shared;
345
+ border-color: red;
346
+ }
347
+
348
+ .warning {
349
+ @extend %message-shared;
350
+ border-color: yellow;
351
+ }
352
+
353
+ // 6. Operators: +, -, *, /, %
354
+ article {
355
+ width: 600px / 960px * 100%;
356
+ }
357
+
358
+
359
+
360
+ // 7. Functions
361
+ @function pow($base, $exponent) {
362
+ $result: 1;
363
+ @for $_ from 1 through $exponent {
364
+ $result: $result * $base;
365
+ }
366
+ @return $result;
367
+ }
368
+
369
+ .sidebar {
370
+ float: left;
371
+ margin-left: pow(4, 3) * 1px;
372
+ }
373
+
374
+ ```
375
+
376
+
377
+ #### Stylesheets in the project tree
378
+
379
+ Follow SASS 7-1 pattern:
380
+
381
+ ```
382
+ stylesheets/
383
+ |
384
+ |– base/
385
+ | |– _reset.scss # Reset/normalize
386
+ | |– _typography.scss # Typography rules
387
+ | ... # Etc…
388
+ |
389
+ |– components/
390
+ | |– _buttons.scss # Buttons
391
+ | |– _carousel.scss # Carousel
392
+ | |– _cover.scss # Cover
393
+ | |– _dropdown.scss # Dropdown
394
+ | ... # Etc…
395
+ |
396
+ |– layout/
397
+ | |– _navigation.scss # Navigation
398
+ | |– _grid.scss # Grid system
399
+ | |– _header.scss # Header
400
+ | |– _footer.scss # Footer
401
+ | |– _sidebar.scss # Sidebar
402
+ | |– _forms.scss # Forms
403
+ | ... # Etc…
404
+ |
405
+ |– pages/
406
+ | |– _home.scss # Home specific styles
407
+ | |– _contact.scss # Contact specific styles
408
+ | ... # Etc…
409
+ |
410
+ |– themes/
411
+ | |– _theme.scss # Default theme
412
+ | |– _admin.scss # Admin theme
413
+ | ... # Etc…
414
+ |
415
+ |– utils/
416
+ | |– _variables.scss # Sass Variables
417
+ | |– _functions.scss # Sass Functions
418
+ | |– _mixins.scss # Sass Mixins
419
+ | |– _helpers.scss # Class & placeholders helpers
420
+ |
421
+ |– vendors/
422
+ | |– _bootstrap.scss # Bootstrap
423
+ | |– _jquery-ui.scss # jQuery UI
424
+ | ... # Etc…
425
+ |
426
+ |
427
+ |– main.scss # Main Sass file
428
+ ```
429
+
430
+
431
+ #### Project's stylesheets vs component's stylesheets
432
+
433
+ In the `src/stylesheets`, build general project styles. Styles which are limited to a specific components, implement in the component's folder:
434
+
435
+ ```
436
+ |-- Product
437
+ |-- Product.jsx
438
+ |-- Product.scss
439
+ ```
440
+
441
+ ### 10. Linter
442
+
443
+ Use Linter to keep the same coding style with other team members.
@@ -0,0 +1,99 @@
1
+ ```
2
+
3
+ build // The build artifact
4
+ node_modules // Installed Node modules
5
+ public
6
+ |-- favicon
7
+ |-- index.html
8
+ |-- manifest.json
9
+ |-- robots.txt
10
+ src
11
+ |-- actions // Redux actions
12
+ | |-- app.js
13
+ | |-- products.js
14
+ |
15
+ |-- assets
16
+ | |-- images
17
+ |
18
+ |-- components // Components should not fetch
19
+ | |-- Products // data by itself (neither from Redux,
20
+ | | |-- ProductThumb // neither from API)
21
+ | | | |-- ProductThumb.jsx
22
+ | | | |-- ProductThumb.scss
23
+ | | | |-- index.js
24
+ | | |
25
+ | | |-- ProductTable
26
+ | | |-- ProductTable.jsx
27
+ | | |-- ProductTable.scss
28
+ | | |-- index.js
29
+ | |
30
+ | |-- UI // Reusable UI components grouped
31
+ | |-- Button // together in one folder
32
+ | |-- Tooltip
33
+ |
34
+ |--containers // Containers implement the logic
35
+ | |-- Products // and provide data to components
36
+ | |-- IndexProduct
37
+ | | |-- ProductIndexContainer.jsx
38
+ | | |-- index.js
39
+ | |
40
+ | |-- NewProduct
41
+ | |-- NewProductContainer.jsx
42
+ | |-- index.js
43
+ |
44
+ |-- config // Extract all configurable values
45
+ | |-- app.js // from components and containers
46
+ | |-- products.js // to config files.
47
+ |
48
+ |-- helpers // Reusable functions
49
+ |
50
+ |-- layouts // Layouts
51
+ | |-- MainLayout
52
+ | |-- MainLayout.jsx
53
+ | |-- MainLayout.scss
54
+ | |-- index.js
55
+ |
56
+ |-- locales // I18n
57
+ |
58
+ |-- models // Models provide a better
59
+ | |-- Product.js // representation of objects
60
+ |
61
+ |-- modules // Here you can import or build
62
+ | // modules that should be easily moved
63
+ | // to other projects
64
+ |
65
+ |-- reducers // Redux reducers
66
+ | |-- appReducer.js
67
+ | |-- productReducer.js
68
+ | |-- index.js
69
+ |
70
+ |-- routes // Routing
71
+ | |-- home
72
+ | | |-- HomeRoute.jsx
73
+ | |
74
+ | |-- products
75
+ | | |-- [id]
76
+ | | | |-- ProductRoute.jsx
77
+ | | |
78
+ | | |-- ProductsRoute.jsx
79
+ | |
80
+ | |-- routes.jsx
81
+ |
82
+ |-- services // Services
83
+ | |-- APIService.js
84
+ | |-- PayPalService.js
85
+ |
86
+ |-- App.jsx // Imports routes and connects with Redux
87
+ |-- index.jsx // Entrypoint of the app. Imports App.jsx
88
+ |-- init.js // Used in the app initialization stage
89
+ |-- serviceWorker
90
+ |-- store.js // Redux store
91
+
92
+ .eslintignore
93
+ .eslintrc.js
94
+ .eslintrc.json
95
+ .gitignore
96
+ package.json
97
+ README.md
98
+
99
+ ```