From 2b97bc767ecdb40d752342032c50a7c6d397fb8a Mon Sep 17 00:00:00 2001 From: kayjaydee Date: Wed, 8 Apr 2026 14:56:53 +0200 Subject: [PATCH] feat(01-02): migrate static data files and images to Nuxt structure - 4 data files created in app/data/ with proper type imports from shared/types - 74 WebP images copied to public/images/ (including flowboard gallery) - All image paths migrated from @/assets/images/ to /images/ - FAQ uses i18n keys instead of direct text --- CLAUDE.md | 313 ----------------------- app/data/faq.ts | 19 ++ app/data/projects.ts | 105 ++++++++ app/data/techstack.ts | 72 ++++++ app/data/testimonials.ts | 79 ++++++ eslint.config.ts | 22 ++ package.json | 58 +++-- public/images/Rectangle 55.webp | Bin 0 -> 2126 bytes public/images/android.webp | Bin 0 -> 2262 bytes public/images/angular.webp | Bin 0 -> 2392 bytes public/images/archlinux.webp | Bin 0 -> 2738 bytes public/images/atom.webp | Bin 0 -> 3462 bytes public/images/bash.webp | Bin 0 -> 2322 bytes public/images/bootstrap.webp | Bin 0 -> 13140 bytes public/images/crowdin.webp | Bin 0 -> 3212 bytes public/images/css.webp | Bin 0 -> 2234 bytes public/images/debian.webp | Bin 0 -> 3890 bytes public/images/deepin.webp | Bin 0 -> 384 bytes public/images/dig.webp | Bin 0 -> 23734 bytes public/images/discord.webp | Bin 0 -> 2732 bytes public/images/discordbot.webp | Bin 0 -> 1372 bytes public/images/discordd.webp | Bin 0 -> 2736 bytes public/images/docker.webp | Bin 0 -> 4186 bytes public/images/facebook.webp | Bin 0 -> 798 bytes public/images/figma.webp | Bin 0 -> 2282 bytes public/images/filezilla.webp | Bin 0 -> 3700 bytes public/images/flowboard/flowboard_1.webp | Bin 0 -> 22014 bytes public/images/flowboard/flowboard_2.webp | Bin 0 -> 18038 bytes public/images/flowboard/flowboard_3.webp | Bin 0 -> 19640 bytes public/images/flowboard/flowboard_4.webp | Bin 0 -> 31208 bytes public/images/git.webp | Bin 0 -> 2948 bytes public/images/github.webp | Bin 0 -> 2354 bytes public/images/gitkraken.webp | Bin 0 -> 4322 bytes public/images/gitlab.webp | Bin 0 -> 2674 bytes public/images/heidisql.webp | Bin 0 -> 22132 bytes public/images/html.webp | Bin 0 -> 2434 bytes public/images/instagram.webp | Bin 0 -> 4326 bytes public/images/instagramd.webp | Bin 0 -> 3118 bytes public/images/ios.webp | Bin 0 -> 2104 bytes public/images/javascript.webp | Bin 0 -> 1282 bytes public/images/kalilinux.webp | Bin 0 -> 1144 bytes public/images/linkedin.webp | Bin 0 -> 2090 bytes public/images/linkedind.webp | Bin 0 -> 1982 bytes public/images/linux.webp | Bin 0 -> 2496 bytes public/images/logo.webp | Bin 0 -> 16480 bytes public/images/macos.webp | Bin 0 -> 3802 bytes public/images/mail.webp | Bin 0 -> 2272 bytes public/images/markdown.webp | Bin 0 -> 936 bytes public/images/messenger.webp | Bin 0 -> 2960 bytes public/images/mongodb.webp | Bin 0 -> 3662 bytes public/images/mysql.webp | Bin 0 -> 2984 bytes public/images/mysqlworkbench.webp | Bin 0 -> 3252 bytes public/images/nginx.webp | Bin 0 -> 2188 bytes public/images/nodejs.webp | Bin 0 -> 2574 bytes public/images/npm.webp | Bin 0 -> 1092 bytes public/images/postgresql.webp | Bin 0 -> 38078 bytes public/images/postman.webp | Bin 0 -> 3890 bytes public/images/primate.webp | Bin 0 -> 23686 bytes public/images/react.webp | Bin 0 -> 3538 bytes public/images/reddit.webp | Bin 0 -> 3814 bytes public/images/redis.webp | Bin 0 -> 2812 bytes public/images/ruby.webp | Bin 0 -> 22248 bytes public/images/rubyonrails.webp | Bin 0 -> 3402 bytes public/images/sequelpro.webp | Bin 0 -> 5662 bytes public/images/sqlite.webp | Bin 0 -> 2496 bytes public/images/tailwindcss.webp | Bin 0 -> 43920 bytes public/images/telegram.webp | Bin 0 -> 2812 bytes public/images/termius.webp | Bin 0 -> 1628 bytes public/images/twitter.webp | Bin 0 -> 3058 bytes public/images/twitterd.webp | Bin 0 -> 1030 bytes public/images/typescript.webp | Bin 0 -> 1270 bytes public/images/ubuntu.webp | Bin 0 -> 3682 bytes public/images/virtualtour.webp | Bin 0 -> 25538 bytes public/images/vscode.webp | Bin 0 -> 2328 bytes public/images/vuejs.webp | Bin 0 -> 1850 bytes public/images/watchos.webp | Bin 0 -> 3584 bytes public/images/wearos.webp | Bin 0 -> 1386 bytes public/images/whatsapp.webp | Bin 0 -> 2970 bytes public/images/windows.webp | Bin 0 -> 1878 bytes public/images/wordpress.webp | Bin 0 -> 5644 bytes public/images/xinko.webp | Bin 0 -> 16582 bytes 81 files changed, 329 insertions(+), 339 deletions(-) delete mode 100644 CLAUDE.md create mode 100644 app/data/faq.ts create mode 100644 app/data/projects.ts create mode 100644 app/data/techstack.ts create mode 100644 app/data/testimonials.ts create mode 100644 eslint.config.ts create mode 100644 public/images/Rectangle 55.webp create mode 100644 public/images/android.webp create mode 100644 public/images/angular.webp create mode 100644 public/images/archlinux.webp create mode 100644 public/images/atom.webp create mode 100644 public/images/bash.webp create mode 100644 public/images/bootstrap.webp create mode 100644 public/images/crowdin.webp create mode 100644 public/images/css.webp create mode 100644 public/images/debian.webp create mode 100644 public/images/deepin.webp create mode 100644 public/images/dig.webp create mode 100644 public/images/discord.webp create mode 100644 public/images/discordbot.webp create mode 100644 public/images/discordd.webp create mode 100644 public/images/docker.webp create mode 100644 public/images/facebook.webp create mode 100644 public/images/figma.webp create mode 100644 public/images/filezilla.webp create mode 100644 public/images/flowboard/flowboard_1.webp create mode 100644 public/images/flowboard/flowboard_2.webp create mode 100644 public/images/flowboard/flowboard_3.webp create mode 100644 public/images/flowboard/flowboard_4.webp create mode 100644 public/images/git.webp create mode 100644 public/images/github.webp create mode 100644 public/images/gitkraken.webp create mode 100644 public/images/gitlab.webp create mode 100644 public/images/heidisql.webp create mode 100644 public/images/html.webp create mode 100644 public/images/instagram.webp create mode 100644 public/images/instagramd.webp create mode 100644 public/images/ios.webp create mode 100644 public/images/javascript.webp create mode 100644 public/images/kalilinux.webp create mode 100644 public/images/linkedin.webp create mode 100644 public/images/linkedind.webp create mode 100644 public/images/linux.webp create mode 100644 public/images/logo.webp create mode 100644 public/images/macos.webp create mode 100644 public/images/mail.webp create mode 100644 public/images/markdown.webp create mode 100644 public/images/messenger.webp create mode 100644 public/images/mongodb.webp create mode 100644 public/images/mysql.webp create mode 100644 public/images/mysqlworkbench.webp create mode 100644 public/images/nginx.webp create mode 100644 public/images/nodejs.webp create mode 100644 public/images/npm.webp create mode 100644 public/images/postgresql.webp create mode 100644 public/images/postman.webp create mode 100644 public/images/primate.webp create mode 100644 public/images/react.webp create mode 100644 public/images/reddit.webp create mode 100644 public/images/redis.webp create mode 100644 public/images/ruby.webp create mode 100644 public/images/rubyonrails.webp create mode 100644 public/images/sequelpro.webp create mode 100644 public/images/sqlite.webp create mode 100644 public/images/tailwindcss.webp create mode 100644 public/images/telegram.webp create mode 100644 public/images/termius.webp create mode 100644 public/images/twitter.webp create mode 100644 public/images/twitterd.webp create mode 100644 public/images/typescript.webp create mode 100644 public/images/ubuntu.webp create mode 100644 public/images/virtualtour.webp create mode 100644 public/images/vscode.webp create mode 100644 public/images/vuejs.webp create mode 100644 public/images/watchos.webp create mode 100644 public/images/wearos.webp create mode 100644 public/images/whatsapp.webp create mode 100644 public/images/windows.webp create mode 100644 public/images/wordpress.webp create mode 100644 public/images/xinko.webp diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index b7a7bc9..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,313 +0,0 @@ - -## Project - -**Portfolio Killian Dalcin — Migration Nuxt 4** - -Migration complète d'un portfolio freelance de Vue 3 SPA vers Nuxt 4 avec SSR complet. Le site présente les projets, services et compétences de Killian Dalcin, développeur freelance, avec support bilingue FR/EN. L'objectif est un SEO parfait et un développement rapide via des composants prêts à l'emploi (Nuxt UI v3). - -**Core Value:** Chaque page du portfolio doit être crawlable par les moteurs de recherche sans JavaScript côté client — le SSR est la raison d'être de cette migration. - -### Constraints - -- **Stack**: Nuxt 4 + Nuxt UI v3 + Tailwind v4 — dernières versions stables -- **Coût**: Zéro dépendance payante -- **Composants**: Nuxt UI v3 en priorité sur le custom (80% suffit) -- **TypeScript**: Mode strict partout -- **Déploiement**: Docker node:22-alpine, nuxt build (SSR) ou nuxt generate (SSG) selon stratégie -- **i18n/Theme**: Persistance cookie uniquement (SSR-safe), pas de localStorage - - - -## Technology Stack - -## Languages -- TypeScript ~5.8.0 - Full application development -- JavaScript (ES modules) - Frontend runtime -- HTML5 - Document structure (in `index.html`) -- CSS - Styling with Tailwind CSS -- Markdown - Documentation (README.md) -- YAML - Configuration (implied through Dockerfile) -## Runtime -- Node.js 22 - Development and build environment -- Browser environment - Vue 3 SFC runtime -- npm - Dependency management -- Lockfile: `package-lock.json` (present and tracked) -## Frameworks -- Vue 3.5.13 - Progressive JavaScript framework for UI -- Vue Router 4.5.0 - Client-side routing with lazy-loaded pages -- Pinia 3.0.1 - State management (minimal usage - currently only `counter.ts`) -- Vue I18n 9.14.4 - Internationalization (English and French locale files in `src/locales/`) -- Vite 6.2.4 - Build tool and dev server -- Vite Plugin Vue DevTools 7.7.2 - Development utilities -- @vitejs/plugin-vue 5.2.3 - Vue 3 SFC support -- Tailwind CSS 4.1.10 - Utility-first CSS framework -- @tailwindcss/postcss 4.1.10 - PostCSS plugin for Tailwind -- PostCSS 8.5.6 - CSS transformation pipeline -- Autoprefixer 10.4.21 - Vendor prefix handling -- Terser 5.43.1 - JavaScript minification -- ESLint 9.22.0 - Linting (config: `eslint.config.ts`) -- Prettier 3.5.3 - Code formatting (config: `.prettierrc.json`) -- vue-tsc 2.2.8 - Vue component type checking -- TypeScript compiler with `type-check` npm script -- @vueuse/head 2.0.0 - Dynamic document head management for meta tags and SEO -## Key Dependencies -- vue 3.5.13 - Core framework -- vue-router 4.5.0 - SPA routing with code splitting -- pinia 3.0.1 - State management store -- vue-i18n 9.14.4 - Multi-language support -- vite 6.2.4 - Next-gen build tool with HMR -- tailwindcss 4.1.10 - Rapid UI development -- typescript 5.8.0 - Static typing and compilation -- eslint 9.22.0 - Code linting -- prettier 3.5.3 - Code formatting -- npm-run-all2 7.0.2 - Parallel script execution (used in build process) -- @tsconfig/node22 22.0.1 - TSConfig preset for Node 22 -- @types/node 22.14.0 - Node.js type definitions -- jiti 2.4.2 - CommonJS loader for TypeScript modules -## Configuration -- No `.env` files detected in source -- Google Analytics tracking ID hardcoded: `G-CDVVNFY6MV` (in `index.html`) -- Umami analytics script loaded from `umami.killiandalcin.fr` (in `index.html`) -- Google AdSense client ID hardcoded: `ca-pub-5219367964457248` (in `index.html`) -- `vite.config.ts` - Build optimizations: -- `tsconfig.json` - References `tsconfig.app.json` and `tsconfig.node.json` -- `tsconfig.app.json`: -- `eslint.config.ts` - Flat config format: -- `.prettierrc.json`: -- `postcss.config.js` - Tailwind CSS and Autoprefixer -- `tailwind.config.js` - Content scanning for `index.html` and `src/**/*.{vue,js,ts,jsx,tsx}` -## Platform Requirements -- Node.js 22+ (specified in Dockerfile) -- npm 10+ (implied by Node 22) -- TypeScript 5.8+ -- Any Unix-like shell (bash/zsh) or Windows with Node.js -- Docker - Multi-stage build with Node 22-alpine and nginx stable-alpine -- Web server: nginx (configured in `nginx.conf`) -- Deployment target: Static HTML served via nginx -- JavaScript enabled (noscript fallback message in `index.html`) -- Modern browsers with ES2020+ support (Vite default targets) -## Scripts & Commands - - - -## Conventions - -## Naming Patterns -- Vue components: PascalCase (e.g., `AppHeader.vue`, `ProjectCard.vue`) -- Composables: camelCase with `use` prefix (e.g., `useTheme.ts`, `useProjects.ts`) -- Utility/config files: camelCase (e.g., `site.ts`, `techstack.ts`) -- Data files: camelCase (e.g., `testimonials.ts`, `faq.ts`) -- Type definitions: camelCase in `types/index.ts` -- All functions use camelCase (e.g., `toggleTheme`, `openGallery`, `getImageUrl`) -- Composables are named with `use` prefix: `useTheme()`, `useGallery()`, `useSeo()` -- Getter functions use `get` prefix: `getTheme()`, `getImageUrl()` -- Boolean functions/computed use `is`/`has` prefix: `isDark`, `hasNext`, `isOpen` -- Handler functions use verb + `Handler`: `toggleTheme`, `openGallery`, `closeGallery` -- Refs and computed properties: camelCase (e.g., `isDark`, `currentIndex`, `isOpen`) -- Interfaces and types: PascalCase (e.g., `Props`, `SeoOptions`, `Theme`) -- Constants: UPPER_SNAKE_CASE for config constants (not extensively used in codebase) -- Private/module state: camelCase prefixed with `_` if truly private -- Type aliases: PascalCase (e.g., `type Theme = 'light' | 'dark'`) -- Interface names: PascalCase (e.g., `interface Props`, `interface SeoOptions`) -- Props interfaces: Always named `Props` (e.g., in `