diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..03d9549
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb
new file mode 100644
index 0000000..e69de29
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml
new file mode 100644
index 0000000..f957e1e
--- /dev/null
+++ b/.idea/watcherTasks.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 7123cbf..4a3cd6c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,18 +8,29 @@
"name": "cv",
"version": "0.1.0",
"dependencies": {
+ "@headlessui/react": "^1.7.2",
+ "@heroicons/react": "^2.0.11",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/jest": "^27.5.2",
+ "@types/lodash": "^4.14.186",
"@types/node": "^16.11.62",
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
+ "lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"typescript": "^4.8.4",
"web-vitals": "^2.1.4"
+ },
+ "devDependencies": {
+ "@tailwindcss/typography": "^0.5.7",
+ "autoprefixer": "^10.4.12",
+ "postcss": "^8.4.16",
+ "sass": "^1.55.0",
+ "tailwindcss": "^3.1.8"
}
},
"node_modules/@adobe/css-tools": {
@@ -2203,6 +2214,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@headlessui/react": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.2.tgz",
+ "integrity": "sha512-snLv2lxwsf2HNTOBNgHYdvoYZ3ChJE8QszPi1d/hl9js8KrFrUulTaQBfSyPbJP5BybVreWh9DxCgz9S0Z6hKQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18",
+ "react-dom": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/@heroicons/react": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.11.tgz",
+ "integrity": "sha512-bASjOgSSaYj8HqXWsOqaBiB6ZLalE/g90WYGgZ5lPm4KCCG7wPXntY4kzHf5NrLh6UBAcnPwvbiw1Ne9GYfJtw==",
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz",
@@ -3401,6 +3432,21 @@
"url": "https://github.com/sponsors/gregberge"
}
},
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz",
+ "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==",
+ "dev": true,
+ "dependencies": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
+ },
"node_modules/@testing-library/dom": {
"version": "8.18.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.18.1.tgz",
@@ -3810,6 +3856,11 @@
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
},
+ "node_modules/@types/lodash": {
+ "version": "4.14.186",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
+ "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
+ },
"node_modules/@types/mime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
@@ -8540,6 +8591,12 @@
"url": "https://opencollective.com/immer"
}
},
+ "node_modules/immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "devOptional": true
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -11248,11 +11305,23 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "node_modules/lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
+ "dev": true
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true
+ },
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -14302,6 +14371,23 @@
"resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
"integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
},
+ "node_modules/sass": {
+ "version": "1.55.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz",
+ "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==",
+ "devOptional": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/sass-loader": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
@@ -17997,6 +18083,18 @@
}
}
},
+ "@headlessui/react": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.2.tgz",
+ "integrity": "sha512-snLv2lxwsf2HNTOBNgHYdvoYZ3ChJE8QszPi1d/hl9js8KrFrUulTaQBfSyPbJP5BybVreWh9DxCgz9S0Z6hKQ==",
+ "requires": {}
+ },
+ "@heroicons/react": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.11.tgz",
+ "integrity": "sha512-bASjOgSSaYj8HqXWsOqaBiB6ZLalE/g90WYGgZ5lPm4KCCG7wPXntY4kzHf5NrLh6UBAcnPwvbiw1Ne9GYfJtw==",
+ "requires": {}
+ },
"@humanwhocodes/config-array": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz",
@@ -18825,6 +18923,18 @@
"loader-utils": "^2.0.0"
}
},
+ "@tailwindcss/typography": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz",
+ "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==",
+ "dev": true,
+ "requires": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "postcss-selector-parser": "6.0.10"
+ }
+ },
"@testing-library/dom": {
"version": "8.18.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.18.1.tgz",
@@ -19165,6 +19275,11 @@
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
},
+ "@types/lodash": {
+ "version": "4.14.186",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
+ "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
+ },
"@types/mime": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
@@ -22620,6 +22735,12 @@
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
"integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ=="
},
+ "immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "devOptional": true
+ },
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -24573,11 +24694,23 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
+ "dev": true
+ },
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
},
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true
+ },
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -26602,6 +26735,17 @@
"resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
"integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
},
+ "sass": {
+ "version": "1.55.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz",
+ "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==",
+ "devOptional": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
"sass-loader": {
"version": "12.6.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
diff --git a/package.json b/package.json
index af64a4a..abc0567 100644
--- a/package.json
+++ b/package.json
@@ -3,13 +3,17 @@
"version": "0.1.0",
"private": true,
"dependencies": {
+ "@headlessui/react": "^1.7.2",
+ "@heroicons/react": "^2.0.11",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/jest": "^27.5.2",
+ "@types/lodash": "^4.14.186",
"@types/node": "^16.11.62",
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
+ "lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
@@ -39,5 +43,12 @@
"last 1 firefox version",
"last 1 safari version"
]
+ },
+ "devDependencies": {
+ "@tailwindcss/typography": "^0.5.7",
+ "autoprefixer": "^10.4.12",
+ "postcss": "^8.4.16",
+ "sass": "^1.55.0",
+ "tailwindcss": "^3.1.8"
}
}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/index.html b/public/index.html
index aa069f2..86683d7 100644
--- a/public/index.html
+++ b/public/index.html
@@ -2,28 +2,12 @@
-
-
-
-
-
React App
diff --git a/public/logo192.png b/public/logo192.png
deleted file mode 100644
index fc44b0a..0000000
Binary files a/public/logo192.png and /dev/null differ
diff --git a/public/logo512.png b/public/logo512.png
deleted file mode 100644
index a4e47a6..0000000
Binary files a/public/logo512.png and /dev/null differ
diff --git a/public/manifest.json b/public/manifest.json
deleted file mode 100644
index 080d6c7..0000000
--- a/public/manifest.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "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
deleted file mode 100644
index e9e57dc..0000000
--- a/public/robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# https://www.robotstxt.org/robotstxt.html
-User-agent: *
-Disallow:
diff --git a/src/App.css b/src/App.css
deleted file mode 100644
index 74b5e05..0000000
--- a/src/App.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.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.test.tsx b/src/App.test.tsx
deleted file mode 100644
index 2a68616..0000000
--- a/src/App.test.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import { render, screen } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
- render();
- const linkElement = screen.getByText(/learn react/i);
- expect(linkElement).toBeInTheDocument();
-});
diff --git a/src/App.tsx b/src/App.tsx
deleted file mode 100644
index a53698a..0000000
--- a/src/App.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import logo from './logo.svg';
-import './App.css';
-
-function App() {
- return (
-
- );
-}
-
-export default App;
diff --git a/src/Assets/scss/CV.scss b/src/Assets/scss/CV.scss
new file mode 100644
index 0000000..7799f0f
--- /dev/null
+++ b/src/Assets/scss/CV.scss
@@ -0,0 +1,25 @@
+.card {
+ @apply container p-3 bg-gray-200 rounded-md mt-8 mb-8 drop-shadow;
+}
+
+.icon {
+ @apply w-5 inline-block mr-2;
+}
+
+.tag {
+ @apply mb-2 rounded-full p-3 pt-1 pb-1 text-white shadow mr-1 prose prose-sm;
+}
+
+.details {
+ & > * {
+ padding: 20px 0;
+ }
+
+ & > *:first-child {
+ padding-top: 0;
+ }
+
+ & > *:last-child {
+ padding-bottom: 0;
+ }
+}
diff --git a/src/CV.tsx b/src/CV.tsx
new file mode 100644
index 0000000..3c6e8d9
--- /dev/null
+++ b/src/CV.tsx
@@ -0,0 +1,54 @@
+import React, {useEffect} from 'react';
+import Header from './Components/Header';
+import './Assets/scss/CV.scss'
+import Jobs from './Components/Jobs';
+import Education from './Components/Education';
+import SideProjects from './Components/SideProjects';
+import Languages from './Components/Languages';
+import Interests from './Components/Interests';
+import Skills from './Components/Skills';
+import {Tag, TagCategory} from './Model/tag';
+import {Lang} from './Model/lang';
+import {EducationYear} from './Model/education';
+import {SideProjectCats} from './Model/side-project';
+import {JobAtCompany} from './Model/job-at-company';
+import {Interest} from './Model/interests';
+import {Profile} from './Model/profile';
+
+function CV() {
+
+
+ document.title = profile.name;
+
+ useEffect(() => {
+ let link = document.querySelector("link[rel~='icon']");
+ if (!link) {
+ link = document.createElement('link');
+ // @ts-ignore
+ link.rel = 'icon';
+ document.getElementsByTagName('head')[0].appendChild(link);
+ }
+ // @ts-ignore
+ link.href = profile.picture
+ }, []);
+
+ return (
+
+ );
+}
+
+export default CV;
diff --git a/src/Components/Education.tsx b/src/Components/Education.tsx
new file mode 100644
index 0000000..c45ee13
--- /dev/null
+++ b/src/Components/Education.tsx
@@ -0,0 +1,17 @@
+import React, {ComponentProps} from 'react';
+import {AcademicCapIcon, BriefcaseIcon} from '@heroicons/react/24/outline';
+import {EducationYear} from '../Model/education';
+
+function Education(props: ComponentProps) {
+ return (
+
Formations
+ {props.education.map((e: EducationYear) =>
+
{e.school}
+
{e.endDate}
+
+
{e.name}
+
)}
+
);
+}
+
+export default Education;
diff --git a/src/Components/Header.tsx b/src/Components/Header.tsx
new file mode 100644
index 0000000..c44a435
--- /dev/null
+++ b/src/Components/Header.tsx
@@ -0,0 +1,43 @@
+import React, {ComponentProps} from 'react';
+import {CodeBracketIcon, EnvelopeIcon, PhoneIcon, UserPlusIcon} from '@heroicons/react/24/outline';
+import {getTagColor, Tag} from '../Model/tag';
+import {Profile} from '../Model/profile';
+
+function Header(props: ComponentProps) {
+ const tags = props.tags.filter((t: Tag) => t.workThing)
+ const profile: Profile = props.profile
+ return (
+
+
+
+
+
{profile.name}
+
{profile.title}
+
{profile.quote}
+
{/* Tags */}
+ {tags.map((t: Tag) => )}
+
+
+
+
+
Me contacter
+
+
+
Me connaitre
+
+
+
+
+
);
+}
+
+export default Header;
diff --git a/src/Components/Interests.tsx b/src/Components/Interests.tsx
new file mode 100644
index 0000000..122ca39
--- /dev/null
+++ b/src/Components/Interests.tsx
@@ -0,0 +1,14 @@
+import React, {ComponentProps} from 'react';
+import {CalendarDaysIcon, FaceSmileIcon, LanguageIcon} from '@heroicons/react/24/outline';
+import {Interest} from '../Model/interests';
+
+function Interests(props: ComponentProps) {
+ return (
+
Centre d'intérets
+
+ {props.interests.map((i: Interest) => - {i.theme} : {i.description}
)}
+
+
);
+}
+
+export default Interests;
diff --git a/src/Components/Job.tsx b/src/Components/Job.tsx
new file mode 100644
index 0000000..00ad678
--- /dev/null
+++ b/src/Components/Job.tsx
@@ -0,0 +1,16 @@
+import React, {ComponentProps} from 'react';
+import {BriefcaseIcon} from '@heroicons/react/24/outline';
+
+function Job(props: ComponentProps) {
+ return (
+
{props.jobTitle}
+
{props.start} - {props.end}
+
+
{props.company}
+
+ {props.tasks.map((task: string) => - {task}
)}
+
+
);
+}
+
+export default Job;
diff --git a/src/Components/Jobs.tsx b/src/Components/Jobs.tsx
new file mode 100644
index 0000000..dfdafb3
--- /dev/null
+++ b/src/Components/Jobs.tsx
@@ -0,0 +1,14 @@
+import React, {ComponentProps} from 'react';
+import {BriefcaseIcon} from '@heroicons/react/24/outline';
+import Job from './Job';
+import {JobAtCompany} from '../Model/job-at-company';
+
+function Jobs(props: ComponentProps) {
+ return (
+
Expériences professionnelles
+ {props.jobs.map((j: JobAtCompany) => )}
+
+ );
+}
+
+export default Jobs;
diff --git a/src/Components/Languages.tsx b/src/Components/Languages.tsx
new file mode 100644
index 0000000..a243181
--- /dev/null
+++ b/src/Components/Languages.tsx
@@ -0,0 +1,14 @@
+import React, {ComponentProps} from 'react';
+import {CalendarDaysIcon, LanguageIcon} from '@heroicons/react/24/outline';
+import {Lang} from '../Model/lang';
+
+function Languages(props: ComponentProps) {
+ return (
+
Langues
+
+ {props.langs.map((l: Lang) => - {l.lang} : {l.level}
)}
+
+
);
+}
+
+export default Languages;
diff --git a/src/Components/SideProjects.tsx b/src/Components/SideProjects.tsx
new file mode 100644
index 0000000..cad0d56
--- /dev/null
+++ b/src/Components/SideProjects.tsx
@@ -0,0 +1,23 @@
+import React, {ComponentProps} from 'react';
+import {BeakerIcon} from '@heroicons/react/24/outline';
+import {SideProjectCats} from '../Model/side-project';
+
+function SideProjects(props: ComponentProps) {
+ return (
+
Projets personnels
+ {props.projs.map((proj: SideProjectCats) => {
+ return (
+
{proj.category}
+
+ {proj.projects.map(p => {
+ return (-
+ {p.title ? :
{p.description}
}
+ )
+ })}
+
+
)
+ })}
+
);
+}
+
+export default SideProjects;
diff --git a/src/Components/Skills.tsx b/src/Components/Skills.tsx
new file mode 100644
index 0000000..516c0d6
--- /dev/null
+++ b/src/Components/Skills.tsx
@@ -0,0 +1,23 @@
+import React, {ComponentProps} from 'react';
+import {CalendarDaysIcon, CheckBadgeIcon, LanguageIcon} from '@heroicons/react/24/outline';
+import {getTagColor, Tag, TagCategory} from '../Model/tag';
+import {forIn, groupBy, map} from 'lodash';
+
+function Skills(props: ComponentProps) {
+ const tagsByCat = groupBy(props.tags, 'category')
+ return (
+
Compétences
+
+ {map(tagsByCat, (tags, cat) => {
+ return (
+
{cat}
+
+ {tags.map((t: Tag) => )}
+
+
)
+ })}
+
+
);
+}
+
+export default Skills;
diff --git a/src/Model/education.ts b/src/Model/education.ts
new file mode 100644
index 0000000..ba51c67
--- /dev/null
+++ b/src/Model/education.ts
@@ -0,0 +1,5 @@
+export class EducationYear {
+ endDate!: string
+ school!: string
+ name!: string
+}
diff --git a/src/Model/interests.ts b/src/Model/interests.ts
new file mode 100644
index 0000000..34e4fe9
--- /dev/null
+++ b/src/Model/interests.ts
@@ -0,0 +1,4 @@
+export class Interest {
+ theme!: string
+ description!: string
+}
diff --git a/src/Model/job-at-company.ts b/src/Model/job-at-company.ts
new file mode 100644
index 0000000..4388458
--- /dev/null
+++ b/src/Model/job-at-company.ts
@@ -0,0 +1,7 @@
+export class JobAtCompany {
+ jobTitle!: string
+ start!: string
+ end!: string
+ company!: string
+ tasks!: string[]
+}
diff --git a/src/Model/lang.ts b/src/Model/lang.ts
new file mode 100644
index 0000000..9ddc21c
--- /dev/null
+++ b/src/Model/lang.ts
@@ -0,0 +1,4 @@
+export class Lang {
+ lang!: string
+ level!: string
+}
diff --git a/src/Model/profile.ts b/src/Model/profile.ts
new file mode 100644
index 0000000..5830a73
--- /dev/null
+++ b/src/Model/profile.ts
@@ -0,0 +1,10 @@
+export class Profile {
+ name!: string
+ title!: string
+ quote!: string
+ picture!: string
+ email?: string
+ phone?: string
+ linkedin?: string
+ source?: string
+}
diff --git a/src/Model/side-project.ts b/src/Model/side-project.ts
new file mode 100644
index 0000000..78edd95
--- /dev/null
+++ b/src/Model/side-project.ts
@@ -0,0 +1,10 @@
+export class SideProject {
+ title?: string
+ url?: string
+ description!: string
+}
+
+export class SideProjectCats {
+ category!: string
+ projects!: SideProject[];
+}
diff --git a/src/Model/tag.ts b/src/Model/tag.ts
new file mode 100644
index 0000000..3e9abd6
--- /dev/null
+++ b/src/Model/tag.ts
@@ -0,0 +1,29 @@
+export function getTagColor(t: Tag) {
+ switch (t.category) {
+ case TagCategory.FRONT:
+ return "bg-rose-500"
+ case TagCategory.BACK:
+ return "bg-indigo-600"
+ case TagCategory.MOBILE:
+ return "bg-yellow-500"
+ case TagCategory.DB:
+ return "bg-emerald-500"
+ case TagCategory.OTHER:
+ return "bg-stone-300"
+ }
+};
+
+export enum TagCategory {
+ FRONT = 'Developpement Front',
+ BACK = 'Developpement Back',
+ MOBILE = 'Developpement Mobile',
+ DB = 'Bases de données',
+ OTHER = 'Autre'
+}
+
+export class Tag {
+ name: string = ""
+ workThing: Boolean = true
+ category!: TagCategory
+}
+
diff --git a/src/index.css b/src/index.css
index ec2585e..b5c61c9 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,13 +1,3 @@
-body {
- margin: 0;
- 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;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
-}
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/src/index.tsx b/src/index.tsx
index 032464f..02d9a70 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
-import App from './App';
+import CV from './CV';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(
@@ -9,7 +9,7 @@ const root = ReactDOM.createRoot(
);
root.render(
-
+
);
diff --git a/src/logo.svg b/src/logo.svg
deleted file mode 100644
index 9dfc1c0..0000000
--- a/src/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..c2664bc
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,20 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ "./src/**/*.{js,jsx,ts,tsx}",
+ ],
+ theme: {
+ extend: {},
+ container: {
+ center: true,
+ },
+ screens: {
+ sm: '640px',
+ md: '768px',
+ lg: '1024px'
+ },
+ },
+ plugins: [
+ require('@tailwindcss/typography')
+ ],
+}