index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <PageMeta
  3. title="Olivier Massot - Fullstack developer"
  4. description=""
  5. />
  6. <div class="banner">
  7. <h1>
  8. {{ $t('Fullstack developer') }}
  9. </h1>
  10. <h2>
  11. {{ $t('x_years_experience', { years: XP_YEARS }) }}
  12. </h2>
  13. </div>
  14. <div class="introduction">
  15. <div>
  16. {{ $t('intro_short') }}
  17. </div>
  18. <div v-html="$t('intro_part_4')" />
  19. <v-expand-transition>
  20. <div v-if="showLongIntro">
  21. <div>
  22. {{ $t('intro_part_1') }}
  23. </div>
  24. <div>
  25. {{ $t('intro_part_2') }}
  26. </div>
  27. <div>
  28. {{ $t('intro_part_3') }}
  29. </div>
  30. </div>
  31. </v-expand-transition>
  32. <v-btn
  33. size="small"
  34. variant="text"
  35. :prepend-icon="showLongIntro ? 'fas fa-caret-up' : 'fas fa-caret-down'"
  36. @click="showLongIntro=!showLongIntro"
  37. >
  38. {{ showLongIntro ? $t('show_less') : $t('show_more') }}
  39. </v-btn>
  40. <div class="logos mt-3">
  41. <BannerLogo
  42. href="https://github.com/olinox14"
  43. :img="theme.global.name.value === 'light' ? '/images/logos/github_large_light.png' : '/images/logos/github_large_dark.png'"
  44. :alt="i18n.t('Find me on Github')"
  45. />
  46. <BannerLogo
  47. href="https://stackoverflow.com/users/4279120/olinox14"
  48. :img="theme.global.name.value === 'light' ? '/images/logos/stackoverflow.svg' : '/images/logos/stackoverflow-dark.svg'"
  49. :alt="i18n.t('Find me on Stackoverflow')"
  50. class="so-logo"
  51. />
  52. <BannerLogo
  53. href="https://www.linkedin.com/in/olivier-massot-60b87b181"
  54. img="/images/logos/linkedin.png"
  55. :alt="i18n.t('Find me on LinkedIn')"
  56. />
  57. <BannerLogo
  58. href="https://www.codingame.com/profile/75dcc329745def530c02ddb4485f22235683081"
  59. img="/images/logos/codingame.svg"
  60. :alt="i18n.t('Find me on Codingame')"
  61. />
  62. </div>
  63. </div>
  64. <div class="content">
  65. <div class="badges">
  66. <h3>{{ $t("Competences") }}</h3>
  67. <v-container>
  68. <v-row>
  69. <v-col cols="4">
  70. <div class="badges-section">
  71. <h4>Languages</h4>
  72. <Badge
  73. title="Python"
  74. img="/images/logos/python.svg"
  75. :subtitle="$t('x_years', { years: 10 })"
  76. details="J'ai travaillé sur de très nombreux projets avec Python, depuis la version 2.7 jusqu'à la version 3.12: scripts variés, extensions QGis, projets web, librairies, utilitaires ou applications buraeautiques."
  77. />
  78. <Badge title="PHP" img="/images/logos/php.svg" :subtitle="$t('x_years', { years: 4 })" />
  79. <Badge title="Node.js" :img="theme.global.name.value === 'light' ? '/images/logos/nodejs_light.svg' : '/images/logos/nodejs_dark.svg'" :subtitle="$t('x_years', { years: 5 })" />
  80. <Badge title="C#" img="/images/logos/csharp.png" :subtitle="$t('x_years', { years: 2 })" />
  81. </div>
  82. <div class="badges-section">
  83. <h4>Frameworks</h4>
  84. <Badge title="Symfony" img="/images/logos/symfony.svg" :subtitle="$t('x_years', { years: 4 })" />
  85. <Badge title="Vue.js" img="/images/logos/vue.png" :subtitle="$t('x_years', { years: 3 })" />
  86. <Badge title="Nuxt.js" img="/images/logos/nuxt.svg" :subtitle="$t('x_years', { years: 3 })" />
  87. <Badge title="Django" :img="theme.global.name.value === 'light' ? '/images/logos/django-light.svg' : '/images/logos/django-dark.svg'" :subtitle="$t('x_years', { years: 3 })" />
  88. <Badge title=".Net" img="/images/logos/dotnet.svg" :subtitle="$t('x_years', { years: 2 })" />
  89. <Badge title="Jquery" :img="theme.global.name.value === 'light' ? '/images/logos/jquery.png' : '/images/logos/jquery_dark.png'" :subtitle="$t('x_years', { years: 4 })"/>
  90. </div>
  91. </v-col>
  92. <v-col cols="4">
  93. <div class="badges-section">
  94. <h4>DBs and search-engines</h4>
  95. <Badge title="Mysql" img="/images/logos/mysql.png" :subtitle="$t('x_years', { years: 6 })" />
  96. <Badge title="MariaDb" :img="theme.global.name.value === 'light' ? '/images/logos/mariadb.svg': '/images/logos/mariadb_dark.svg'" :subtitle="$t('x_years', { years: 6 })" />
  97. <Badge title="Postgresql" img="/images/logos/postgresql.svg" :subtitle="$t('x_years', { years: 5 })"/>
  98. <Badge title="SQL-Server" img="/images/logos/sql-server.svg" :subtitle="$t('x_years', { years: 6 })" />
  99. <Badge title="Sqlite" img="/images/logos/sqlite.svg" :subtitle="$t('x_years', { years: 5 })" />
  100. <Badge title="Solr" :img="theme.global.name.value === 'light' ? '/images/logos/solr_light.png' : '/images/logos/solr_dark.png'" :subtitle="$t('x_years', { years: 1 })" />
  101. </div>
  102. <div class="badges-section">
  103. <h4>Devops</h4>
  104. <Badge title="Docker" img="/images/logos/docker.svg" :subtitle="$t('x_years', { years: 5 })" />
  105. <Badge title="Gitlab CI" img="/images/logos/gitlab.svg" :subtitle="$t('x_years', { years: 8 })" />
  106. <Badge title="Github Actions" :img="theme.global.name.value === 'light' ? '/images/logos/github-light.svg' : '/images/logos/github-dark.svg'" :subtitle="$t('x_years', { years: 1 })" />
  107. <Badge title="Jenkins" img="/images/logos/jenkins.png" :subtitle="$t('x_years', { years: 4 })" />
  108. </div>
  109. </v-col>
  110. <v-col cols="4">
  111. <div class="badges-section">
  112. <h4>CMS</h4>
  113. <Badge title="Typo3" img="/images/logos/typo3.png" :subtitle="$t('x_years', { years: 4 })" />
  114. <Badge title="Wordpress" :img="theme.global.name.value === 'light' ? '/images/logos/wordpress.png' : '/images/logos/wordpress_dark.png'" :subtitle="$t('x_years', { years: 6 })"/>
  115. </div>
  116. <div class="badges-section">
  117. <h4>Other</h4>
  118. <Badge title="Mercure (SSE)" img="/images/logos/mercure_icon.png" :subtitle="$t('x_years', { years: 3 })" />
  119. <Badge title="Nextcloud" img="/images/logos/nextcloud.svg" :subtitle="$t('x_years', { years: 6 })" />
  120. <Badge title="Linux" img="/images/logos/linux.png" :subtitle="$t('x_years', { years: 10 })" />
  121. </div>
  122. <div class="badges-section">
  123. <h4>Management</h4>
  124. <Badge title="Management" img="/images/team-management.png" :subtitle="$t('x_years', { years: 10 })" />
  125. <Badge title="Continuous Improvement" img="/images/continuous-improvement.png" :subtitle="$t('x_years', { years: 9 })" />
  126. <Badge title="SCRUM" img="/images/scrum.png" :subtitle="$t('x_years', { years: 8 })" />
  127. <Badge title="Tutoring" img="/images/teacher.png" :subtitle="$t('x_years', { years: 6 })" />
  128. </div>
  129. <!-- <div class="badges-section">-->
  130. <!-- <h4>Languages</h4>-->
  131. <!-- <Badge title="English" img="" :subtitle="$t('good')" />-->
  132. <!-- <Badge title="French" img="" :subtitle="$t('native')" />-->
  133. <!-- <Badge title="Spanish" img="" :subtitle="$t('basic')" />-->
  134. <!-- </div>-->
  135. </v-col>
  136. </v-row>
  137. </v-container>
  138. </div>
  139. <div class="cursus">
  140. <h3>{{ $t("Cursus") }}</h3>
  141. <Cursus />
  142. </div>
  143. </div>
  144. <div class="contact">
  145. <h3>{{ $t("Contact") }}</h3>
  146. <Contact />
  147. </div>
  148. </template>
  149. <script setup lang="ts">
  150. import { useTheme } from 'vuetify'
  151. import type { Ref } from '@vue/reactivity'
  152. const i18n = useI18n()
  153. const theme = useTheme()
  154. const START_YEAR = 2011
  155. const CURRENT_YEAR = new Date().getFullYear();
  156. const XP_YEARS = CURRENT_YEAR - START_YEAR
  157. const showLongIntro: Ref<boolean> = ref(false)
  158. </script>
  159. <style scoped lang="scss">
  160. .banner {
  161. display: flex;
  162. flex-direction: column;
  163. justify-content: center;
  164. align-items: center;
  165. text-align: center;
  166. padding: 20px;
  167. h2 {
  168. margin: 18px 0 36px 0;
  169. border-bottom: none;
  170. }
  171. }
  172. .introduction {
  173. text-align: justify;
  174. padding: 36px 64px;
  175. border: solid 1px rgba(var(--v-theme-on-neutral), 0.4);
  176. border-radius: 16px;
  177. background: rgba(var(--v-theme-primary-alt), 0.1);
  178. margin-bottom: 36px;
  179. div {
  180. margin-bottom: 16px;
  181. }
  182. .v-btn {
  183. width: 100%;
  184. margin: 8px auto;
  185. }
  186. :deep(a) {
  187. color: rgb(var(--v-theme-on-neutral));
  188. font-weight: 900;
  189. text-decoration: none;
  190. }
  191. .logos {
  192. display: flex;
  193. flex-direction: row;
  194. max-width: 700px;
  195. margin: 0 auto;
  196. }
  197. }
  198. h3 {
  199. margin: 12px 0 24px 0;
  200. }
  201. .content {
  202. display: flex;
  203. flex-direction: row;
  204. .badges {
  205. max-width: 65%;
  206. }
  207. .cursus {
  208. max-width: 35%;
  209. padding: 24px;
  210. }
  211. }
  212. .badges {
  213. padding: 24px;
  214. >.v-container {
  215. padding: 0 !important;
  216. }
  217. .v-col {
  218. display: flex;
  219. flex-direction: column;
  220. }
  221. }
  222. .badges-section {
  223. display: flex;
  224. flex-direction: column;
  225. flex-wrap: wrap;
  226. justify-content: flex-start;
  227. margin: 12px 0;
  228. padding: 12px 6px;
  229. border: solid 1px rgba(var(--v-theme-primary-alt), 0.3);
  230. border-radius: 16px;
  231. flex: 1;
  232. h4 {
  233. font-size: 16px;
  234. margin: -24px 24px 6px 24px;
  235. padding: 0 12px;
  236. background: rgb(var(--v-theme-background));;
  237. }
  238. .v-card {
  239. margin: 6px 24px;
  240. }
  241. }
  242. </style>