diff --git a/index.html b/index.html index 9505c0f..2e47923 100644 --- a/index.html +++ b/index.html @@ -1,19 +1,82 @@ - + - - - - + + + Killian - Full Stack Developer | Vue.js, React, Node.js Expert + + content="Professional Full Stack Developer specializing in modern web development with Vue.js, React, Node.js. Expert in Discord bots, web applications, and custom software solutions. Available for freelance projects."> + + + + + + - - Killian - Développeur Full Stack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -21,6 +84,15 @@
+ + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f62f58e..84e91f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "postcss": "^8.5.6", "prettier": "3.5.3", "tailwindcss": "^4.1.10", + "terser": "^5.43.1", "typescript": "~5.8.0", "vite": "^6.2.4", "vite-plugin-vue-devtools": "^7.7.2", @@ -1330,6 +1331,17 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -3001,6 +3013,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -3095,6 +3114,13 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5356,6 +5382,16 @@ "node": ">=18" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5365,6 +5401,17 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/speakingurl": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", @@ -5486,6 +5533,25 @@ "node": ">=18" } }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", diff --git a/package.json b/package.json index d1bfeeb..6f487da 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "postcss": "^8.5.6", "prettier": "3.5.3", "tailwindcss": "^4.1.10", + "terser": "^5.43.1", "typescript": "~5.8.0", "vite": "^6.2.4", "vite-plugin-vue-devtools": "^7.7.2", diff --git a/public/portfolio-preview.jpg b/public/portfolio-preview.jpg new file mode 100644 index 0000000..890189f Binary files /dev/null and b/public/portfolio-preview.jpg differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..f768ded --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,33 @@ +# Robots.txt for Killian Portfolio +# https://killian-portfolio.com + +# Allow all crawlers +User-agent: * +Allow: / +Disallow: /api/ +Disallow: /admin/ +Disallow: /.git/ +Disallow: /node_modules/ + +# Sitemap location +Sitemap: https://killian-portfolio.com/sitemap.xml + +# Crawl-delay for respectful crawling +Crawl-delay: 1 + +# Special rules for major search engines +User-agent: Googlebot +Allow: / +Crawl-delay: 0 + +User-agent: Bingbot +Allow: / +Crawl-delay: 0 + +User-agent: Slurp +Allow: / +Crawl-delay: 1 + +User-agent: DuckDuckBot +Allow: / +Crawl-delay: 1 \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..aabd37f --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,45 @@ +{ + "name": "Killian - Full Stack Developer Portfolio", + "short_name": "Killian Portfolio", + "description": "Professional Full Stack Developer specializing in Vue.js, React, Node.js. Expert in Discord bots, web applications, and custom software solutions.", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#2563eb", + "orientation": "portrait-primary", + "icons": [ + { + "src": "/favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "/favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + }, + { + "src": "/favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "categories": [ + "productivity", + "developer", + "business" + ], + "lang": "en-US" +} \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..b3216a4 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,89 @@ + + + + + + https://killian-portfolio.com/ + 2025-06-22T00:00:00+00:00 + weekly + 1.0 + + + + + https://killian-portfolio.com/projects + 2025-06-22T00:00:00+00:00 + weekly + 0.9 + + + + + https://killian-portfolio.com/about + 2025-06-22T00:00:00+00:00 + monthly + 0.8 + + + + + https://killian-portfolio.com/contact + 2025-06-22T00:00:00+00:00 + monthly + 0.8 + + + + + https://killian-portfolio.com/fiverr + 2025-06-22T00:00:00+00:00 + weekly + 0.8 + + + + + https://killian-portfolio.com/project/virtual-tour + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + + https://killian-portfolio.com/project/xinko + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + + https://killian-portfolio.com/project/image-manipulation + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + + https://killian-portfolio.com/project/primate-web-admin + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + + https://killian-portfolio.com/project/instagram-bot + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + + https://killian-portfolio.com/project/crowdin-status-bot + 2025-06-22T00:00:00+00:00 + monthly + 0.7 + + + \ No newline at end of file diff --git a/src/components/ProjectCard.vue b/src/components/ProjectCard.vue index 69be340..bcf9d4e 100644 --- a/src/components/ProjectCard.vue +++ b/src/components/ProjectCard.vue @@ -34,36 +34,38 @@ const translatedCategory = computed(() => {