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/README.md b/README.md index 7f7059f..c520e33 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ elements. git clone https://github.com/nipsysdev/site.git cd site +# Initialize submodules (for resume PDFs) +git submodule update --init --recursive + # Install dependencies pnpm install @@ -91,6 +94,7 @@ The site uses a terminal emulator interface. Available commands: | ------------ | --------------------------------------- | | `welcome` | Display welcome message | | `whoami` | About me - bio, badges, GPG fingerprint | +| `resume` | View/download resume (EN/FR) | | `contact` | Contact information and social links | | `status` | Self-hosted services health status | | `help` | List available commands | 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')} + +
+ +
+ + +
+ +
+
+