From 147d35fdaded4850c6b6e5b15cd8110da5c461dd Mon Sep 17 00:00:00 2001 From: Xavier Saliniere Date: Thu, 28 May 2026 13:42:43 -0400 Subject: [PATCH 1/2] feat: add resume --- .gitignore | 5 +- .gitmodules | 3 ++ external/resume | 1 + src/app/[locale]/resume/page.tsx | 25 +++++++++ src/components/cmd-outputs/ResumeOutput.tsx | 9 ++++ src/components/resume/Resume.tsx | 57 +++++++++++++++++++++ src/constants/commands.ts | 13 +++-- src/constants/routes.ts | 1 + src/i18n/messages/en.json | 12 ++++- src/i18n/messages/fr.json | 12 ++++- src/types/terminal.ts | 1 + 11 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 .gitmodules create mode 160000 external/resume create mode 100644 src/app/[locale]/resume/page.tsx create mode 100644 src/components/cmd-outputs/ResumeOutput.tsx create mode 100644 src/components/resume/Resume.tsx diff --git a/.gitignore b/.gitignore index f6675d7..a8443b4 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,7 @@ next-env.d.ts .agents .kilocode .playwright-mcp -skills-lock.json \ No newline at end of file +skills-lock.json + +# Resume (symlink to submodule) +/public/resume \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ab1e027 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/resume"] + path = external/resume + url = git@github.com:nipsysdev/resume.git diff --git a/external/resume b/external/resume new file mode 160000 index 0000000..da4130c --- /dev/null +++ b/external/resume @@ -0,0 +1 @@ +Subproject commit da4130c594ec11891ed33e67b6670210387c0e97 diff --git a/src/app/[locale]/resume/page.tsx b/src/app/[locale]/resume/page.tsx new file mode 100644 index 0000000..9188419 --- /dev/null +++ b/src/app/[locale]/resume/page.tsx @@ -0,0 +1,25 @@ +import Resume from '@/components/resume/Resume'; +import StaticOutput from '@/components/StaticOutput'; +import TerminalEmulator from '@/components/terminal/TerminalEmulator'; +import type { RouteData } from '@/types/routing'; +import { Command } from '@/types/terminal'; +import { setPageMeta } from '@/utils/metadata-utils'; + +interface ResumePageProps { + params: Promise<{ locale: string }>; +} + +export const generateMetadata = async (routeData: RouteData) => + await setPageMeta(routeData, 'resume'); + +export default async function ResumePage({ params }: ResumePageProps) { + await params; + return ( + <> + + + + + + ); +} diff --git a/src/components/cmd-outputs/ResumeOutput.tsx b/src/components/cmd-outputs/ResumeOutput.tsx new file mode 100644 index 0000000..cf26e24 --- /dev/null +++ b/src/components/cmd-outputs/ResumeOutput.tsx @@ -0,0 +1,9 @@ +import { Component } from 'react'; +import type { CommandOutputProps } from '@/types/terminal'; +import Resume from '../resume/Resume'; + +export default class ResumeOutput extends Component { + render() { + return ; + } +} diff --git a/src/components/resume/Resume.tsx b/src/components/resume/Resume.tsx new file mode 100644 index 0000000..c9ec901 --- /dev/null +++ b/src/components/resume/Resume.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { Badge, Button, Typography } from '@nipsys/lsd'; +import { useLocale, useTranslations } from 'next-intl'; + +const RESUME_PATHS = { + en: '/resume/Xavier-SALINIERE_resume.EN.pdf', + fr: '/resume/Xavier-SALINIERE_resume.FR.pdf', +}; + +export default function Resume() { + const locale = useLocale(); + const t = useTranslations('Terminal.cmds.resume'); + + const currentLocale = locale === 'fr' ? 'fr' : 'en'; + const currentPdfPath = RESUME_PATHS[currentLocale]; + + return ( +
+
+ {t('title')} + + {t('subtitle')} + +
+ +
+ + {t('viewing')} {currentLocale.toUpperCase()} {t('version')} + +
+ + + +
+
+