Frontend du portfolio personnel de Charles Lindecker, construit avec Angular 20, SSR et une direction visuelle fortement orientee experience. Le projet combine pages editoriales, sequences d'ouverture, animations GSAP, audio d'interface et rendu serveur avec prerender.
Le site expose plusieurs parcours distincts :
- une home immersive avec sections hero, resume, projets et parcours
- une page
resumemise en scene comme une fiche de personnage interactive - une page
projectsavec filtres, timeline, modal de detail et lightbox d'images - des routes d'ouverture dediees qui rejouent les sequences d'introduction
Le projet est pense comme une vitrine technique autant qu'un portfolio :
- architecture Angular moderne basee sur des composants standalone
- metadata SEO route par route
- SSR + prerender pour la livraison
- gestion audio centralisee
- medias responsives centralises dans
src/app/imgSources - animations GSAP pour les introductions, hovers et reveals
- Angular 20
- TypeScript 5
- Angular SSR
- Express
- GSAP
- PostCSS
- Tailwind CSS 4 dans la toolchain
- Karma + Jasmine pour les tests unitaires
- Node.js 20+
- npm
npm installnpm start
npm run build
npm run watch
npm run test
npm run serve:ssr:front-portfolioDetails :
npm startlance le serveur de dev Angular surhttp://localhost:4200npm run buildgenere le build applicatif SSR dansdist/front-portfolionpm run watchrebuild en continu en configuration developmentnpm run testlance la suite Karma/Jasminenpm run serve:ssr:front-portfoliosert le build SSR genere localement
src/
app/
components/
assets/ composants UI reutilisables
misc/ navigation, footer, openings, resume
page/ pages routees
directives/ comportements UI transverses
imgSources/ catalogues de medias responsives
services/ audio, meta, logique transversale
main.ts
main.server.ts
server.ts
public/ assets servis tels quels
Organisation fonctionnelle principale :
src/app/components/page/homeporte la page d'accueilsrc/app/components/page/projectsporte le listing complet des projets, le filtrage et la modalsrc/app/components/misc/opening-resumecontient l'intro du resume et l'ecranresumesrc/app/services/meta-service.tspilote les balises SEO, Open Graph, Twitter et JSON-LDsrc/app/services/audio-service.tscentralise l'enregistrement, la lecture, le mute et le volume des sonssrc/app/directives/reveal-on-scroll.tsfournit les reveals au scroll bases surIntersectionObserver+ GSAP
Les routes principales definies dans src/app/app.routes.ts sont :
/: accueil principal du portfolio/resume: CV interactif / fiche resume/projects: liste complete des projets avec filtres et details/works: page parcours, actuellement en construction/opening-home: sequence d'ouverture avant redirection vers l'accueil/opening-resume: sequence d'ouverture dediee a l'univers du resume
Chaque route configure ses propres metadonnees :
titledescriptioncanonicalrobots- Open Graph
- Twitter cards
- donnees structurees Schema.org
Le projet utilise le builder @angular/build:application avec :
outputMode: "server"server: "src/main.server.ts"ssr.entry: "src/server.ts"
En production, Angular prerender les routes statiques. Le build genere :
- les bundles browser
- les bundles server
- les routes statiques prerenderes
Le service de metadata met a jour dynamiquement :
- la meta description
- la balise canonical
- les balises robots
- les balises Open Graph
- les balises Twitter
- un script
application/ld+jsonunique pour le schema courant
Les composants n'embarquent pas directement leurs chemins d'assets. Les sources sont centralisees dans src/app/imgSources, notamment :
shared.sources.tsopening.sources.tsresum.sources.tsprojects/*.source.ts
Ce choix permet de :
- mutualiser les variantes responsive
- garder les composants declaratifs
- changer un asset sans recabler plusieurs templates
- conserver une convention unique pour
app-responsive-picture
L'audio est enregistre dans le composant racine via src/app/app.ts, puis pilote par src/app/services/audio-service.ts.
Le service gere :
- les sons persistants et one-shot
- le volume maitre
- le mute global
- la persistence des preferences dans
localStorage - le comptage des sons actifs
Les interactions UI declenchent ensuite les effets via composants ou directives, par exemple PlaySoundOnClickDirective.
Le projet repose sur deux mecanismes principaux :
- GSAP pour les introductions, transitions d'etat et micro-interactions
RevealOnScrollDirectivepour les apparitions au scroll
Points notables :
- les composants du
resumeheritent d'une base commune pour leurs animations d'entree - les openings sont orchestres via services et etats dedies
- les hovers et press effects sont separes dans des fichiers
*.animations.ts
Si tu modifies une animation interactive, verifie bien les collisions entre tween d'entree et tween de hover sur les memes proprietes (opacity, x, y, scale, rotate).
La page projects s'appuie sur src/app/components/page/projects/projects.state.ts comme source de verite.
Elle fournit :
- les projets affiches
- les filtres par categorie
- les tags
- la stack
- les contenus detailles de la modal
- les images du carousel/lightbox
Le composant src/app/components/page/projects/projects.ts gere ensuite :
- le filtrage derive
- l'ouverture/fermeture de la modal
- la navigation dans les images
- le lock du scroll du
bodypendant l'ouverture d'une modal
Quelques conventions implicites du projet :
- privilegier les composants standalone
- centraliser les medias dans
imgSourcesavant de les brancher aux composants - isoler les animations complexes dans des fichiers
*.animations.ts - conserver la logique SEO au niveau des routes
- faire attention aux budgets Angular definis dans
angular.json
Les budgets de build en production sont actuellement :
initialwarning a500kBanyComponentStylewarning a4kB
Les tests unitaires existent au format *.spec.ts sur les composants, directives et services principaux.
Execution :
npm run test- Le projet est visuel et anime : une optimisation ne doit pas casser l'intention UI.
- Certaines interactions combinent audio, animation et SSR ; il faut donc garder les gardes
isPlatformBrowseren place. - Toute nouvelle route devrait definir ses metadonnees completement pour rester coherente avec le reste du site.
- Les assets du dossier
public/sont publies tels quels ; garde une nomenclature propre et des tailles adaptees.
Workflow standard :
npm run build
npm run serve:ssr:front-portfolioLe serveur Node sert alors la sortie construite depuis :
dist/front-portfolio/browserdist/front-portfolio/server
Ce projet est un frontend Angular SSR de portfolio, structure autour d'une home editoriale, d'un ecran resume gamifie, d'une page projets riche et d'un socle transverse pour le SEO, l'audio, les animations et les medias responsives.