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 ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
- ); -} - -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.title} {p.description}
    :
    {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') + ], +}