From 826aa106bac0162219e470335806461b14a6b0b6 Mon Sep 17 00:00:00 2001
From: Michael Rojas P
Date: Tue, 14 Jan 2020 18:31:15 -0600
Subject: [PATCH] Initial storybook configuration with introduction content
migrated to MDX
---
.gitignore | 2 +
.storybook/addons.js | 2 -
.storybook/config.js | 21 -
.storybook/main.js | 9 +
.storybook/preview.js | 80 ++
.storybook/yourTheme.js | 37 -
package.json | 59 +-
public/favicon.ico | Bin 0 -> 3870 bytes
public/index.html | 43 +
public/logo192.png | Bin 0 -> 5347 bytes
public/logo512.png | Bin 0 -> 9664 bytes
public/manifest.json | 25 +
public/robots.txt | 2 +
src/App.css | 38 +
src/App.js | 26 +
src/App.test.js | 9 +
src/components/audience/audience.stories.js | 10 -
src/components/audience/quantityOfPeople.js | 14 -
.../audience/requiredTechnicalSkills.js | 23 -
src/components/audience/requiredTools.js | 22 -
.../content/InDepth/conditionalRendering.js | 12 -
.../content/InDepth/handleEvents.js | 12 -
.../content/InDepth/inDepth.stories.js | 14 -
.../content/InDepth/listsAndKeys.js | 12 -
.../content/InDepth/renderingElements.js | 12 -
src/components/content/hooks/customHooks.js | 12 -
src/components/content/hooks/effectHooks.js | 12 -
src/components/content/hooks/hooks.stories.js | 14 -
src/components/content/hooks/rulesOfHooks.js | 12 -
src/components/content/hooks/stateHooks.js | 12 -
.../content/introductionES6/arrowFunctions.js | 12 -
.../content/introductionES6/destructuring.js | 12 -
.../introductionES6.stories.js | 18 -
.../content/introductionES6/letConst.js | 12 -
.../introductionES6/promisesAndAsyncAwait.js | 12 -
.../introductionES6/spreadRestOperator.js | 12 -
.../content/introductionES6/templateString.js | 12 -
.../reactIntroduction/classComponent.js | 12 -
.../reactIntroduction/functionalComponent.js | 12 -
.../content/reactIntroduction/jsx.js | 12 -
.../reactIntroduction.stories.js | 18 -
.../reactIntroduction/stateAndProps.js | 12 -
.../content/reactIntroduction/virtualDOM.js | 12 -
.../content/reactIntroduction/whatIs.js | 12 -
src/components/content/router/reactRouter.js | 12 -
.../content/router/router.stories.js | 7 -
.../content/settingEnvironment/codeSandbox.js | 12 -
.../settingEnvironment.stories.js | 10 -
.../settingEnvironment/vscodeConfig.js | 12 -
.../content/statePropsManagement/easyPeasy.js | 12 -
.../content/statePropsManagement/mobX.js | 12 -
.../content/statePropsManagement/redux.js | 12 -
.../statePropsManagement.stories.js | 12 -
src/components/content/styles/cssInJs.js | 12 -
src/components/content/styles/materialUI.js | 12 -
.../content/styles/styleComponents.js | 12 -
.../content/styles/styles.stories.js | 12 -
src/components/content/testing/jest.js | 12 -
.../content/testing/testing.stories.js | 12 -
.../content/testing/testingComponents.js | 12 -
.../content/testing/testingServices.js | 12 -
.../generalInformation/externalMaterial.js | 33 -
.../generalInformation.stories.js | 12 -
src/components/generalInformation/managers.js | 46 -
.../generalInformation/workshopTeam.js | 43 -
src/components/inDepth/UsersListComponent.jsx | 84 ++
src/components/index.stories.js | 21 -
.../reactIntroduction/AvatarComponent.jsx | 36 +
.../reactIntroduction/ClassComponent.jsx | 23 +
.../reactIntroduction/NestedComponent.jsx | 29 +
.../reactIntroduction/SimpleComponent.jsx | 12 +
.../reactIntroduction/SimpleFormWithState.jsx | 93 ++
src/components/welcome/description.js | 16 -
src/components/welcome/welcome.stories.js | 7 -
.../workshopDevelopment/sessionContent.js | 16 -
.../workshopDevelopment/sessionTime.js | 14 -
.../workshopDevelopment/teamDistribution.js | 29 -
.../workshopDevelopment.stories.js | 12 -
src/configuration/apiConfig.js | 2 +
src/index.css | 1223 +----------------
src/index.js | 6 +
src/logo.svg | 7 +
src/setupTests.js | 5 +
.../audience/quantityOfPeople.stories.mdx | 8 +
.../audience/technicalSkills.stories.mdx | 13 +
src/stories/audience/tools.stories.mdx | 13 +
...ionalRenderingAndEventHandling.stories.mdx | 86 ++
.../InDepth/lifecycleMethods.stories.mdx | 41 +
.../functionAndClassComponents.stories.mdx | 82 ++
.../stateAndProps.stories.mdx | 154 +++
.../reactIntroduction/whatIsReact.stories.mdx | 78 ++
src/stories/welcome/welcome.stories.mdx | 9 +
92 files changed, 1064 insertions(+), 2112 deletions(-)
delete mode 100644 .storybook/addons.js
delete mode 100644 .storybook/config.js
create mode 100644 .storybook/main.js
create mode 100644 .storybook/preview.js
delete mode 100644 .storybook/yourTheme.js
create mode 100644 public/favicon.ico
create mode 100644 public/index.html
create mode 100644 public/logo192.png
create mode 100644 public/logo512.png
create mode 100644 public/manifest.json
create mode 100644 public/robots.txt
create mode 100644 src/App.css
create mode 100644 src/App.js
create mode 100644 src/App.test.js
delete mode 100644 src/components/audience/audience.stories.js
delete mode 100644 src/components/audience/quantityOfPeople.js
delete mode 100644 src/components/audience/requiredTechnicalSkills.js
delete mode 100644 src/components/audience/requiredTools.js
delete mode 100644 src/components/content/InDepth/conditionalRendering.js
delete mode 100644 src/components/content/InDepth/handleEvents.js
delete mode 100644 src/components/content/InDepth/inDepth.stories.js
delete mode 100644 src/components/content/InDepth/listsAndKeys.js
delete mode 100644 src/components/content/InDepth/renderingElements.js
delete mode 100644 src/components/content/hooks/customHooks.js
delete mode 100644 src/components/content/hooks/effectHooks.js
delete mode 100644 src/components/content/hooks/hooks.stories.js
delete mode 100644 src/components/content/hooks/rulesOfHooks.js
delete mode 100644 src/components/content/hooks/stateHooks.js
delete mode 100644 src/components/content/introductionES6/arrowFunctions.js
delete mode 100644 src/components/content/introductionES6/destructuring.js
delete mode 100644 src/components/content/introductionES6/introductionES6.stories.js
delete mode 100644 src/components/content/introductionES6/letConst.js
delete mode 100644 src/components/content/introductionES6/promisesAndAsyncAwait.js
delete mode 100644 src/components/content/introductionES6/spreadRestOperator.js
delete mode 100644 src/components/content/introductionES6/templateString.js
delete mode 100644 src/components/content/reactIntroduction/classComponent.js
delete mode 100644 src/components/content/reactIntroduction/functionalComponent.js
delete mode 100644 src/components/content/reactIntroduction/jsx.js
delete mode 100644 src/components/content/reactIntroduction/reactIntroduction.stories.js
delete mode 100644 src/components/content/reactIntroduction/stateAndProps.js
delete mode 100644 src/components/content/reactIntroduction/virtualDOM.js
delete mode 100644 src/components/content/reactIntroduction/whatIs.js
delete mode 100644 src/components/content/router/reactRouter.js
delete mode 100644 src/components/content/router/router.stories.js
delete mode 100644 src/components/content/settingEnvironment/codeSandbox.js
delete mode 100644 src/components/content/settingEnvironment/settingEnvironment.stories.js
delete mode 100644 src/components/content/settingEnvironment/vscodeConfig.js
delete mode 100644 src/components/content/statePropsManagement/easyPeasy.js
delete mode 100644 src/components/content/statePropsManagement/mobX.js
delete mode 100644 src/components/content/statePropsManagement/redux.js
delete mode 100644 src/components/content/statePropsManagement/statePropsManagement.stories.js
delete mode 100644 src/components/content/styles/cssInJs.js
delete mode 100644 src/components/content/styles/materialUI.js
delete mode 100644 src/components/content/styles/styleComponents.js
delete mode 100644 src/components/content/styles/styles.stories.js
delete mode 100644 src/components/content/testing/jest.js
delete mode 100644 src/components/content/testing/testing.stories.js
delete mode 100644 src/components/content/testing/testingComponents.js
delete mode 100644 src/components/content/testing/testingServices.js
delete mode 100644 src/components/generalInformation/externalMaterial.js
delete mode 100644 src/components/generalInformation/generalInformation.stories.js
delete mode 100644 src/components/generalInformation/managers.js
delete mode 100644 src/components/generalInformation/workshopTeam.js
create mode 100644 src/components/inDepth/UsersListComponent.jsx
delete mode 100644 src/components/index.stories.js
create mode 100644 src/components/reactIntroduction/AvatarComponent.jsx
create mode 100644 src/components/reactIntroduction/ClassComponent.jsx
create mode 100644 src/components/reactIntroduction/NestedComponent.jsx
create mode 100644 src/components/reactIntroduction/SimpleComponent.jsx
create mode 100644 src/components/reactIntroduction/SimpleFormWithState.jsx
delete mode 100644 src/components/welcome/description.js
delete mode 100644 src/components/welcome/welcome.stories.js
delete mode 100644 src/components/workshopDevelopment/sessionContent.js
delete mode 100644 src/components/workshopDevelopment/sessionTime.js
delete mode 100644 src/components/workshopDevelopment/teamDistribution.js
delete mode 100644 src/components/workshopDevelopment/workshopDevelopment.stories.js
create mode 100644 src/configuration/apiConfig.js
create mode 100644 src/index.js
create mode 100644 src/logo.svg
create mode 100644 src/setupTests.js
create mode 100644 src/stories/audience/quantityOfPeople.stories.mdx
create mode 100644 src/stories/audience/technicalSkills.stories.mdx
create mode 100644 src/stories/audience/tools.stories.mdx
create mode 100644 src/stories/content/InDepth/conditionalRenderingAndEventHandling.stories.mdx
create mode 100644 src/stories/content/InDepth/lifecycleMethods.stories.mdx
create mode 100644 src/stories/content/reactIntroduction/functionAndClassComponents.stories.mdx
create mode 100644 src/stories/content/reactIntroduction/stateAndProps.stories.mdx
create mode 100644 src/stories/content/reactIntroduction/whatIsReact.stories.mdx
create mode 100644 src/stories/welcome/welcome.stories.mdx
diff --git a/.gitignore b/.gitignore
index 35ceed5..8fc70fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ node_modules
# others
/.vscode
package-lock.json
+storybook-static
+build
\ No newline at end of file
diff --git a/.storybook/addons.js b/.storybook/addons.js
deleted file mode 100644
index 6aed412..0000000
--- a/.storybook/addons.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import '@storybook/addon-actions/register';
-import '@storybook/addon-links/register';
diff --git a/.storybook/config.js b/.storybook/config.js
deleted file mode 100644
index b1ba23f..0000000
--- a/.storybook/config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { configure, addParameters } from '@storybook/react'
-// import '../src/index.css'
-
-// import { addParameters } from '@storybook/react'
-import { themes } from '@storybook/theming'
-import yourTheme from './yourTheme'
-
-// Option defaults.
-addParameters({
- options: {
- theme: yourTheme
- }
-})
-// automatically import all files ending in *.stories.js
-const req = require.context('../src', true, /\.stories\.js$/)
-
-function loadStories() {
- req.keys().forEach(filename => req(filename))
-}
-
-configure(loadStories, module)
diff --git a/.storybook/main.js b/.storybook/main.js
new file mode 100644
index 0000000..41145f8
--- /dev/null
+++ b/.storybook/main.js
@@ -0,0 +1,9 @@
+module.exports = {
+ stories: ['../src/**/*.stories.(js|mdx)'],
+ addons: [
+ '@storybook/preset-create-react-app',
+ '@storybook/addon-actions',
+ '@storybook/addon-links',
+ '@storybook/addon-docs'
+ ],
+};
diff --git a/.storybook/preview.js b/.storybook/preview.js
new file mode 100644
index 0000000..7dcc34e
--- /dev/null
+++ b/.storybook/preview.js
@@ -0,0 +1,80 @@
+import { addParameters } from '@storybook/react';
+
+// Credits to John Albin Wilkins
+// Taken from https://gist.github.com/JohnAlbin/83ef5282d07c6aa447ff39719429843e
+const storySort = options => (a, b) => {
+
+ // If the two stories have the same story kind, then use the default
+ // ordering, which is the order they are defined in the story file.
+ if (a[1].kind === b[1].kind) {
+ return 0;
+ }
+
+ const storyKindA = a[1].kind.split('/');
+ const storyKindB = b[1].kind.split('/');
+ let depth = 0;
+ let nameA, nameB, indexA, indexB, index;
+ let ordering = options.order || [];
+
+ while (true) {
+ nameA = storyKindA[depth] ? storyKindA[depth] : '';
+ nameB = storyKindB[depth] ? storyKindB[depth] : '';
+
+ if (nameA === nameB) {
+ // If a nested array is provided for a name, use it for ordering.
+ index = ordering.indexOf(nameA);
+ if (index !== -1 && Array.isArray(ordering[index + 1])) {
+ ordering = ordering[index + 1];
+ }
+
+ // We'll need to look at the next part of the name.
+ depth++;
+ continue;
+ } else {
+ // Look for the names in the given `ordering` array.
+ indexA = ordering.indexOf(nameA);
+ indexB = ordering.indexOf(nameB);
+
+ // If at least one of the names is found, sort by the `ordering` array.
+ if (indexA !== -1 || indexB !== -1) {
+ // If one of the names is not found in `ordering`, list it last.
+ if (indexA === -1) {
+ indexA = ordering.length;
+ }
+ if (indexB === -1) {
+ indexB = ordering.length;
+ }
+
+ return indexA - indexB;
+ }
+ }
+
+ // Otherwise, use alphabetical order.
+ return nameA.localeCompare(nameB);
+ }
+};
+
+/**
+ * Sorts each depth level according to the provided array order.
+ **/
+addParameters({
+ options: {
+ showRoots: true,
+ storySort: storySort({
+ order: [
+ 'Workshop',
+ ['Welcome'],
+ 'Definition',
+ ['About Audience',
+ ['Required Tools','Quantity Of People', 'Required Technical Skills']],
+ 'Contents',
+ [
+ 'React Introduction',
+ ['What is ReactJS', 'Functional and Class Components','State and Props', 'Conditional rendering and events handling'],
+ 'In Depth',
+ []
+ ],
+ ]
+ })
+ }
+});
diff --git a/.storybook/yourTheme.js b/.storybook/yourTheme.js
deleted file mode 100644
index 04b46b4..0000000
--- a/.storybook/yourTheme.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { create } from '@storybook/theming'
-
-export default create({
- base: 'dark',
-
- colorPrimary: 'hotpink',
- colorSecondary: '#0052cc',
-
- // UI
- appBg: 'white',
- appContentBg: '#f2f2f2',
- appBorderColor: '#003d99',
- appBorderRadius: 10,
-
- // Typography
- fontBase: '"Open Sans", sans-serif',
- fontCode: 'monospace',
-
- // Text colors
- textColor: 'black',
- textInverseColor: 'rgba(255,255,255,0.9)',
-
- // Toolbar default and active colors
- barTextColor: 'white',
- barSelectedColor: 'white',
- barBg: '#0047b3',
-
- // Form colors
- inputBg: 'white',
- inputBorder: 'black',
- inputTextColor: 'black',
- inputBorderRadius: 10,
-
- brandTitle: 'My custom storybook',
- brandUrl: 'https://example.com',
- brandImage: 'https://placehold.it/350x150'
-})
diff --git a/package.json b/package.json
index 3378b35..9673f93 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,49 @@
{
- "name": "react",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
+ "name": "reactjs-workshop",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@testing-library/jest-dom": "^4.2.4",
+ "@testing-library/react": "^9.3.2",
+ "@testing-library/user-event": "^7.1.2",
+ "react": "^16.12.0",
+ "react-dom": "^16.12.0",
+ "react-scripts": "3.3.0",
+ "styled-components": "^4.4.1"
+ },
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "storybook": "start-storybook -p 6006",
- "build-storybook": "build-storybook"
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject",
+ "storybook": "start-storybook -p 9009 -s public",
+ "build-storybook": "build-storybook -s public"
+ },
+ "eslintConfig": {
+ "extends": "react-app"
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
},
- "author": "",
- "license": "ISC",
- "dependencies": {},
"devDependencies": {
- "@babel/core": "^7.5.5",
- "@storybook/addon-actions": "^5.1.11",
- "@storybook/addon-links": "^5.1.11",
- "@storybook/addons": "^5.1.11",
- "@storybook/react": "^5.1.11",
- "babel-loader": "^8.0.6"
+ "@storybook/addon-actions": "^5.3.3",
+ "@storybook/addon-docs": "^5.3.3",
+ "@storybook/addon-links": "^5.3.3",
+ "@storybook/addon-storysource": "^5.3.3",
+ "@storybook/addons": "^5.3.3",
+ "@storybook/preset-create-react-app": "^1.5.0",
+ "@storybook/react": "^5.3.3",
+ "babel-loader": "^8.0.6",
+ "react-is": "^16.12.0",
+ "react-live": "^2.2.2"
}
}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a
GIT binary patch
literal 3870
zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b;
zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg=
z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E
zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS`
z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G
zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL
z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w
z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ
zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e
zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4
z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4
z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC
zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl
z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$
zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz
z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$
zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe
zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+
zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx
zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u
zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5&
z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3
zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@
zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy
z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7
zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P
z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@
zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU
z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN
z1ZY^;10j4M4#HYXP
zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9}
z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh
zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC
z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5
z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l
zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX
ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al
zV63XN@)j$FN#cCD;ek1R#l
zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0
zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w=
zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0
zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@
z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j
zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP
z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K
baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@
literal 0
HcmV?d00001
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..aa069f2
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ React App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/public/logo192.png b/public/logo192.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9
GIT binary patch
literal 5347
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
b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN
literal 0
HcmV?d00001
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..080d6c7
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..01b0f9a
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
diff --git a/src/App.css b/src/App.css
new file mode 100644
index 0000000..74b5e05
--- /dev/null
+++ b/src/App.css
@@ -0,0 +1,38 @@
+.App {
+ text-align: center;
+}
+
+.App-logo {
+ height: 40vmin;
+ pointer-events: none;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .App-logo {
+ animation: App-logo-spin infinite 20s linear;
+ }
+}
+
+.App-header {
+ background-color: #282c34;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ font-size: calc(10px + 2vmin);
+ color: white;
+}
+
+.App-link {
+ color: #61dafb;
+}
+
+@keyframes App-logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/src/App.js b/src/App.js
new file mode 100644
index 0000000..ce9cbd2
--- /dev/null
+++ b/src/App.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import logo from './logo.svg';
+import './App.css';
+
+function App() {
+ return (
+
+ );
+}
+
+export default App;
diff --git a/src/App.test.js b/src/App.test.js
new file mode 100644
index 0000000..4db7ebc
--- /dev/null
+++ b/src/App.test.js
@@ -0,0 +1,9 @@
+import React from 'react';
+import { render } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+ const { getByText } = render( );
+ const linkElement = getByText(/learn react/i);
+ expect(linkElement).toBeInTheDocument();
+});
diff --git a/src/components/audience/audience.stories.js b/src/components/audience/audience.stories.js
deleted file mode 100644
index a5d4760..0000000
--- a/src/components/audience/audience.stories.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import QuantityOfPeople from './quantityOfPeople'
-import RequiredTechnicalSkills from './requiredTechnicalSkills'
-
-storiesOf('DEFINITION|About Audience', module)
- .add('Quantity of People', () => )
- .add('Required Technical Skills', () => )
diff --git a/src/components/audience/quantityOfPeople.js b/src/components/audience/quantityOfPeople.js
deleted file mode 100644
index 1a541ab..0000000
--- a/src/components/audience/quantityOfPeople.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react'
-
-function QuantityOfPeople() {
- return (
-
-
Quantity Of People
-
- The workshop is designed to work in groups of 15-20 people per session.
-
-
- )
-}
-
-export default QuantityOfPeople
diff --git a/src/components/audience/requiredTechnicalSkills.js b/src/components/audience/requiredTechnicalSkills.js
deleted file mode 100644
index 17481d1..0000000
--- a/src/components/audience/requiredTechnicalSkills.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from 'react'
-
-function RequiredTechnicalSkills() {
- return (
-
-
About Required Technical Skills
-
- To guarantee the correct progress, is necessary to have knowledge is
- some technical skills. Please check the next list of the required
- technology skills.
-
-
Required Technical Skills
-
- Solid JavaScript
- ES6 basics
- HTML 5
- CSS3
-
-
- )
-}
-
-export default RequiredTechnicalSkills
diff --git a/src/components/audience/requiredTools.js b/src/components/audience/requiredTools.js
deleted file mode 100644
index 8922516..0000000
--- a/src/components/audience/requiredTools.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react'
-
-function RequiredTools() {
- return (
-
-
About Required Tools
-
- Here is a list of tools that is necessary to have installed in order to
- develop the course. (Is the responsibility of the participants to have
- installed all these tools, please feel free to contact any Workshop Team
- in slack, if you have doubts with the installation).
-
-
Required Tools
-
- Visual Studio Code
- Npm
-
-
- )
-}
-
-export default RequiredTools
diff --git a/src/components/content/InDepth/conditionalRendering.js b/src/components/content/InDepth/conditionalRendering.js
deleted file mode 100644
index 415612f..0000000
--- a/src/components/content/InDepth/conditionalRendering.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function ConditionalRendering() {
- return (
-
-
Conditional Rendering
-
In Depth
-
- )
-}
-
-export default ConditionalRendering
diff --git a/src/components/content/InDepth/handleEvents.js b/src/components/content/InDepth/handleEvents.js
deleted file mode 100644
index f3c74fb..0000000
--- a/src/components/content/InDepth/handleEvents.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function HandleEvents() {
- return (
-
-
Handle Events
-
In Depth
-
- )
-}
-
-export default HandleEvents
diff --git a/src/components/content/InDepth/inDepth.stories.js b/src/components/content/InDepth/inDepth.stories.js
deleted file mode 100644
index 0fb2a5f..0000000
--- a/src/components/content/InDepth/inDepth.stories.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import RenderingElements from './renderingElements'
-import HandleEvents from './handleEvents'
-import ConditionalRendering from './conditionalRendering'
-import ListsAndKeys from './listsAndKeys'
-
-storiesOf('CONTENTS|In Depth', module)
- .add('Rendering Elements', () => )
- .add('Handle Events', () => )
- .add('Conditional Rendering', () => )
- .add('Lists And Keys', () => )
diff --git a/src/components/content/InDepth/listsAndKeys.js b/src/components/content/InDepth/listsAndKeys.js
deleted file mode 100644
index 5bb24b5..0000000
--- a/src/components/content/InDepth/listsAndKeys.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function ListsAndKeys() {
- return (
-
-
Lists and Keys
-
In Depth
-
- )
-}
-
-export default ListsAndKeys
diff --git a/src/components/content/InDepth/renderingElements.js b/src/components/content/InDepth/renderingElements.js
deleted file mode 100644
index 0db6acd..0000000
--- a/src/components/content/InDepth/renderingElements.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function RenderingElements() {
- return (
-
-
Rendering Elements
-
In Depth
-
- )
-}
-
-export default RenderingElements
diff --git a/src/components/content/hooks/customHooks.js b/src/components/content/hooks/customHooks.js
deleted file mode 100644
index ea7b278..0000000
--- a/src/components/content/hooks/customHooks.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function CustomHooks() {
- return (
-
- )
-}
-
-export default CustomHooks
diff --git a/src/components/content/hooks/effectHooks.js b/src/components/content/hooks/effectHooks.js
deleted file mode 100644
index 567a85b..0000000
--- a/src/components/content/hooks/effectHooks.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function EffectHooks() {
- return (
-
- )
-}
-
-export default EffectHooks
diff --git a/src/components/content/hooks/hooks.stories.js b/src/components/content/hooks/hooks.stories.js
deleted file mode 100644
index 5a9ac25..0000000
--- a/src/components/content/hooks/hooks.stories.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import StateHooks from './stateHooks'
-import EffectHooks from './effectHooks'
-import RulesOfHooks from './rulesOfHooks'
-import CustomHooks from './customHooks'
-
-storiesOf('CONTENTS|Hooks', module)
- .add('State hooks', () => )
- .add('Effect hooks', () => )
- .add('Rule of hooks', () => )
- .add('Custom hooks', () => )
diff --git a/src/components/content/hooks/rulesOfHooks.js b/src/components/content/hooks/rulesOfHooks.js
deleted file mode 100644
index 7ea6038..0000000
--- a/src/components/content/hooks/rulesOfHooks.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function RulesOfHooks() {
- return (
-
- )
-}
-
-export default RulesOfHooks
diff --git a/src/components/content/hooks/stateHooks.js b/src/components/content/hooks/stateHooks.js
deleted file mode 100644
index 030b600..0000000
--- a/src/components/content/hooks/stateHooks.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function StateHooks() {
- return (
-
- )
-}
-
-export default StateHooks
diff --git a/src/components/content/introductionES6/arrowFunctions.js b/src/components/content/introductionES6/arrowFunctions.js
deleted file mode 100644
index 2ebfac9..0000000
--- a/src/components/content/introductionES6/arrowFunctions.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function ArrowFunctions() {
- return (
-
-
Arrow Functions
-
es6
-
- )
-}
-
-export default ArrowFunctions
diff --git a/src/components/content/introductionES6/destructuring.js b/src/components/content/introductionES6/destructuring.js
deleted file mode 100644
index 4deaf44..0000000
--- a/src/components/content/introductionES6/destructuring.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function Destructuring() {
- return (
-
- )
-}
-
-export default Destructuring
diff --git a/src/components/content/introductionES6/introductionES6.stories.js b/src/components/content/introductionES6/introductionES6.stories.js
deleted file mode 100644
index 741b8ac..0000000
--- a/src/components/content/introductionES6/introductionES6.stories.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import LetConst from './letConst'
-import ArrowFunctions from './arrowFunctions'
-import TemplateString from './templateString'
-import Destructuring from './destructuring'
-import SpreadRestOperator from './spreadRestOperator'
-import PromisesAndAsyncAwait from './promisesAndAsyncAwait'
-
-storiesOf('CONTENTS|Introduction to ES6', module)
- .add('Let / Const', () => )
- .add('Arrow Functions', () => )
- .add('Template String', () => )
- .add('Destructuring', () => )
- .add('Spread / Rest Operator', () => )
- .add('Promises And Async/Await', () => )
diff --git a/src/components/content/introductionES6/letConst.js b/src/components/content/introductionES6/letConst.js
deleted file mode 100644
index aaee272..0000000
--- a/src/components/content/introductionES6/letConst.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function letConst() {
- return (
-
-
Let / Const
-
es6 - hello world
-
- )
-}
-
-export default letConst
diff --git a/src/components/content/introductionES6/promisesAndAsyncAwait.js b/src/components/content/introductionES6/promisesAndAsyncAwait.js
deleted file mode 100644
index 1d3ef5a..0000000
--- a/src/components/content/introductionES6/promisesAndAsyncAwait.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function PromisesAndAsyncAwait() {
- return (
-
-
Promises And Async/Await
-
es6
-
- )
-}
-
-export default PromisesAndAsyncAwait
diff --git a/src/components/content/introductionES6/spreadRestOperator.js b/src/components/content/introductionES6/spreadRestOperator.js
deleted file mode 100644
index acd8108..0000000
--- a/src/components/content/introductionES6/spreadRestOperator.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function SpreadRestOperator() {
- return (
-
-
Spread | Rest Operator
-
es6
-
- )
-}
-
-export default SpreadRestOperator
diff --git a/src/components/content/introductionES6/templateString.js b/src/components/content/introductionES6/templateString.js
deleted file mode 100644
index 2a79857..0000000
--- a/src/components/content/introductionES6/templateString.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function TemplateString() {
- return (
-
-
Template String
-
es6
-
- )
-}
-
-export default TemplateString
diff --git a/src/components/content/reactIntroduction/classComponent.js b/src/components/content/reactIntroduction/classComponent.js
deleted file mode 100644
index 59d887a..0000000
--- a/src/components/content/reactIntroduction/classComponent.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function ClassComponent() {
- return (
-
-
Class Component
-
React Introduction
-
- )
-}
-
-export default ClassComponent
diff --git a/src/components/content/reactIntroduction/functionalComponent.js b/src/components/content/reactIntroduction/functionalComponent.js
deleted file mode 100644
index 292b80f..0000000
--- a/src/components/content/reactIntroduction/functionalComponent.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function FunctionalComponents() {
- return (
-
-
Functional Component
-
React Introduction
-
- )
-}
-
-export default FunctionalComponents
diff --git a/src/components/content/reactIntroduction/jsx.js b/src/components/content/reactIntroduction/jsx.js
deleted file mode 100644
index d434ed6..0000000
--- a/src/components/content/reactIntroduction/jsx.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function Jsx() {
- return (
-
-
Jsx
-
React Introduction
-
- )
-}
-
-export default Jsx
diff --git a/src/components/content/reactIntroduction/reactIntroduction.stories.js b/src/components/content/reactIntroduction/reactIntroduction.stories.js
deleted file mode 100644
index c66cf98..0000000
--- a/src/components/content/reactIntroduction/reactIntroduction.stories.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import WhatIs from './whatIs'
-import Jsx from './jsx'
-import VirtualDom from './virtualDOM'
-import StateAndProps from './stateAndProps'
-import FunctionalComponent from './functionalComponent'
-import ClassComponent from './classComponent'
-
-storiesOf('CONTENTS|React Introduction', module)
- .add('What is React?', () => )
- .add('Jsx', () => )
- .add('Virtual Dom', () => )
- .add('State And Props', () => )
- .add('Functional Component', () => )
- .add('Class Component', () => )
diff --git a/src/components/content/reactIntroduction/stateAndProps.js b/src/components/content/reactIntroduction/stateAndProps.js
deleted file mode 100644
index 0f388f8..0000000
--- a/src/components/content/reactIntroduction/stateAndProps.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function StateAndProps() {
- return (
-
-
State and Props
-
React Introduction
-
- )
-}
-
-export default StateAndProps
diff --git a/src/components/content/reactIntroduction/virtualDOM.js b/src/components/content/reactIntroduction/virtualDOM.js
deleted file mode 100644
index c701fee..0000000
--- a/src/components/content/reactIntroduction/virtualDOM.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function VirtualDOM() {
- return (
-
-
Virtual DOM
-
React Introduction
-
- )
-}
-
-export default VirtualDOM
diff --git a/src/components/content/reactIntroduction/whatIs.js b/src/components/content/reactIntroduction/whatIs.js
deleted file mode 100644
index db66616..0000000
--- a/src/components/content/reactIntroduction/whatIs.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function WhatIs() {
- return (
-
-
What Is React?
-
React Introduction
-
- )
-}
-
-export default WhatIs
diff --git a/src/components/content/router/reactRouter.js b/src/components/content/router/reactRouter.js
deleted file mode 100644
index 6c60c4b..0000000
--- a/src/components/content/router/reactRouter.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function ReactRouter() {
- return (
-
-
React Router
-
Router
-
- )
-}
-
-export default ReactRouter
diff --git a/src/components/content/router/router.stories.js b/src/components/content/router/router.stories.js
deleted file mode 100644
index 6ebb4a5..0000000
--- a/src/components/content/router/router.stories.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import ReactRouter from './reactRouter'
-
-storiesOf('CONTENTS|Router', module).add('React router', () => )
diff --git a/src/components/content/settingEnvironment/codeSandbox.js b/src/components/content/settingEnvironment/codeSandbox.js
deleted file mode 100644
index e42cc48..0000000
--- a/src/components/content/settingEnvironment/codeSandbox.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function CodeSandbox() {
- return (
-
-
Code Sandbox
-
setting config
-
- )
-}
-
-export default CodeSandbox
diff --git a/src/components/content/settingEnvironment/settingEnvironment.stories.js b/src/components/content/settingEnvironment/settingEnvironment.stories.js
deleted file mode 100644
index 0364a98..0000000
--- a/src/components/content/settingEnvironment/settingEnvironment.stories.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import VscodeConfig from './vscodeConfig'
-import CodeSandbox from './codeSandbox'
-
-storiesOf('CONTENTS|Setting Environment', module)
- .add('vscode Config', () => )
- .add('Code Sandbox', () => )
diff --git a/src/components/content/settingEnvironment/vscodeConfig.js b/src/components/content/settingEnvironment/vscodeConfig.js
deleted file mode 100644
index 0b7944d..0000000
--- a/src/components/content/settingEnvironment/vscodeConfig.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function VscodeConfig() {
- return (
-
-
VSCode Config
-
setting config
-
- )
-}
-
-export default VscodeConfig
diff --git a/src/components/content/statePropsManagement/easyPeasy.js b/src/components/content/statePropsManagement/easyPeasy.js
deleted file mode 100644
index 0b6e30b..0000000
--- a/src/components/content/statePropsManagement/easyPeasy.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function EasyPeasy() {
- return (
-
-
easy peasy
-
State/Store management
-
- )
-}
-
-export default EasyPeasy
diff --git a/src/components/content/statePropsManagement/mobX.js b/src/components/content/statePropsManagement/mobX.js
deleted file mode 100644
index c661ac8..0000000
--- a/src/components/content/statePropsManagement/mobX.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function MobX() {
- return (
-
-
mobX
-
State/Store management
-
- )
-}
-
-export default MobX
diff --git a/src/components/content/statePropsManagement/redux.js b/src/components/content/statePropsManagement/redux.js
deleted file mode 100644
index 23c6ac3..0000000
--- a/src/components/content/statePropsManagement/redux.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function Redux() {
- return (
-
-
Redux
-
State/Store management
-
- )
-}
-
-export default Redux
diff --git a/src/components/content/statePropsManagement/statePropsManagement.stories.js b/src/components/content/statePropsManagement/statePropsManagement.stories.js
deleted file mode 100644
index e78576c..0000000
--- a/src/components/content/statePropsManagement/statePropsManagement.stories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import Redux from './redux'
-import MobX from './mobX'
-import EasyPeasy from './easyPeasy'
-
-storiesOf('CONTENTS|State-Store Management', module)
- .add('Redux', () => )
- .add('MobX', () => )
- .add('Easy Peasy', () => )
diff --git a/src/components/content/styles/cssInJs.js b/src/components/content/styles/cssInJs.js
deleted file mode 100644
index 72c356d..0000000
--- a/src/components/content/styles/cssInJs.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function CssInJs() {
- return (
-
- )
-}
-
-export default CssInJs
diff --git a/src/components/content/styles/materialUI.js b/src/components/content/styles/materialUI.js
deleted file mode 100644
index 1359603..0000000
--- a/src/components/content/styles/materialUI.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function MaterialUI() {
- return (
-
- )
-}
-
-export default MaterialUI
diff --git a/src/components/content/styles/styleComponents.js b/src/components/content/styles/styleComponents.js
deleted file mode 100644
index 40beb65..0000000
--- a/src/components/content/styles/styleComponents.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function StyleComponents() {
- return (
-
-
Style Components
-
Styles
-
- )
-}
-
-export default StyleComponents
diff --git a/src/components/content/styles/styles.stories.js b/src/components/content/styles/styles.stories.js
deleted file mode 100644
index 0f6abc6..0000000
--- a/src/components/content/styles/styles.stories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import MaterialUI from './materialUI'
-import CssInJs from './cssInJs'
-import StyleComponents from './styleComponents'
-
-storiesOf('CONTENTS|Styles', module)
- .add('Material UI', () => )
- .add('Css in Js', () => )
- .add('Style Components', () => )
diff --git a/src/components/content/testing/jest.js b/src/components/content/testing/jest.js
deleted file mode 100644
index d47d559..0000000
--- a/src/components/content/testing/jest.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function Jest() {
- return (
-
- )
-}
-
-export default Jest
diff --git a/src/components/content/testing/testing.stories.js b/src/components/content/testing/testing.stories.js
deleted file mode 100644
index c5c085a..0000000
--- a/src/components/content/testing/testing.stories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import Jest from './jest'
-import TestingComponents from './testingComponents'
-import TestingServices from './testingServices'
-
-storiesOf('CONTENTS|Testing', module)
- .add('Jest', () => )
- .add('Testing Components', () => )
- .add('Testing Services', () => )
diff --git a/src/components/content/testing/testingComponents.js b/src/components/content/testing/testingComponents.js
deleted file mode 100644
index 244e8b4..0000000
--- a/src/components/content/testing/testingComponents.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function TestingComponents() {
- return (
-
-
testing components
-
Testing
-
- )
-}
-
-export default TestingComponents
diff --git a/src/components/content/testing/testingServices.js b/src/components/content/testing/testingServices.js
deleted file mode 100644
index 1481508..0000000
--- a/src/components/content/testing/testingServices.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-
-function TestingServices() {
- return (
-
-
testing services
-
Testing
-
- )
-}
-
-export default TestingServices
diff --git a/src/components/generalInformation/externalMaterial.js b/src/components/generalInformation/externalMaterial.js
deleted file mode 100644
index 35ff0ef..0000000
--- a/src/components/generalInformation/externalMaterial.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from 'react'
-
-function ExternalMaterial() {
- return (
-
-
External Material
-
-
- Description
- URL
-
-
- Trello board
- https://trello.com/b/uAGiX1dj/reactjs-workshop-gl
-
-
- React Workshop Notes
-
- https://docs.google.com/document/d/1CoXy14P3tc3qadeU-OkhZe-4brTJDQph8UcpszCIZqc/edit?usp=sharing
-
-
-
- React Bootcamp
-
- https://docs.google.com/document/d/17CWgXpjjdivExfvGIk8A4RJh9mUB0CaHN-PRuplSWTw/edit?usp=sharing
-
-
-
-
- )
-}
-
-export default ExternalMaterial
diff --git a/src/components/generalInformation/generalInformation.stories.js b/src/components/generalInformation/generalInformation.stories.js
deleted file mode 100644
index 4c69cbe..0000000
--- a/src/components/generalInformation/generalInformation.stories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import Managers from './managers'
-import WorkshopTeam from './workshopTeam'
-import ExternalMaterial from './externalMaterial'
-
-storiesOf('DEFINITION|Workshop Information', module)
- .add('Managers', () => )
- .add('Workshop Team', () => )
- .add('External Material', () => )
diff --git a/src/components/generalInformation/managers.js b/src/components/generalInformation/managers.js
deleted file mode 100644
index c4203df..0000000
--- a/src/components/generalInformation/managers.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import React from 'react'
-
-const styles = {
- table: {
- //backgroundColor: 'red',
- border: '1px solid #ddd',
- padding: '8px',
- '& td': {
- 'padding-top': '12px',
- 'padding-bottom': '12px',
- 'text-align': 'left',
- 'background-color': '#4CAF50',
- color: 'white'
- },
- '& tr:hover': {
- 'background-color': '#ddd'
- }
- }
-}
-
-function Managers() {
- return (
-
-
Managers
-
-
- Name
- Role
- GitHub User
-
-
- Arturo Campos
- Senior Web Developer
-
-
-
- Mariano Alvarez
- Web Practice Lead & Sr. Web Developer
-
-
-
-
- )
-}
-
-export default Managers
diff --git a/src/components/generalInformation/workshopTeam.js b/src/components/generalInformation/workshopTeam.js
deleted file mode 100644
index 88787e3..0000000
--- a/src/components/generalInformation/workshopTeam.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import React from 'react'
-
-function WorkshopTeam() {
- return (
-
-
Managers
-
-
- Name
- Role
- GitHub User
-
-
- Alexey Brenes
- Sr. Web Developer
-
-
-
- Daniel Reyes
- Web Practice Lead
-
-
-
- Michael Rojas P
- Senior Web Developer
-
-
-
- Raul Madrigal
- Technical Lead
-
-
-
- Roiner Camacho Esquivel
- Consultant Web Developer
-
-
-
-
- )
-}
-
-export default WorkshopTeam
diff --git a/src/components/inDepth/UsersListComponent.jsx b/src/components/inDepth/UsersListComponent.jsx
new file mode 100644
index 0000000..20dfb20
--- /dev/null
+++ b/src/components/inDepth/UsersListComponent.jsx
@@ -0,0 +1,84 @@
+import React, { Component, Fragment } from 'react';
+import styled from 'styled-components';
+
+import { BASE_URL } from '../../configuration/apiConfig';
+
+const List = styled.ul`
+ background-color: #666;
+ border-radius: 2px;
+ padding: 5px 18px;
+`;
+
+const Error = styled.p`
+ background-color: #e2e2e2;
+ border-radius: 2px;
+ padding: 1em;
+ color: #e44545;
+`;
+
+const Item = styled.li`
+ color: #e4e4e4;
+ list-style: none;
+ padding: 0.5em;
+ margin: 1em 0;
+ border-bottom: 0.2px solid #cac6c6;
+`;
+
+class UsersListComponent extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ users: null,
+ isLoading: false
+ };
+ }
+
+ loadUsers = async () => {
+ this.setState({ isLoading: true });
+ try {
+ const response = await fetch(`${BASE_URL}/peoples`);
+ if (response.status === 404) {
+ this.setState({
+ isLoading: false,
+ hasErrors: true
+ });
+ } else {
+ const users = await response.json();
+ this.setState({ users, isLoading: false, hasErrors: false });
+ }
+ } catch (error) {
+ console.error(error)
+ }
+ };
+
+ render() {
+ let content;
+
+ if (this.state.users) {
+ content = (
+
+ {this.state.users.map(user => (
+ - {`${user.name} ${user.lastName}`}
+ ))}
+
+ );
+ } else {
+ content = (
+
+ No users to be displayed! Please click the button to refresh!
+ Refresh users!
+
+ );
+ }
+
+ return (
+
+
Users List
+ {this.state.isLoading ? Loading data! : content}
+ {this.state.hasErrors && (Upps, something went wrong while loading the data! )}
+
+ );
+ }
+}
+
+export default UsersListComponent;
diff --git a/src/components/index.stories.js b/src/components/index.stories.js
deleted file mode 100644
index 75de70c..0000000
--- a/src/components/index.stories.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react'
-
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-import { linkTo } from '@storybook/addon-links'
-
-import { Button, Welcome } from '@storybook/react/demo'
-
-// storiesOf('Welcome', module).add('to Storybook', () => (
-//
-// ))
-
-// storiesOf('Button', module)
-// .add('with text', () => Hello Button )
-// .add('with some emoji', () => (
-//
-//
-// 😀 😎 👍 💯
-//
-//
-// ));
diff --git a/src/components/reactIntroduction/AvatarComponent.jsx b/src/components/reactIntroduction/AvatarComponent.jsx
new file mode 100644
index 0000000..a008ba0
--- /dev/null
+++ b/src/components/reactIntroduction/AvatarComponent.jsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import styled from 'styled-components';
+
+const AvatarWrapper = styled.div`
+ border: 2px solid #aaa;
+ border-radius: 5px;
+ color: #666;
+ padding: 0.5em;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ height: 192px;
+ width: 192px;
+`;
+
+const Image = styled.img`
+ height: 160px;
+ width: 160px;
+`;
+
+const HorizontalRule = styled.hr`
+ width: 100%;
+ margin: 0.2em 0;
+`;
+
+function AvatarComponent(props) {
+ return (
+
+
+
+ {props.fullName}
+
+ );
+}
+
+export default AvatarComponent;
\ No newline at end of file
diff --git a/src/components/reactIntroduction/ClassComponent.jsx b/src/components/reactIntroduction/ClassComponent.jsx
new file mode 100644
index 0000000..adfa1ba
--- /dev/null
+++ b/src/components/reactIntroduction/ClassComponent.jsx
@@ -0,0 +1,23 @@
+import React, { Component } from 'react';
+import styled from 'styled-components';
+
+const Container = styled.div`
+ border: 1px solid #333;
+ background-color: #666;
+ padding: 2em;
+`;
+
+const Title = styled.h1`
+ color: #1EA7FD;
+ font-weight: bold;
+`;
+
+export default class ClassComponent extends Component {
+ render() {
+ return (
+
+ I'm a Class Component
+
+ );
+ }
+}
diff --git a/src/components/reactIntroduction/NestedComponent.jsx b/src/components/reactIntroduction/NestedComponent.jsx
new file mode 100644
index 0000000..93c8232
--- /dev/null
+++ b/src/components/reactIntroduction/NestedComponent.jsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import styled from 'styled-components';
+
+const Container = styled.div`
+ border: 1px solid #333;
+ border-radius: 5px;
+ background-color: #249;
+ color: white;
+ padding: 2em;
+`;
+
+const ChildrenWrapper = styled.div`
+ border: 1px solid white;
+ border-radius: 5px;
+ background-color: white;
+ color: black;
+ padding: 1em;
+`;
+
+function NestedComponent(props) {
+ return (
+
+ I'm the parent component!
+ {props.children}
+
+ );
+}
+
+export default NestedComponent;
diff --git a/src/components/reactIntroduction/SimpleComponent.jsx b/src/components/reactIntroduction/SimpleComponent.jsx
new file mode 100644
index 0000000..e6560c0
--- /dev/null
+++ b/src/components/reactIntroduction/SimpleComponent.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+function SimpleComponent(props) {
+ return (
+
+
Hello there!
+
I'm a simple ReactJS Component that renders a title with a paragraph.
+
+ );
+}
+
+export default SimpleComponent;
\ No newline at end of file
diff --git a/src/components/reactIntroduction/SimpleFormWithState.jsx b/src/components/reactIntroduction/SimpleFormWithState.jsx
new file mode 100644
index 0000000..9846881
--- /dev/null
+++ b/src/components/reactIntroduction/SimpleFormWithState.jsx
@@ -0,0 +1,93 @@
+import React, { Component } from 'react';
+import styled, { css } from 'styled-components';
+import { BASE_URL } from '../../configuration/apiConfig';
+
+const Form = styled.form`
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ width: 300px;
+`;
+
+const fontStyles = css`
+ font-size: 16px;
+ font-family: Helvetica, sans-serif;
+`;
+
+const Label = styled.label`
+ ${fontStyles}
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ color: #1EA7FD;
+ margin: 0.5em 0;
+`;
+
+const Input = styled.input`
+ ${fontStyles}
+ margin-left: 10px;
+ color: #333;
+ padding: 0.2em;
+ border-radius: 2px;
+ border: 0.5px solid #999;
+ box-shadow: 2px 2px 4px #93989a;
+`;
+
+const Button = styled.button`
+ ${fontStyles}
+ background-color: #333;
+ color: white;
+ padding: 0.5em;
+ border-radius: 5px;
+`;
+
+export default class SimpleFormWithState extends Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ name: '',
+ lastName: '',
+ age: ''
+ };
+ }
+
+ handleChange = ({ target }) => {
+ this.setState({[target.name]: target.value});
+ }
+
+ submitForm = async (event) => {
+ event.preventDefault();
+ console.log('Current State: ',this.state)
+ const response = await fetch(`${BASE_URL}/people`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(this.state)
+ });
+
+ const result = await response.json();
+ console.log('API Response: ', result);
+ };
+
+ render() {
+ return (
+
+ );
+ }
+}
diff --git a/src/components/welcome/description.js b/src/components/welcome/description.js
deleted file mode 100644
index defecd3..0000000
--- a/src/components/welcome/description.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react'
-
-function Description() {
- return (
-
-
Welcome
-
- This workshop is for Gorilla employees with interest to learn and
- practice with ReactJS. The main idea is to improve technical skills and
- has the opportunity to implement this new knowledge in a real project.
-
-
- )
-}
-
-export default Description
diff --git a/src/components/welcome/welcome.stories.js b/src/components/welcome/welcome.stories.js
deleted file mode 100644
index 95bd877..0000000
--- a/src/components/welcome/welcome.stories.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import Description from './description'
-
-storiesOf('WORKSHOP|Welcome', module).add('Description', () => )
diff --git a/src/components/workshopDevelopment/sessionContent.js b/src/components/workshopDevelopment/sessionContent.js
deleted file mode 100644
index d0c0dc2..0000000
--- a/src/components/workshopDevelopment/sessionContent.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react'
-
-function SessionContent() {
- return (
-
-
Session Content
-
- Each session is going to have a specific content according to the
- defined Topics for the workshop, so the idea of the team is to cover
- that, in order to progress according to the schedule.
-
-
- )
-}
-
-export default SessionContent
diff --git a/src/components/workshopDevelopment/sessionTime.js b/src/components/workshopDevelopment/sessionTime.js
deleted file mode 100644
index 8fb131f..0000000
--- a/src/components/workshopDevelopment/sessionTime.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react'
-
-function SessionTime() {
- return (
-
-
Session Time
-
- The workshop is going to be distributed in ## sessions of 2 (two) hours.
-
-
- )
-}
-
-export default SessionTime
diff --git a/src/components/workshopDevelopment/teamDistribution.js b/src/components/workshopDevelopment/teamDistribution.js
deleted file mode 100644
index 6d8000f..0000000
--- a/src/components/workshopDevelopment/teamDistribution.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react'
-
-function TeamDistribution() {
- return (
-
-
Workshop Team Distribution In Sessions
-
- The “Workshop Team” will define one speaker and two assistants in place
- for each of these sessions.
-
-
-
- Role
- Quantity per session
-
-
- Speaker
- 1
-
-
- Assistants
- 2 in place
-
-
-
- )
-}
-
-export default TeamDistribution
diff --git a/src/components/workshopDevelopment/workshopDevelopment.stories.js b/src/components/workshopDevelopment/workshopDevelopment.stories.js
deleted file mode 100644
index e8c3a73..0000000
--- a/src/components/workshopDevelopment/workshopDevelopment.stories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { storiesOf } from '@storybook/react'
-import { action } from '@storybook/addon-actions'
-
-import SessionContent from './sessionContent'
-import SessionTime from './sessionTime'
-import TeamDistribution from './teamDistribution'
-
-storiesOf('DEFINITION|Workshop Development', module)
- .add('Session Content', () => )
- .add('Session Time', () => )
- .add('Team Distribution', () => )
diff --git a/src/configuration/apiConfig.js b/src/configuration/apiConfig.js
new file mode 100644
index 0000000..b1fd0b8
--- /dev/null
+++ b/src/configuration/apiConfig.js
@@ -0,0 +1,2 @@
+
+export const BASE_URL = 'https://5e1de73ef846e500144d61b1.mockapi.io/api/v1';
diff --git a/src/index.css b/src/index.css
index dbb0860..ec2585e 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,1224 +1,13 @@
-/* Reset.less
- * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc).
- * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
-@import url('https://fonts.googleapis.com/css?family=Nunito+Sans:400,400i,800');
-
-html,
-body {
- margin: 0;
- padding: 0;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-cite,
-code,
-del,
-dfn,
-em,
-img,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-dd,
-dl,
-dt,
-li,
-ol,
-ul,
-fieldset,
-form,
-label,
-legend,
-button,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td {
- margin: 0;
- padding: 0;
- border: 0;
- font-weight: normal;
- font-style: normal;
- font-size: 100%;
- line-height: 1;
- font-family: inherit;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-ol,
-ul {
- list-style: none;
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-a:focus {
- outline: thin dotted;
-}
-
-a:hover,
-a:active {
- outline: 0;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-audio:not([controls]) {
- display: none;
-}
-
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-img {
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-button,
-input,
-select,
-textarea {
- font-size: 100%;
- margin: 0;
- vertical-align: baseline;
- *vertical-align: middle;
-}
-
-button,
-input {
- line-height: normal;
- *overflow: visible;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-
-input[type="search"] {
- -webkit-appearance: textfield;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-
-@keyframes spin {
- 0% {
- transform: rotate(0deg);
- }
-
- 100% {
- transform: rotate(359deg);
- }
-}
-
-@keyframes glow {
-
- 0%,
- 100% {
- opacity: 1;
- }
-
- 50% {
- opacity: 0.5;
- }
-}
-
-.force-wrap {
- word-wrap: break-word;
- word-break: break-all;
- -ms-word-break: break-all;
- word-break: break-word;
- hyphens: auto;
-}
-
-.type-light {
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 300;
-}
-
-.type-bold {
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 800;
-}
-
-.type-italic {
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 400;
- font-style: italic;
-}
-
-* {
- box-sizing: border-box;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- -webkit-tap-highlight-color: transparent;
-}
-
-html,
-button,
-input,
-textarea,
-select {
- outline: none;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
body {
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-style: 400;
- color: #333;
- font-size: 16px;
- background-color: #e4e4e4;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-style: 400;
margin: 0;
- padding: 0;
-}
-
-h1 {
- font-size: 40px;
- line-height: 48px;
-}
-
-h2 {
- font-size: 28px;
- line-height: 32px;
-}
-
-h3 {
- font-size: 24px;
- line-height: 28px;
-}
-
-h4 {
- font-size: 20px;
- line-height: 24px;
-}
-
-h5 {
- font-size: 14px;
- line-height: 20px;
- color: #ccc;
- text-transform: uppercase;
-}
-
-h6 {
- color: #aaa;
-}
-
-p {
- font-size: 16px;
- line-height: 24px;
-}
-
-sub,
-sup {
- font-size: 0.8em;
-}
-
-sub {
- bottom: -0.2em;
-}
-
-sup {
- top: -0.2em;
-}
-
-b {
- font-weight: bold;
-}
-
-em {
- font-style: italic;
-}
-
-input[type="text"],
-input[type="email"],
-input[type="password"],
-textarea {
- font-size: 14px;
- line-height: 20px;
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-style: 400;
- padding: .75rem 0;
- line-height: 1.5rem !important;
- border: none;
- border-radius: 0;
- box-sizing: border-box;
- color: #333;
- outline: none;
-}
-
-input[type="text"] ::placeholder,
-input[type="email"] ::placeholder,
-input[type="password"] ::placeholder,
-textarea ::placeholder {
- color: #778b91;
-}
-
-input[type="text"][disabled],
-input[type="email"][disabled],
-input[type="password"][disabled],
-textarea[disabled] {
- opacity: .5;
-}
-
-input:-webkit-autofill {
- -webkit-box-shadow: 0 0 0 1000px white inset;
-}
-
-.checkbox {
- display: inline-block;
- height: 3rem;
- position: relative;
- vertical-align: middle;
- width: 44px;
-}
-
-.checkbox input[type="checkbox"] {
- font-size: 1em;
- visibility: hidden;
-}
-
-.checkbox input[type="checkbox"]+span:before {
- position: absolute;
- top: 50%;
- right: auto;
- bottom: auto;
- left: 50%;
- width: 0.85em;
- height: 0.85em;
- transform: translate3d(-50%, -50%, 0);
- background: transparent;
- box-shadow: #2cc5d2 0 0 0 1px inset;
- content: '';
- display: block;
-}
-
-.checkbox input[type="checkbox"]:checked+span:before {
- font-size: 16px;
- line-height: 24px;
- box-shadow: none;
- color: #2cc5d2;
- margin-top: -1px;
- font-family: 'percolate';
- speak: none;
- font-style: normal;
- font-weight: normal;
- font-variant: normal;
- text-transform: none;
- line-height: 1;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
- content: "\e65e";
-}
-
-.input-symbol {
- display: inline-block;
- position: relative;
-}
-
-.input-symbol.error [class^="icon-"],
-.input-symbol.error [class*=" icon-"] {
- color: #ff4400;
}
-.input-symbol [class^="icon-"],
-.input-symbol [class*=" icon-"] {
- left: 1em;
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
}
-
-.input-symbol input {
- padding-left: 3em;
-}
-
-.input-symbol input {
- width: 100%;
-}
-
-.input-symbol input:focus+[class^="icon-"],
-.input-symbol input:focus+[class*=" icon-"] {
- color: #2cc5d2;
-}
-
-.input-symbol [class^="icon-"],
-.input-symbol [class*=" icon-"] {
- transition: all 300ms ease-in;
- transform: translate3d(0, -50%, 0);
- background: transparent;
- color: #aaa;
- font-size: 1em;
- height: 1em;
- position: absolute;
- top: 50%;
- width: 1em;
-}
-
-@font-face {
- font-family: "percolate";
- src: url("/icon/percolate.eot?-5w3um4");
- src: url("/icon/percolate.eot?#iefix5w3um4") format("embedded-opentype"), url("/icon/percolate.woff?5w3um4") format("woff"), url("/icon/percolate.ttf?5w3um4") format("truetype"), url("/icon/percolate.svg?5w3um4") format("svg");
- font-weight: normal;
- font-style: normal;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- font-family: "percolate";
- speak: none;
- font-style: normal;
- font-weight: normal;
- font-variant: normal;
- text-transform: none;
- line-height: 1;
- /* Better Font Rendering =========== */
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-.icon-graphql:before {
- content: "\e90a";
-}
-
-.icon-redux:before {
- content: "\e908";
-}
-
-.icon-grid:before {
- content: "\e909";
-}
-
-.icon-redirect:before {
- content: "\e907";
-}
-
-.icon-grow:before {
- content: "\e903";
-}
-
-.icon-lightning:before {
- content: "\e904";
-}
-
-.icon-request-change:before {
- content: "\e905";
-}
-
-.icon-transfer:before {
- content: "\e906";
-}
-
-.icon-calendar:before {
- content: "\e902";
-}
-
-.icon-sidebar:before {
- content: "\e900";
-}
-
-.icon-tablet:before {
- content: "\e901";
-}
-
-.icon-atmosphere:before {
- content: "\e671";
-}
-
-.icon-browser:before {
- content: "\e672";
-}
-
-.icon-database:before {
- content: "\e673";
-}
-
-.icon-expand-alt:before {
- content: "\e674";
-}
-
-.icon-mobile:before {
- content: "\e675";
-}
-
-.icon-watch:before {
- content: "\e676";
-}
-
-.icon-home:before {
- content: "\e600";
-}
-
-.icon-user-alt:before {
- content: "\e601";
-}
-
-.icon-user:before {
- content: "\e602";
-}
-
-.icon-user-add:before {
- content: "\e603";
-}
-
-.icon-users:before {
- content: "\e604";
-}
-
-.icon-profile:before {
- content: "\e605";
-}
-
-.icon-bookmark:before {
- content: "\e606";
-}
-
-.icon-bookmark-hollow:before {
- content: "\e607";
-}
-
-.icon-star:before {
- content: "\e608";
-}
-
-.icon-star-hollow:before {
- content: "\e609";
-}
-
-.icon-circle:before {
- content: "\e60a";
-}
-
-.icon-circle-hollow:before {
- content: "\e60b";
-}
-
-.icon-heart:before {
- content: "\e60c";
-}
-
-.icon-heart-hollow:before {
- content: "\e60d";
-}
-
-.icon-face-happy:before {
- content: "\e60e";
-}
-
-.icon-face-sad:before {
- content: "\e60f";
-}
-
-.icon-face-neutral:before {
- content: "\e610";
-}
-
-.icon-lock:before {
- content: "\e611";
-}
-
-.icon-unlock:before {
- content: "\e612";
-}
-
-.icon-key:before {
- content: "\e613";
-}
-
-.icon-arrow-left-alt:before {
- content: "\e614";
-}
-
-.icon-arrow-right-alt:before {
- content: "\e615";
-}
-
-.icon-sync:before {
- content: "\e616";
-}
-
-.icon-reply:before {
- content: "\e617";
-}
-
-.icon-expand:before {
- content: "\e618";
-}
-
-.icon-arrow-left:before {
- content: "\e619";
-}
-
-.icon-arrow-up:before {
- content: "\e61a";
-}
-
-.icon-arrow-down:before {
- content: "\e61b";
-}
-
-.icon-arrow-right:before {
- content: "\e61c";
-}
-
-.icon-chevron-down:before {
- content: "\e61d";
-}
-
-.icon-back:before {
- content: "\e61e";
-}
-
-.icon-download:before {
- content: "\e61f";
-}
-
-.icon-upload:before {
- content: "\e620";
-}
-
-.icon-proceed:before {
- content: "\e621";
-}
-
-.icon-info:before {
- content: "\e622";
-}
-
-.icon-question:before {
- content: "\e623";
-}
-
-.icon-alert:before {
- content: "\e624";
-}
-
-.icon-edit:before {
- content: "\e625";
-}
-
-.icon-paintbrush:before {
- content: "\e626";
-}
-
-.icon-close:before {
- content: "\e627";
-}
-
-.icon-trash:before {
- content: "\e628";
-}
-
-.icon-cross:before {
- content: "\e629";
-}
-
-.icon-delete:before {
- content: "\e62a";
-}
-
-.icon-power:before {
- content: "\e62b";
-}
-
-.icon-add:before {
- content: "\e62c";
-}
-
-.icon-plus:before {
- content: "\e62d";
-}
-
-.icon-document:before {
- content: "\e62e";
-}
-
-.icon-graph-line:before {
- content: "\e62f";
-}
-
-.icon-doc-chart:before {
- content: "\e630";
-}
-
-.icon-doc-list:before {
- content: "\e631";
-}
-
-.icon-category:before {
- content: "\e632";
-}
-
-.icon-copy:before {
- content: "\e633";
-}
-
-.icon-book:before {
- content: "\e634";
-}
-
-.icon-certificate:before {
- content: "\e636";
-}
-
-.icon-print:before {
- content: "\e637";
-}
-
-.icon-list-unordered:before {
- content: "\e638";
-}
-
-.icon-graph-bar:before {
- content: "\e639";
-}
-
-.icon-menu:before {
- content: "\e63a";
-}
-
-.icon-filter:before {
- content: "\e63b";
-}
-
-.icon-ellipsis:before {
- content: "\e63c";
-}
-
-.icon-cog:before {
- content: "\e63d";
-}
-
-.icon-wrench:before {
- content: "\e63e";
-}
-
-.icon-nut:before {
- content: "\e63f";
-}
-
-.icon-camera:before {
- content: "\e640";
-}
-
-.icon-eye:before {
- content: "\e641";
-}
-
-.icon-photo:before {
- content: "\e642";
-}
-
-.icon-video:before {
- content: "\e643";
-}
-
-.icon-speaker:before {
- content: "\e644";
-}
-
-.icon-phone:before {
- content: "\e645";
-}
-
-.icon-flag:before {
- content: "\e646";
-}
-
-.icon-pin:before {
- content: "\e647";
-}
-
-.icon-compass:before {
- content: "\e648";
-}
-
-.icon-globe:before {
- content: "\e649";
-}
-
-.icon-location:before {
- content: "\e64a";
-}
-
-.icon-search:before {
- content: "\e64b";
-}
-
-.icon-timer:before {
- content: "\e64c";
-}
-
-.icon-time:before {
- content: "\e64d";
-}
-
-.icon-dashboard:before {
- content: "\e64e";
-}
-
-.icon-hourglass:before {
- content: "\e64f";
-}
-
-.icon-play:before {
- content: "\e650";
-}
-
-.icon-stop:before {
- content: "\e651";
-}
-
-.icon-email:before {
- content: "\e652";
-}
-
-.icon-comment:before {
- content: "\e653";
-}
-
-.icon-link:before {
- content: "\e654";
-}
-
-.icon-paperclip:before {
- content: "\e655";
-}
-
-.icon-box:before {
- content: "\e656";
-}
-
-.icon-structure:before {
- content: "\e657";
-}
-
-.icon-commit:before {
- content: "\e658";
-}
-
-.icon-cpu:before {
- content: "\e659";
-}
-
-.icon-memory:before {
- content: "\e65a";
-}
-
-.icon-outbox:before {
- content: "\e65b";
-}
-
-.icon-share:before {
- content: "\e65c";
-}
-
-.icon-button:before {
- content: "\e65d";
-}
-
-.icon-check:before {
- content: "\e65e";
-}
-
-.icon-form:before {
- content: "\e65f";
-}
-
-.icon-admin:before {
- content: "\e660";
-}
-
-.icon-paragraph:before {
- content: "\e661";
-}
-
-.icon-bell:before {
- content: "\e662";
-}
-
-.icon-rss:before {
- content: "\e663";
-}
-
-.icon-basket:before {
- content: "\e664";
-}
-
-.icon-credit:before {
- content: "\e665";
-}
-
-.icon-support:before {
- content: "\e666";
-}
-
-.icon-shield:before {
- content: "\e667";
-}
-
-.icon-beaker:before {
- content: "\e668";
-}
-
-.icon-google:before {
- content: "\e669";
-}
-
-.icon-gdrive:before {
- content: "\e66a";
-}
-
-.icon-youtube:before {
- content: "\e66b";
-}
-
-.icon-facebook:before {
- content: "\e66c";
-}
-
-.icon-thumbs-up:before {
- content: "\e66d";
-}
-
-.icon-twitter:before {
- content: "\e66e";
-}
-
-.icon-github:before {
- content: "\e66f";
-}
-
-.icon-meteor:before {
- content: "\e670";
-}
-
-a {
- transition: all 200ms ease-in;
- color: #5db9ff;
- cursor: pointer;
- text-decoration: none;
-}
-
-a:hover {
- color: #239da8;
-}
-
-a:active {
- color: #555;
-}
-
-a:focus {
- outline: none;
-}
-
-.list-heading {
- letter-spacing: .3em;
- text-indent: .3em;
- text-transform: uppercase;
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 800;
- font-size: 11px;
- padding-left: 15px;
- line-height: 40px;
- background: #f8f8f8;
- color: #aaa;
-}
-
-.list-heading .icon-sync {
- opacity: 1;
- animation: spin 2s infinite linear;
- display: inline-block;
- margin-right: 4px;
-}
-
-.list-item {
- font-size: 14px;
- line-height: 20px;
- display: flex;
- flex-wrap: wrap;
- height: 3rem;
- width: 100%;
- background: white;
- transition: all ease-out 150ms;
-}
-
-.list-item .title {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- flex: 1;
-}
-
-.list-item input[type="text"] {
- background: transparent;
- width: 100%;
-}
-
-.list-item input[type="text"]:focus {
- cursor: text;
-}
-
-.list-item .actions {
- transition: all 200ms ease-in;
- padding-right: 20px;
-}
-
-.list-item .actions a {
- display: inline-block;
- vertical-align: top;
- text-align: center;
- color: #eee;
-}
-
-.list-item .actions a:hover {
- color: #2cc5d2;
-}
-
-.list-item .actions a:active {
- color: #555;
-}
-
-.list-item .actions [class^="icon-"] {
- font-size: 16px;
- line-height: 24px;
- line-height: 3rem;
- text-align: center;
-}
-
-.list-item.TASK_PINNED .icon-star {
- color: #2cc5d2;
-}
-
-.list-item.TASK_ARCHIVED input[type="text"] {
- color: #aaa;
-}
-
-.list-item:hover {
- background-image: linear-gradient(to bottom, #e5f9f7 0%, #f0fffd 100%);
-}
-
-.list-item:hover .checkbox {
- cursor: pointer;
-}
-
-.list-item+.list-item {
- border-top: 1px solid #f0f9fb;
-}
-
-.list-item.checked input[type="text"] {
- color: #ccc;
- text-decoration: line-through;
-}
-
-.list-item.checked .delete-item {
- display: inline-block;
-}
-
-.loading-item {
- height: 3rem;
- width: 100%;
- background: white;
- display: flex;
- align-items: center;
- line-height: 1rem;
- padding-left: 16px;
-}
-
-.loading-item .glow-checkbox,
-.loading-item .glow-text span {
- animation: glow 1.5s ease-in-out infinite;
- background: #eee;
- color: transparent;
- cursor: progress;
- display: inline-block;
-}
-
-.loading-item .glow-checkbox {
- margin-right: 16px;
- width: 12px;
- height: 12px;
-}
-
-.loading-item+.loading-item {
- border-top: 1px solid #f0f9fb;
-}
-
-.list-items {
- position: relative;
- background: white;
- min-height: 288px;
-}
-
-.list-items .select-placeholder {
- border: none;
- width: 48px;
-}
-
-.wrapper-message {
- position: absolute;
- top: 45%;
- right: 0;
- bottom: auto;
- left: 0;
- width: auto;
- height: auto;
- transform: translate3d(0, -50%, 0);
- text-align: center;
-}
-
-.wrapper-message [class^="icon-"],
-.wrapper-message [class*=" icon-"] {
- font-size: 48px;
- line-height: 56px;
- color: #2cc5d2;
- display: block;
-}
-
-.wrapper-message .title-message {
- font-size: 16px;
- line-height: 24px;
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 800;
- color: #555;
-}
-
-.wrapper-message .subtitle-message {
- font-size: 14px;
- line-height: 20px;
- color: #666;
-}
-
-.page.lists-show {
- min-height: 100vh;
- background: white;
-}
-
-.page.lists-show nav {
- background: #d3edf4;
- padding: 1.5rem 1.25rem;
- text-align: center;
-}
-
-@media screen and (min-width: 40em) {
- .page.lists-show nav {
- text-align: left;
- }
-}
-
-.page.lists-show nav .title-page {
- font-size: 20px;
- line-height: 24px;
- line-height: 2rem;
- cursor: pointer;
- white-space: nowrap;
-}
-
-.page.lists-show nav .title-page .title-wrapper {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-family: 'Nunito Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: 800;
- color: #1c3f53;
- display: inline-block;
- vertical-align: top;
- max-width: 100%;
-}
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..395b749
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,6 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import './index.css';
+import App from './App';
+
+ReactDOM.render( , document.getElementById('root'));
diff --git a/src/logo.svg b/src/logo.svg
new file mode 100644
index 0000000..6b60c10
--- /dev/null
+++ b/src/logo.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/setupTests.js b/src/setupTests.js
new file mode 100644
index 0000000..74b1a27
--- /dev/null
+++ b/src/setupTests.js
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom/extend-expect';
diff --git a/src/stories/audience/quantityOfPeople.stories.mdx b/src/stories/audience/quantityOfPeople.stories.mdx
new file mode 100644
index 0000000..5798b66
--- /dev/null
+++ b/src/stories/audience/quantityOfPeople.stories.mdx
@@ -0,0 +1,8 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+
+
+
+## Quantity Of People
+
+The workshop is designed to work in groups of 15-20 people per session.
diff --git a/src/stories/audience/technicalSkills.stories.mdx b/src/stories/audience/technicalSkills.stories.mdx
new file mode 100644
index 0000000..73b1989
--- /dev/null
+++ b/src/stories/audience/technicalSkills.stories.mdx
@@ -0,0 +1,13 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+
+
+## About Required Technical Skills
+To guarantee the correct progress, is necessary to have knowledge is some technical skills.
+Please check the next list of the required technology skills.
+
+### Required Technical Skills
+- Solid JavaScript
+- ES6 basics
+- HTML 5
+- CSS3
diff --git a/src/stories/audience/tools.stories.mdx b/src/stories/audience/tools.stories.mdx
new file mode 100644
index 0000000..b959e2d
--- /dev/null
+++ b/src/stories/audience/tools.stories.mdx
@@ -0,0 +1,13 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+
+
+
+## About Required Tools
+
+ Here is a list of tools that is necessary to have installed in order to develop the course. (Is the responsibility of the participants to have installed all these tools,
+ please feel free to contact any Workshop Team in slack, if you have doubts with the installation).
+
+### Required Tools
+- Visual Studio Code
+- Npm
diff --git a/src/stories/content/InDepth/conditionalRenderingAndEventHandling.stories.mdx b/src/stories/content/InDepth/conditionalRenderingAndEventHandling.stories.mdx
new file mode 100644
index 0000000..9c70bde
--- /dev/null
+++ b/src/stories/content/InDepth/conditionalRenderingAndEventHandling.stories.mdx
@@ -0,0 +1,86 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+import UsersListComponent from '../../../components/inDepth/UsersListComponent';
+
+
+
+# Conditional rendering and events handling
+
+Knowing how we can access pops and state can help us to easily re-use components and persist some information at a component level, but just with that
+we can't do much if we need to react to external changes or trigger actions based on user interaction.
+
+In this section we will learn how we can display different content based on props/state and how we can trigger events based on actions like clicking a button.
+
+## Conditional Render
+
+
+Let's define a user list component with a local state:
+
+```jsx
+class UsersListComponent extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ users: null,
+ isLoading: false
+ };
+ }
+...
+
+}
+
+```
+Nothing new so far, right?
+
+---
+
+Now let's say we want this component to display a default message when the list of users from the local state is empty, and
+iterate throught the actual list when there is data available so we can display all the users, **how do we do that?**
+
+Since JSX lets us use markup with plain JavaScript, we can make use of the conditional structures we already now from JS (if/else, ternary operators, loops, etc... ).
+
+Let's see how this looks like:
+
+``` jsx
+ ...
+ render() {
+ let content;
+
+ if (this.state.users) {
+ content = (
+
+ {this.state.users.map(user => (
+ - {`${user.name} ${user.lastName}`}
+ ))}
+
+ );
+ } else {
+ content = (
+
+ No users to be displayed! Please click the button to refresh!
+ Refresh users!
+
+ );
+ }
+
+ return (
+
+
Users List
+ {this.state.isLoading ? Loading data! : content}
+ {this.state.hasErrors && (Upps, something went wrong while loading the data! )}
+
+ );
+ }
+}
+...
+
+```
+
+
+## Event handling
+
+
+
+
+
+
diff --git a/src/stories/content/InDepth/lifecycleMethods.stories.mdx b/src/stories/content/InDepth/lifecycleMethods.stories.mdx
new file mode 100644
index 0000000..0887225
--- /dev/null
+++ b/src/stories/content/InDepth/lifecycleMethods.stories.mdx
@@ -0,0 +1,41 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+import SimpleComponent from '../../../components/reactIntroduction/SimpleComponent';
+import ClassComponent from '../../../components/reactIntroduction/ClassComponent';
+
+
+
+# Lifecycle Methods
+
+There are two main ways of defining components in Reac, using a function or defining a class that extends from React.Component.
+
+## Function Component
+
+As the name suggests, a function component is a `JavaScript` function, this function receives as parameter a `props` object that
+contains `{key:value}` pairs with information passed from outside the component.
+
+The function also returns a root React Element that can contain `n` children React Elements. These elements are a description of how the Component UI should look like.
+
+The main difference with a Class Component is that we have easy access to a `local state` managed by the component and to the lifecycle methods. We'll dig deeper into these subjects later.
+
+```jsx
+import React from 'react';
+
+function SimpleComponent(props) {
+ return (
+
+
Hello there!
+
I'm a simple ReactJS Component that renders a title with a paragraph.
+
+ );
+}
+
+export default SimpleComponent;
+```
+
+
+
+
+
+
+
diff --git a/src/stories/content/reactIntroduction/functionAndClassComponents.stories.mdx b/src/stories/content/reactIntroduction/functionAndClassComponents.stories.mdx
new file mode 100644
index 0000000..593ca54
--- /dev/null
+++ b/src/stories/content/reactIntroduction/functionAndClassComponents.stories.mdx
@@ -0,0 +1,82 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+import SimpleComponent from '../../../components/reactIntroduction/SimpleComponent';
+import ClassComponent from '../../../components/reactIntroduction/ClassComponent';
+
+
+
+# Function and Class Components
+
+There are two main ways of defining components in Reac, using a function or defining a class that extends from React.Component.
+
+## Function Component
+
+As the name suggests, a function component is a `JavaScript` function, this function receives as parameter a `props` object that
+contains `{key:value}` pairs with information passed from outside the component.
+
+The function also returns a root React Element that can contain `n` children React Elements. These elements are a description of how the Component UI should look like.
+
+The main difference with a Class Component is that we have easy access to a `local state` managed by the component and to the lifecycle methods. We'll dig deeper into these subjects later.
+
+```jsx
+import React from 'react';
+
+function SimpleComponent(props) {
+ return (
+
+
Hello there!
+
I'm a simple ReactJS Component that renders a title with a paragraph.
+
+ );
+}
+
+export default SimpleComponent;
+```
+
+
+
+
+
+
+
+
+
+## Class Components
+
+A class component is a little more complex than a function component in the sense that it requires a bit more of code in order to be defined.
+
+In this case we will have an ES6+ Class that will extend from the `React.Component` object. Additional to that, there will be a `render()` class function,
+this function unlike the one from `Funtion Components` doesn't receive any parameters, but it does return a React Element.
+
+
+```jsx
+import React, { Component } from 'react';
+import styled from 'styled-components';
+
+const Container = styled.div`
+ border: 1px solid #333;
+ background-color: #666;
+ padding: 2em;
+`;
+
+const Title = styled.h1`
+ color: #1EA7FD;
+ font-weight: bold;
+`;
+
+export default class ClassComponent extends Component {
+ render() {
+ return (
+
+ I'm a Class Component
+
+ );
+ }
+}
+```
+
+
+
+
+
+
diff --git a/src/stories/content/reactIntroduction/stateAndProps.stories.mdx b/src/stories/content/reactIntroduction/stateAndProps.stories.mdx
new file mode 100644
index 0000000..bdb1db3
--- /dev/null
+++ b/src/stories/content/reactIntroduction/stateAndProps.stories.mdx
@@ -0,0 +1,154 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+import SimpleComponent from '../../../components/reactIntroduction/SimpleComponent';
+import AvatarComponent from '../../../components/reactIntroduction/AvatarComponent';
+import SimpleFormWithState from '../../../components/reactIntroduction/SimpleFormWithState';
+import * as Logo from '../../../../public/logo192.png';
+
+
+
+# State and Props
+
+We know how to define a simple component that renders hardcoded content, but what's next???
+
+Rendering static content is not so useful for create interactive and reusable components, remember the `props` and `state` we previously mentioned?
+Now is time to put them some use.
+
+## Props
+
+Props are values passed from outside of the component, they allow the component to render in the UI elements based on these `parameters` and re-use the component over and over again, the same way we do when we create a normal JavaScript function.
+
+One important thing to keep in mind
+
+
+ Click to expand/collapse the componet's source code
+
+
+
+```jsx
+import React from 'react';
+import styled from 'styled-components';
+
+const AvatarWrapper = styled.div`
+ ...
+`;
+
+const Image = styled.img`
+ ...
+`;
+
+const HorizontalRule = styled.hr`
+ ...
+`;
+
+function AvatarComponent(props) {
+ return (
+
+
+
+ {props.fullName}
+
+ );
+}
+
+export default AvatarComponent;
+```
+
+
+
+
+
+
+
+
+
+
+## State
+
+
+ Click to expand/collapse the componet's source code
+
+
+
+```jsx
+
+...
+
+const Form = styled.form`
+...
+`;
+
+
+const Label = styled.label`
+...
+`;
+
+const Input = styled.input`
+...
+`;
+
+const Button = styled.button`
+...
+`;
+
+export default class SimpleFormWithState extends Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ name: '',
+ lastName: '',
+ age: ''
+ };
+ }
+
+ handleChange = ({ target }) => {
+ this.setState({[target.name]: target.value});
+ }
+
+ submitForm = async (event) => {
+ event.preventDefault();
+ console.log('Current State: ',this.state)
+ const response = await fetch(`${BASE_URL}/people`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(this.state)
+ });
+
+ const result = await response.json();
+ console.log('API Response: ', result);
+ };
+
+ render() {
+ return (
+
+ );
+ }
+}
+
+```
+
+
+
+
+
+
+
+
+
+
diff --git a/src/stories/content/reactIntroduction/whatIsReact.stories.mdx b/src/stories/content/reactIntroduction/whatIsReact.stories.mdx
new file mode 100644
index 0000000..87e449e
--- /dev/null
+++ b/src/stories/content/reactIntroduction/whatIsReact.stories.mdx
@@ -0,0 +1,78 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+import SimpleComponent from '../../../components/reactIntroduction/SimpleComponent';
+import NestedComponent from '../../../components/reactIntroduction/NestedComponent';
+
+
+
+# What is ReactJS
+
+ReactJS is a declarative JavaScript library for building User Interfaces based in components.
+
+We can think of a component as a function that receives parameters (props) and returns a set of elements that describe how the component should look like.
+
+## Simple ReactJS component
+
+The code bellow shows how a simple ReactJS component looks like:
+
+```jsx
+import React from 'react';
+
+function SimpleComponent(props) {
+ return (
+
+
Hello there!
+
I'm a simple ReactJS Component that renders a title with a paragraph.
+
+ );
+}
+
+export default SimpleComponent;
+```
+
+
+
+
+
+
+
+
+## Nested Component
+
+```jsx
+...
+const Container = styled.div`
+ border: 1px solid #333;
+ border-radius: 5px;
+ background-color: #249;
+ color: white;
+ padding: 2em;
+`;
+
+const ChildrenWrapper = styled.div`
+ border: 1px solid white;
+ border-radius: 5px;
+ background-color: white;
+ color: black;
+ padding: 1em;
+`;
+
+function NestedComponent(props) {
+ return (
+
+ I'm the parent component!
+ {props.children}
+
+ );
+}
+
+...
+```
+
+
+
+
+
+
+
+
diff --git a/src/stories/welcome/welcome.stories.mdx b/src/stories/welcome/welcome.stories.mdx
new file mode 100644
index 0000000..84056ed
--- /dev/null
+++ b/src/stories/welcome/welcome.stories.mdx
@@ -0,0 +1,9 @@
+import { Meta, Story, Preview } from '@storybook/addon-docs/blocks';
+
+
+
+
+## Welcome
+
+This workshop is for Gorilla employees with interest to learn and practice with ReactJS.
+The main idea is to improve technical skills and has the opportunity to implement this new knowledge in a real project.
\ No newline at end of file