--- import BaseLayout from '../layouts/BaseLayout.astro'; import Eyebrow from '../components/Eyebrow.astro'; import { Badge, Button } from '@unkn0wndo3s/nova-design-system'; import { breadcrumbLd, profilePageLd } from '../lib/seo'; import { getLocaleFromUrl, useTranslations, localizePath } from '../i18n'; import type { Localized } from '../data/projects'; const locale = getLocaleFromUrl(Astro.url); const t = useTranslations(locale); interface Step { period: Localized; role: Localized; place: string; detail: Localized; } const steps: Step[] = [ { period: { fr: 'Sept. 2025 - Août 2026', en: 'Sept. 2025 - Aug. 2026' }, role: { fr: 'Développeur full-stack en alternance', en: 'Full-stack developer (apprenticeship)' }, place: 'Legrand France, Limoges', detail: { fr: "Développement du DAN, application web interne pour les ateliers de production : refonte du module de gestion des utilisateurs (Vue.js/TypeScript, export CSV) et du module de statistiques avec composants graphiques sur mesure. Back-end Node.js/Express.", en: 'Development of DAN, an internal web app for production workshops: rework of the user management module (Vue.js/TypeScript, CSV export) and of the statistics module with custom chart components. Node.js/Express back-end.', }, }, { period: { fr: 'Avril - Août 2025', en: 'April - Aug. 2025' }, role: { fr: "Stage puis job d'été", en: 'Internship, then summer job' }, place: 'Legrand France, Limoges', detail: { fr: "Premiers travaux sur le DAN : montée en compétence sur la base de code, premières fonctionnalités livrées en production. L'expérience s'est prolongée en alternance sur la même application.", en: 'First work on DAN: ramping up on the codebase, first features shipped to production. The experience continued as an apprenticeship on the same application.', }, }, { period: { fr: '2023 - 2026', en: '2023 - 2026' }, role: { fr: 'BUT MMI, parcours Développement Web (DWDI)', en: 'BUT MMI degree, Web Development track (DWDI)' }, place: 'IUT du Limousin', detail: { fr: "Formation en développement web et dispositifs interactifs : front-end, back-end, UX, gestion de projet. Diplôme obtenu en 2026.", en: 'Training in web development and interactive systems: front-end, back-end, UX, project management. Graduating in 2026.', }, }, ]; interface Value { title: Localized; body: Localized; } const values: Value[] = [ { title: { fr: 'Livrer, pas prototyper', en: 'Ship, not prototype' }, body: { fr: 'Un projet est terminé quand il tourne en production avec sa CI. Mon design system est sur npm, mon infra héberge ce site : tout ce que je montre est réellement en service.', en: 'A project is done when it runs in production with its CI. My design system is on npm, my infrastructure hosts this site: everything I show is actually in service.', }, }, { title: { fr: 'Du composant au serveur', en: 'From component to server' }, body: { fr: "Je conçois l'interface, l'API qui la sert et la machine qui l'héberge. Cette vision complète évite les frictions entre front, back et ops.", en: 'I design the interface, the API that serves it and the machine that hosts it. That end-to-end view removes friction between front, back and ops.', }, }, { title: { fr: 'Réutilisable par défaut', en: 'Reusable by default' }, body: { fr: "Tokens, composants, pipelines : je factorise ce qui se répète. C'est ce qui m'a mené à construire Nova Design System plutôt que de copier-coller des styles.", en: 'Tokens, components, pipelines: I factor out what repeats. That mindset is what led me to build Nova Design System instead of copy-pasting styles.', }, }, ]; const crumbs = [ { name: t('nav.home'), url: localizePath('/', locale) }, { name: t('nav.about'), url: localizePath('/about', locale) }, ]; const pageUrl = new URL(Astro.url.pathname, Astro.site ?? 'https://louis-potevin.dev').href; const jsonLd = [breadcrumbLd(crumbs), profilePageLd(pageUrl)]; ---

{t('about.title')}

{t('about.lead')}

{t('avail.badge')} {t('avail.line')} · {t('avail.where')}

{t('about.exp.eyebrow')}

{t('about.exp.title')}

    {steps.map((step) => (
  1. {step.period[locale]}

    {step.role[locale]}

    {step.place}

    {step.detail[locale]}

  2. ))}
{t('about.values.eyebrow')}

{t('about.values.title')}