Files
portfolio/README.md
T

95 lines
3.4 KiB
Markdown
Raw Normal View History

# louis-potevin.dev
2026-05-13 13:08:06 +00:00
Professional portfolio of **Louis Potevin** - full-stack developer.
Static multi-page website built with **Astro + TypeScript + Sass**, styled
**exclusively** by the in-house design system **`@unkn0wndo3s/nova-design-system`**
(tokens, components), featuring a 3D space background controlled via scrolling.
---
## Getting Started
```bash
npm install
npm run dev # dev server → http://localhost:4321
npm run build # static build → ./dist
npm run preview # preview the build
```
> **Installation Note.** `@lucide/astro` has not yet declared its
compatibility with Astro 7 in its `peerDependencies`. The **`.npmrc`**
> file therefore enables `legacy-peer-deps=true` so that `npm install` succeeds.
> Functionality is not affected.
---
## Structure
```
src/
├─ data/
│ ├─ site.ts # profile + links (single source of truth)
│ └─ projects.ts # project content
├─ layouts/
│ └─ BaseLayout.astro # NDS styles + 3D background + nav + footer + HUD
├─ components/
│ ├─ scene/scene.ts # Three.js background (stars, nebula, ambient asteroid)
│ ├─ SpaceBackground.astro
│ ├─ ProjectCard.astro # project card (NDS Card component)
│ ├─ SiteNav / SiteFooter / Eyebrow / TechIcon / BrandLinkedin
└─ pages/
├─ index.astro # home
├─ work/index.astro # all projects
├─ work/[slug].astro # project details (getStaticPaths)
├─ about.astro
└─ contact.astro
```
## Design system
Components come from `@unkn0wndo3s/nova-design-system` :
`import { Button, Card, Badge, Navbar, Breadcrumb, TextField, Select, ... }`.
Global styles and tokens : `import '@unkn0wndo3s/nova-design-system/styles'`
(done once in `BaseLayout.astro`).
The package ships its raw `.astro`/`.scss` source files - Astro compiles them
on the consumer side. Since its `exports` field does not publish token partials
individually, the typography partial is exposed via a Sass
`loadPath` (see `astro.config.mjs`) and then re-exported by
`src/styles/_type.scss` (mixins `text-sm``text-5xl`).
Icons : `@lucide/astro` (UI) and `simple-icons-astro` (tech). Since LinkedIn is
no longer distributed by either of them (trademark policy), its glyph is provided
locally in `BrandLinkedin.astro`.
## 3D Background
An ambient asteroid slowly rotates and floats in the background, in the middle of a
starfield and a discrete nebula (Three.js). It does not follow scroll actions
and produces no engine flame effects: it is a backdrop, not the subject.
- **Without WebGL** : the canvas hides cleanly, the site remains readable.
## SEO
Meticulous search engine optimization, pre-configured:
- Per-page metadata (title, description, keywords), canonical URLs;
- Open Graph + Twitter Card with `public/og.png` (1200×630) ;
- Structured data JSON-LD (`Person` + `WebSite`) ;
- `sitemap-index.xml` (via `@astrojs/sitemap`) + `public/robots.txt`.
Remember to update `og.png` if you change your job title, and confirm the
links in `site.ts` (used in the `sameAs` property of the structured data).
## Contact Form
The site is 100% static: the form in `contact.astro` does not have a
backend. The **Send** button opens the user's mail client with a
pre-filled message (`mailto:`). For a server-side submission, connect a service
(Formspree, Resend, edge function…) to the `#cf-send` button.
---
Built with Astro + Nova Design System.