diff --git a/env.d.ts b/env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/eslint.config.ts b/eslint.config.ts deleted file mode 100644 index 20475f8..0000000 --- a/eslint.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { globalIgnores } from 'eslint/config' -import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' -import pluginVue from 'eslint-plugin-vue' -import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' - -// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: -// import { configureVueProject } from '@vue/eslint-config-typescript' -// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) -// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup - -export default defineConfigWithVueTs( - { - name: 'app/files-to-lint', - files: ['**/*.{ts,mts,tsx,vue}'], - }, - - globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), - - pluginVue.configs['flat/essential'], - vueTsConfigs.recommended, - skipFormatting, -) diff --git a/index.html b/index.html deleted file mode 100644 index 2ad6184..0000000 --- a/index.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - Full Stack Developer Freelance Vue.js React Node.js | Killian Dalcin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - \ No newline at end of file diff --git a/nginx.conf b/nginx.conf deleted file mode 100644 index 2c24c86..0000000 --- a/nginx.conf +++ /dev/null @@ -1,18 +0,0 @@ -server { - listen 80; - listen [::]:80; - server_name localhost; - - root /usr/share/nginx/html; - index index.html index.htm; - - location / { - try_files $uri $uri/ /index.html; - } - - # Optional: Add error pages - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } -} \ No newline at end of file diff --git a/old/projects.info b/old/projects.info deleted file mode 100644 index b71d04e..0000000 --- a/old/projects.info +++ /dev/null @@ -1,70 +0,0 @@ -cards = [ - { - title: "Virtual Tour", - image: require("../assets/images/virtualtour.png"), - description: "My high school teacher and me had an idea to create a Virtual tour with 360° vidéos to allow everyone to visit the school from the web.", - buttons: [ - { - title: "Visit", - link: "https://www.lycee-chabanne16.fr/visites/BACSN/index.htm", - }, - ], - }, - { - title: "Xinko", - image: require("../assets/images/xinko.png"), - description: "Xinko is a multipurpose bot that can help you create and manage your discord servers with ease and fun. It has many commands and features.", - buttons: [ - { - title: "Website", - link: "https://google.com", - }, - { - title: "Invite", - link: "https://discord.com/api/oauth2/authorize?client_id=1035571329866407976&permissions=292288982151&scope=applications.commands%20bot", - }, - ], - }, - { - title: "Image Manipulation", - image: require("../assets/images/dig.png"), - description: "Discord Image Generation: NPM package for code-based image manipulation. Originally an API, now open-source.", - buttons: [ - { - title: "Repository", - link: "https://git.mrkayjaydee.xyz/Mr-KayJayDee/discord-image-generation", - }, - { - title: "NPM Package", - link: "https://www.npmjs.com/package/discord-image-generation", - }, - ], - }, - { - title: "Primate Web Admin", - image: require("../assets/images/primate.png"), - description: "Primate Web Admin is a Web interface to manage Primate that is a Munki-like deployment tool for Windows.", - }, - { - title: "Instagram Bot", - image: require("../assets/images/instagram.png"), - description: "Fully functional Instagram bot using Insta.js by androz2091. It has many commands. Generate images with commands like: !stonk or !invert.", - buttons: [ - { - title: "Repository", - link: "https://git.mrkayjaydee.xyz/Mr-KayJayDee/instagram-bot", - }, - ], - }, - { - title: "Crowdin Status Bot", - image: require("../assets/images/crowdin.png"), - description: "A bot that fetches Crowdin translation status and updates Discord messages with the latest status. Stay informed on progress!", - buttons: [ - { - title: "Repository", - link: "https://git.mrkayjaydee.xyz/Mr-KayJayDee/discord-crowdin-status", - }, - ], - }, - ]; \ No newline at end of file diff --git a/old/techstack.json b/old/techstack.json deleted file mode 100644 index c50cb7c..0000000 --- a/old/techstack.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "programming": [ - { - "name": "JavaScript", - "level": "Intermediate", - "image": "javascript.png" - }, - { - "name": "Bash", - "level": "Intermediate", - "image": "bash.png" - }, - { - "name": "Markdown", - "level": "Beginner", - "image": "markdown.png" - }, - { - "name": "TypeScript", - "level": "Intermediate", - "image": "typescript.png" - }, - { - "name": "Node.js", - "level": "Intermediate", - "image": "nodejs.png" - }, - { - "name": "Nginx", - "level": "Intermediate", - "image": "nginx.png" - } - ], - "front": [ - { - "name": "Angular", - "level": "Intermediate", - "image": "angular.png" - }, - { - "name": "HTML", - "level": "Intermediate", - "image": "HTML.png" - }, - { - "name": "CSS", - "level": "Beginner", - "image": "css.png" - }, - { - "name": "React", - "level": "Intermediate", - "image": "react.png" - }, - { - "name": "Vue.JS", - "level": "Intermediate", - "image": "vuejs.png" - }, - { - "name": "Figma", - "level": "Intermediate", - "image": "figma.png" - }, - { - "name": "Wordpress", - "level": "Intermediate", - "image": "wordpress.png" - } - ], - "database": [ - { - "name": "MongoDB", - "level": "Intermediate", - "image": "mongodb.png" - }, - { - "name": "Redis", - "level": "Intermediate", - "image": "redis.png" - }, - { - "name": "MYSQL", - "level": "Intermediate", - "image": "mysql.png" - }, - { - "name": "SQLite", - "level": "Intermediate", - "image": "sqlite.png" - } - ], - "devtools": [ - { - "name": "Docker", - "level": "Intermediate", - "image": "docker.png" - }, - { - "name": "Discord Bot", - "level": "Intermediate", - "image": "discordbot.png" - }, - { - "name": "Postman", - "level": "Intermediate", - "image": "postman.png" - }, - { - "name": "FileZilla", - "level": "Beginner", - "image": "filezilla.png" - }, - { - "name": "Termius", - "level": "Intermediate", - "image": "termius.png" - }, - { - "name": "GitHub", - "level": "Intermediate", - "image": "github.png" - }, - { - "name": "Git", - "level": "Intermediate", - "image": "git.png" - }, - { - "name": "npm", - "level": "Intermediate", - "image": "npm.png" - }, - { - "name": "GitLab", - "level": "Intermediate", - "image": "gitlab.png" - }, - { - "name": "Visual Studio Code", - "level": "Intermediate", - "image": "vscode.png" - }, - { - "name": "Atom", - "level": "Intermediate", - "image": "atom.png" - }, - { - "name": "DB Browser for SQLite", - "level": "Beginner", - "image": "sqlitebrowser.png" - }, - { - "name": "HeidiSQL", - "level": "Intermediate", - "image": "heidisql.png" - }, - { - "name": "MySQL Workbench", - "level": "Intermediate", - "image": "mysqlworkbench.png" - }, - { - "name": "GitKraken", - "level": "Intermediate", - "image": "gitkraken.png" - } - ], - "operating_systems": [ - { - "name": "Linux", - "level": "Intermediate", - "image": "linux.png" - }, - { - "name": "Debian", - "level": "Intermediate", - "image": "debian.png" - }, - { - "name": "Arch Linux", - "level": "Intermediate", - "image": "archlinux.png" - }, - { - "name": "Ubuntu", - "level": "Intermediate", - "image": "ubuntu.png" - }, - { - "name": "Kali Linux", - "level": "Intermediate", - "image": "kalilinux.png" - }, - { - "name": "macOS", - "level": "Intermediate", - "image": "macos.png" - }, - { - "name": "Windows", - "level": "Intermediate", - "image": "windows.png" - }, - { - "name": "Deepin", - "level": "Intermediate", - "image": "deepin.png" - }, - { - "name": "Android", - "level": "Intermediate", - "image": "android.png" - }, - { - "name": "Wear OS", - "level": "Intermediate", - "image": "wearos.png" - }, - { - "name": "watchOS", - "level": "Intermediate", - "image": "watchos.png" - }, - { - "name": "iOS", - "level": "Intermediate", - "image": "ios.png" - } - ], - "socials": [ - { - "name": "Discord", - "level": "Intermediate", - "image": "discord.png" - }, - { - "name": "Instagram", - "level": "Intermediate", - "image": "instagram.png" - }, - { - "name": "LinkedIn", - "level": "Intermediate", - "image": "linkedin.png" - }, - { - "name": "Twitter", - "level": "Intermediate", - "image": "twitter.png" - }, - { - "name": "Reddit", - "level": "Intermediate", - "image": "reddit.png" - }, - { - "name": "Messenger", - "level": "Intermediate", - "image": "messenger.png" - }, - { - "name": "WhatsApp", - "level": "Intermediate", - "image": "whatsapp.png" - }, - { - "name": "Facebook", - "level": "Intermediate", - "image": "facebook.png" - }, - { - "name": "Telegram", - "level": "Intermediate", - "image": "telegram.png" - } - ] -} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index 0aef620..0000000 --- a/src/App.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/src/assets/images/Rectangle 55.webp b/src/assets/images/Rectangle 55.webp deleted file mode 100644 index 7e9fbb1..0000000 Binary files a/src/assets/images/Rectangle 55.webp and /dev/null differ diff --git a/src/assets/images/android.webp b/src/assets/images/android.webp deleted file mode 100644 index 94acd8c..0000000 Binary files a/src/assets/images/android.webp and /dev/null differ diff --git a/src/assets/images/angular.webp b/src/assets/images/angular.webp deleted file mode 100644 index 177a5d1..0000000 Binary files a/src/assets/images/angular.webp and /dev/null differ diff --git a/src/assets/images/archlinux.webp b/src/assets/images/archlinux.webp deleted file mode 100644 index d036f86..0000000 Binary files a/src/assets/images/archlinux.webp and /dev/null differ diff --git a/src/assets/images/atom.webp b/src/assets/images/atom.webp deleted file mode 100644 index 6b9840f..0000000 Binary files a/src/assets/images/atom.webp and /dev/null differ diff --git a/src/assets/images/bash.webp b/src/assets/images/bash.webp deleted file mode 100644 index 1a3c44e..0000000 Binary files a/src/assets/images/bash.webp and /dev/null differ diff --git a/src/assets/images/bootstrap.webp b/src/assets/images/bootstrap.webp deleted file mode 100644 index 07831e4..0000000 Binary files a/src/assets/images/bootstrap.webp and /dev/null differ diff --git a/src/assets/images/crowdin.webp b/src/assets/images/crowdin.webp deleted file mode 100644 index f79491d..0000000 Binary files a/src/assets/images/crowdin.webp and /dev/null differ diff --git a/src/assets/images/css.webp b/src/assets/images/css.webp deleted file mode 100644 index 612101d..0000000 Binary files a/src/assets/images/css.webp and /dev/null differ diff --git a/src/assets/images/debian.webp b/src/assets/images/debian.webp deleted file mode 100644 index d1f061a..0000000 Binary files a/src/assets/images/debian.webp and /dev/null differ diff --git a/src/assets/images/deepin.webp b/src/assets/images/deepin.webp deleted file mode 100644 index 4f63067..0000000 Binary files a/src/assets/images/deepin.webp and /dev/null differ diff --git a/src/assets/images/dig.webp b/src/assets/images/dig.webp deleted file mode 100644 index ba07a5c..0000000 Binary files a/src/assets/images/dig.webp and /dev/null differ diff --git a/src/assets/images/discord.webp b/src/assets/images/discord.webp deleted file mode 100644 index bddbcc9..0000000 Binary files a/src/assets/images/discord.webp and /dev/null differ diff --git a/src/assets/images/discordbot.webp b/src/assets/images/discordbot.webp deleted file mode 100644 index d570d82..0000000 Binary files a/src/assets/images/discordbot.webp and /dev/null differ diff --git a/src/assets/images/discordd.webp b/src/assets/images/discordd.webp deleted file mode 100644 index da05cdf..0000000 Binary files a/src/assets/images/discordd.webp and /dev/null differ diff --git a/src/assets/images/docker.webp b/src/assets/images/docker.webp deleted file mode 100644 index 1c9b69c..0000000 Binary files a/src/assets/images/docker.webp and /dev/null differ diff --git a/src/assets/images/facebook.webp b/src/assets/images/facebook.webp deleted file mode 100644 index cb43dc1..0000000 Binary files a/src/assets/images/facebook.webp and /dev/null differ diff --git a/src/assets/images/figma.webp b/src/assets/images/figma.webp deleted file mode 100644 index 15a5e7c..0000000 Binary files a/src/assets/images/figma.webp and /dev/null differ diff --git a/src/assets/images/filezilla.webp b/src/assets/images/filezilla.webp deleted file mode 100644 index f3ff8fd..0000000 Binary files a/src/assets/images/filezilla.webp and /dev/null differ diff --git a/src/assets/images/fiverr/discord_bot.webp b/src/assets/images/fiverr/discord_bot.webp deleted file mode 100644 index 85a6c36..0000000 Binary files a/src/assets/images/fiverr/discord_bot.webp and /dev/null differ diff --git a/src/assets/images/fiverr/minecraft_plugin.webp b/src/assets/images/fiverr/minecraft_plugin.webp deleted file mode 100644 index 3cb08a3..0000000 Binary files a/src/assets/images/fiverr/minecraft_plugin.webp and /dev/null differ diff --git a/src/assets/images/fiverr/telegram_bot.webp b/src/assets/images/fiverr/telegram_bot.webp deleted file mode 100644 index ebc9176..0000000 Binary files a/src/assets/images/fiverr/telegram_bot.webp and /dev/null differ diff --git a/src/assets/images/fiverr/website.webp b/src/assets/images/fiverr/website.webp deleted file mode 100644 index d4d1d0e..0000000 Binary files a/src/assets/images/fiverr/website.webp and /dev/null differ diff --git a/src/assets/images/flowboard/flowboard_1.webp b/src/assets/images/flowboard/flowboard_1.webp deleted file mode 100644 index 927b343..0000000 Binary files a/src/assets/images/flowboard/flowboard_1.webp and /dev/null differ diff --git a/src/assets/images/flowboard/flowboard_2.webp b/src/assets/images/flowboard/flowboard_2.webp deleted file mode 100644 index 788db3c..0000000 Binary files a/src/assets/images/flowboard/flowboard_2.webp and /dev/null differ diff --git a/src/assets/images/flowboard/flowboard_3.webp b/src/assets/images/flowboard/flowboard_3.webp deleted file mode 100644 index 72affbb..0000000 Binary files a/src/assets/images/flowboard/flowboard_3.webp and /dev/null differ diff --git a/src/assets/images/flowboard/flowboard_4.webp b/src/assets/images/flowboard/flowboard_4.webp deleted file mode 100644 index 0c577ae..0000000 Binary files a/src/assets/images/flowboard/flowboard_4.webp and /dev/null differ diff --git a/src/assets/images/git.webp b/src/assets/images/git.webp deleted file mode 100644 index ee7c951..0000000 Binary files a/src/assets/images/git.webp and /dev/null differ diff --git a/src/assets/images/github.webp b/src/assets/images/github.webp deleted file mode 100644 index 79f6a4b..0000000 Binary files a/src/assets/images/github.webp and /dev/null differ diff --git a/src/assets/images/gitkraken.webp b/src/assets/images/gitkraken.webp deleted file mode 100644 index d06e556..0000000 Binary files a/src/assets/images/gitkraken.webp and /dev/null differ diff --git a/src/assets/images/gitlab.webp b/src/assets/images/gitlab.webp deleted file mode 100644 index 8b9f959..0000000 Binary files a/src/assets/images/gitlab.webp and /dev/null differ diff --git a/src/assets/images/heidisql.webp b/src/assets/images/heidisql.webp deleted file mode 100644 index 58efa86..0000000 Binary files a/src/assets/images/heidisql.webp and /dev/null differ diff --git a/src/assets/images/html.webp b/src/assets/images/html.webp deleted file mode 100644 index 78cf6cf..0000000 Binary files a/src/assets/images/html.webp and /dev/null differ diff --git a/src/assets/images/instagram.webp b/src/assets/images/instagram.webp deleted file mode 100644 index c3a44bd..0000000 Binary files a/src/assets/images/instagram.webp and /dev/null differ diff --git a/src/assets/images/instagramd.webp b/src/assets/images/instagramd.webp deleted file mode 100644 index 5ea9c31..0000000 Binary files a/src/assets/images/instagramd.webp and /dev/null differ diff --git a/src/assets/images/ios.webp b/src/assets/images/ios.webp deleted file mode 100644 index 86a3e2a..0000000 Binary files a/src/assets/images/ios.webp and /dev/null differ diff --git a/src/assets/images/javascript.webp b/src/assets/images/javascript.webp deleted file mode 100644 index 112c635..0000000 Binary files a/src/assets/images/javascript.webp and /dev/null differ diff --git a/src/assets/images/kalilinux.webp b/src/assets/images/kalilinux.webp deleted file mode 100644 index b533274..0000000 Binary files a/src/assets/images/kalilinux.webp and /dev/null differ diff --git a/src/assets/images/linkedin.webp b/src/assets/images/linkedin.webp deleted file mode 100644 index 5f5277c..0000000 Binary files a/src/assets/images/linkedin.webp and /dev/null differ diff --git a/src/assets/images/linkedind.webp b/src/assets/images/linkedind.webp deleted file mode 100644 index 774c99e..0000000 Binary files a/src/assets/images/linkedind.webp and /dev/null differ diff --git a/src/assets/images/linux.webp b/src/assets/images/linux.webp deleted file mode 100644 index e48b5f4..0000000 Binary files a/src/assets/images/linux.webp and /dev/null differ diff --git a/src/assets/images/logo.webp b/src/assets/images/logo.webp deleted file mode 100644 index 058627d..0000000 Binary files a/src/assets/images/logo.webp and /dev/null differ diff --git a/src/assets/images/macos.webp b/src/assets/images/macos.webp deleted file mode 100644 index 450a358..0000000 Binary files a/src/assets/images/macos.webp and /dev/null differ diff --git a/src/assets/images/mail.webp b/src/assets/images/mail.webp deleted file mode 100644 index a336778..0000000 Binary files a/src/assets/images/mail.webp and /dev/null differ diff --git a/src/assets/images/markdown.webp b/src/assets/images/markdown.webp deleted file mode 100644 index 3dbb039..0000000 Binary files a/src/assets/images/markdown.webp and /dev/null differ diff --git a/src/assets/images/messenger.webp b/src/assets/images/messenger.webp deleted file mode 100644 index 4198036..0000000 Binary files a/src/assets/images/messenger.webp and /dev/null differ diff --git a/src/assets/images/mongodb.webp b/src/assets/images/mongodb.webp deleted file mode 100644 index a941ad7..0000000 Binary files a/src/assets/images/mongodb.webp and /dev/null differ diff --git a/src/assets/images/mysql.webp b/src/assets/images/mysql.webp deleted file mode 100644 index fc3a308..0000000 Binary files a/src/assets/images/mysql.webp and /dev/null differ diff --git a/src/assets/images/mysqlworkbench.webp b/src/assets/images/mysqlworkbench.webp deleted file mode 100644 index b4eeb31..0000000 Binary files a/src/assets/images/mysqlworkbench.webp and /dev/null differ diff --git a/src/assets/images/nginx.webp b/src/assets/images/nginx.webp deleted file mode 100644 index 7f41b95..0000000 Binary files a/src/assets/images/nginx.webp and /dev/null differ diff --git a/src/assets/images/nodejs.webp b/src/assets/images/nodejs.webp deleted file mode 100644 index da245ee..0000000 Binary files a/src/assets/images/nodejs.webp and /dev/null differ diff --git a/src/assets/images/npm.webp b/src/assets/images/npm.webp deleted file mode 100644 index 130ebc8..0000000 Binary files a/src/assets/images/npm.webp and /dev/null differ diff --git a/src/assets/images/postgresql.webp b/src/assets/images/postgresql.webp deleted file mode 100644 index b731182..0000000 Binary files a/src/assets/images/postgresql.webp and /dev/null differ diff --git a/src/assets/images/postman.webp b/src/assets/images/postman.webp deleted file mode 100644 index 4237db8..0000000 Binary files a/src/assets/images/postman.webp and /dev/null differ diff --git a/src/assets/images/primate.webp b/src/assets/images/primate.webp deleted file mode 100644 index a34cdde..0000000 Binary files a/src/assets/images/primate.webp and /dev/null differ diff --git a/src/assets/images/react.webp b/src/assets/images/react.webp deleted file mode 100644 index c467a20..0000000 Binary files a/src/assets/images/react.webp and /dev/null differ diff --git a/src/assets/images/reddit.webp b/src/assets/images/reddit.webp deleted file mode 100644 index 686bf61..0000000 Binary files a/src/assets/images/reddit.webp and /dev/null differ diff --git a/src/assets/images/redis.webp b/src/assets/images/redis.webp deleted file mode 100644 index 6973948..0000000 Binary files a/src/assets/images/redis.webp and /dev/null differ diff --git a/src/assets/images/ruby.webp b/src/assets/images/ruby.webp deleted file mode 100644 index a02ba4b..0000000 Binary files a/src/assets/images/ruby.webp and /dev/null differ diff --git a/src/assets/images/rubyonrails.webp b/src/assets/images/rubyonrails.webp deleted file mode 100644 index 3911310..0000000 Binary files a/src/assets/images/rubyonrails.webp and /dev/null differ diff --git a/src/assets/images/sequelpro.webp b/src/assets/images/sequelpro.webp deleted file mode 100644 index 0990e95..0000000 Binary files a/src/assets/images/sequelpro.webp and /dev/null differ diff --git a/src/assets/images/sqlite.webp b/src/assets/images/sqlite.webp deleted file mode 100644 index 90ec220..0000000 Binary files a/src/assets/images/sqlite.webp and /dev/null differ diff --git a/src/assets/images/tailwindcss.webp b/src/assets/images/tailwindcss.webp deleted file mode 100644 index 95cda93..0000000 Binary files a/src/assets/images/tailwindcss.webp and /dev/null differ diff --git a/src/assets/images/telegram.webp b/src/assets/images/telegram.webp deleted file mode 100644 index dac302d..0000000 Binary files a/src/assets/images/telegram.webp and /dev/null differ diff --git a/src/assets/images/termius.webp b/src/assets/images/termius.webp deleted file mode 100644 index 5579c74..0000000 Binary files a/src/assets/images/termius.webp and /dev/null differ diff --git a/src/assets/images/twitter.webp b/src/assets/images/twitter.webp deleted file mode 100644 index 04baa4d..0000000 Binary files a/src/assets/images/twitter.webp and /dev/null differ diff --git a/src/assets/images/twitterd.webp b/src/assets/images/twitterd.webp deleted file mode 100644 index f7a5c5b..0000000 Binary files a/src/assets/images/twitterd.webp and /dev/null differ diff --git a/src/assets/images/typescript.webp b/src/assets/images/typescript.webp deleted file mode 100644 index 093b375..0000000 Binary files a/src/assets/images/typescript.webp and /dev/null differ diff --git a/src/assets/images/ubuntu.webp b/src/assets/images/ubuntu.webp deleted file mode 100644 index 3ac2200..0000000 Binary files a/src/assets/images/ubuntu.webp and /dev/null differ diff --git a/src/assets/images/virtualtour.webp b/src/assets/images/virtualtour.webp deleted file mode 100644 index 1c7177f..0000000 Binary files a/src/assets/images/virtualtour.webp and /dev/null differ diff --git a/src/assets/images/vscode.webp b/src/assets/images/vscode.webp deleted file mode 100644 index 5b82e13..0000000 Binary files a/src/assets/images/vscode.webp and /dev/null differ diff --git a/src/assets/images/vuejs.webp b/src/assets/images/vuejs.webp deleted file mode 100644 index 0f4cab5..0000000 Binary files a/src/assets/images/vuejs.webp and /dev/null differ diff --git a/src/assets/images/watchos.webp b/src/assets/images/watchos.webp deleted file mode 100644 index 796a492..0000000 Binary files a/src/assets/images/watchos.webp and /dev/null differ diff --git a/src/assets/images/wearos.webp b/src/assets/images/wearos.webp deleted file mode 100644 index 64de063..0000000 Binary files a/src/assets/images/wearos.webp and /dev/null differ diff --git a/src/assets/images/whatsapp.webp b/src/assets/images/whatsapp.webp deleted file mode 100644 index 10def56..0000000 Binary files a/src/assets/images/whatsapp.webp and /dev/null differ diff --git a/src/assets/images/windows.webp b/src/assets/images/windows.webp deleted file mode 100644 index 9365f7e..0000000 Binary files a/src/assets/images/windows.webp and /dev/null differ diff --git a/src/assets/images/wordpress.webp b/src/assets/images/wordpress.webp deleted file mode 100644 index ce0647a..0000000 Binary files a/src/assets/images/wordpress.webp and /dev/null differ diff --git a/src/assets/images/xinko.webp b/src/assets/images/xinko.webp deleted file mode 100644 index 65e526a..0000000 Binary files a/src/assets/images/xinko.webp and /dev/null differ diff --git a/src/assets/logo.svg b/src/assets/logo.svg deleted file mode 100644 index 7565660..0000000 --- a/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/main.css b/src/assets/main.css deleted file mode 100644 index 22ce8bd..0000000 --- a/src/assets/main.css +++ /dev/null @@ -1,901 +0,0 @@ -@import 'tailwindcss/preflight'; -@import 'tailwindcss/utilities'; - -/* Modern CSS Reset & Base Styles */ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -/* Custom Properties - Design System */ -:root { - /* Colors */ - --color-primary: #85cb85; - --color-primary-dark: #6bb06b; - --color-primary-light: #a3d6a3; - --color-secondary: #7c3aed; - --color-accent: #f59e0b; - --color-success: #10b981; - --color-warning: #f59e0b; - --color-error: #ef4444; - --color-info: #3b82f6; - - /* Grays */ - --color-gray-50: #f9fafb; - --color-gray-100: #f3f4f6; - --color-gray-200: #e5e7eb; - --color-gray-300: #d1d5db; - --color-gray-400: #9ca3af; - --color-gray-500: #6b7280; - --color-gray-600: #4b5563; - --color-gray-700: #374151; - --color-gray-800: #1f2937; - --color-gray-900: #111827; - - /* Background */ - --bg-primary: #ffffff; - --bg-secondary: var(--color-gray-50); - --bg-tertiary: var(--color-gray-100); - --bg-dark: var(--color-gray-900); - - /* Text */ - --text-primary: var(--color-gray-900); - --text-secondary: var(--color-gray-600); - --text-tertiary: var(--color-gray-500); - --text-inverse: #ffffff; - - /* Spacing */ - --space-xs: 0.25rem; - --space-sm: 0.5rem; - --space-md: 1rem; - --space-lg: 1.5rem; - --space-xl: 2rem; - --space-2xl: 3rem; - --space-3xl: 4rem; - --space-4xl: 6rem; - - /* Typography */ - --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - --font-family-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace; - - --font-size-xs: 0.75rem; - --font-size-sm: 0.875rem; - --font-size-base: 1rem; - --font-size-lg: 1.125rem; - --font-size-xl: 1.25rem; - --font-size-2xl: 1.5rem; - --font-size-3xl: 1.875rem; - --font-size-4xl: 2.25rem; - --font-size-5xl: 3rem; - --font-size-6xl: 3.75rem; - - --font-weight-light: 300; - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; - --font-weight-extrabold: 800; - - --line-height-tight: 1.25; - --line-height-snug: 1.375; - --line-height-normal: 1.5; - --line-height-relaxed: 1.625; - --line-height-loose: 2; - - /* Borders */ - --border-radius-sm: 0.375rem; - --border-radius-md: 0.5rem; - --border-radius-lg: 0.75rem; - --border-radius-xl: 1rem; - --border-radius-2xl: 1.5rem; - --border-radius-full: 9999px; - - --border-width: 1px; - --border-color: var(--color-gray-200); - - /* Shadows */ - --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); - - /* Transitions */ - --transition-fast: 150ms ease-in-out; - --transition-normal: 300ms ease-in-out; - --transition-slow: 500ms ease-in-out; - - /* Z-index */ - --z-dropdown: 1000; - --z-sticky: 1020; - --z-fixed: 1030; - --z-modal: 1040; - --z-popover: 1050; - --z-tooltip: 1060; -} - -/* Dark Mode Variables */ -.dark { - /* Colors - Dark mode overrides */ - --color-primary: #a3d6a3; - --color-primary-dark: #85cb85; - --color-primary-light: #c3e6c3; - - /* Background - Dark mode */ - --bg-primary: #111827; - --bg-secondary: #1f2937; - --bg-tertiary: #374151; - --bg-dark: #000000; - - /* Text - Dark mode */ - --text-primary: #f9fafb; - --text-secondary: #d1d5db; - --text-tertiary: #9ca3af; - --text-inverse: #111827; - - /* Borders - Dark mode */ - --border-color: #374151; - - /* Shadows - Dark mode */ - --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3); - --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.3), 0 2px 4px -2px rgb(0 0 0 / 0.3); - --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3); - --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3); - --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5); -} - -/* Base HTML Elements */ -html { - font-family: var(--font-family-sans); - font-size: var(--font-size-base); - line-height: var(--line-height-normal); - color: var(--text-primary); - background-color: var(--bg-primary); - scroll-behavior: smooth; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -body { - min-height: 100vh; - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); -} - -/* Typography */ -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: var(--font-weight-bold); - line-height: var(--line-height-tight); - color: var(--text-primary); - margin-bottom: var(--space-md); -} - -h1 { - font-size: var(--font-size-5xl); - font-weight: var(--font-weight-extrabold); -} - -h2 { - font-size: var(--font-size-4xl); -} - -h3 { - font-size: var(--font-size-3xl); -} - -h4 { - font-size: var(--font-size-2xl); -} - -h5 { - font-size: var(--font-size-xl); -} - -h6 { - font-size: var(--font-size-lg); -} - -p { - color: var(--text-secondary); - line-height: var(--line-height-relaxed); - margin-bottom: var(--space-md); -} - -a { - color: var(--color-primary); - text-decoration: none; - transition: color var(--transition-fast); -} - -a:hover { - color: var(--color-primary-dark); -} - -/* Layout Components */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 var(--space-md); -} - -@media (min-width: 640px) { - .container { - padding: 0 var(--space-lg); - } -} - -@media (min-width: 1024px) { - .container { - padding: 0 var(--space-xl); - } -} - -/* Button System */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-sm); - padding: var(--space-md) var(--space-xl); - font-size: var(--font-size-base); - font-weight: var(--font-weight-semibold); - line-height: 1.2; - border: 2px solid transparent; - border-radius: var(--border-radius-xl); - cursor: pointer; - transition: all var(--transition-fast); - text-decoration: none; - white-space: nowrap; - position: relative; - overflow: hidden; -} - -.btn:focus { - outline: 2px solid var(--color-primary); - outline-offset: 2px; -} - -.btn:disabled { - opacity: 0.5; - cursor: not-allowed; - transform: none !important; -} - -/* Primary Button - Vert avec effet moderne */ -.btn-primary { - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); - color: #1f2937; - border-color: var(--color-primary); - box-shadow: 0 2px 8px rgba(133, 203, 133, 0.2); -} - -.btn-primary:hover { - background: linear-gradient(135deg, var(--color-primary-dark) 0%, var(--color-primary) 100%); - color: #1f2937; - box-shadow: 0 4px 12px rgba(133, 203, 133, 0.25); - transform: translateY(-2px); -} - -.btn-primary:active { - color: #1f2937; - transform: translateY(0); - box-shadow: 0 1px 4px rgba(133, 203, 133, 0.2); -} - -/* Secondary Button - Contour vert */ -.btn-secondary { - background: transparent; - color: var(--color-primary); - border-color: var(--color-primary); - transition: all var(--transition-fast); -} - -.btn-secondary:hover { - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); - color: #1f2937; - transform: translateY(-2px); - box-shadow: 0 3px 10px rgba(133, 203, 133, 0.15); -} - -/* Ghost Button - Subtil */ -.btn-ghost { - background: var(--bg-secondary); - color: var(--text-primary); - border-color: var(--border-color); -} - -.btn-ghost:hover { - background: var(--bg-tertiary); - color: var(--color-primary); - border-color: var(--color-primary); - transform: translateY(-1px); - box-shadow: var(--shadow-md); -} - -/* Outline Button - Alias pour secondary */ -.btn-outline { - background: transparent; - color: var(--color-primary); - border-color: var(--color-primary); - transition: all var(--transition-fast); -} - -.btn-outline:hover { - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); - color: #1f2937; - transform: translateY(-2px); - box-shadow: 0 3px 10px rgba(133, 203, 133, 0.15); -} - -/* Button Sizes */ -.btn-sm { - padding: var(--space-sm) var(--space-lg); - font-size: var(--font-size-sm); - border-radius: var(--border-radius-lg); -} - -.btn-lg { - padding: var(--space-lg) var(--space-2xl); - font-size: var(--font-size-lg); - font-weight: var(--font-weight-bold); -} - -/* Button with icons */ -.btn-icon { - width: 18px; - height: 18px; - flex-shrink: 0; -} - -/* Card System */ -.card { - background: var(--bg-primary); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-xl); - box-shadow: var(--shadow-md); - transition: all var(--transition-normal); - overflow: hidden; -} - -.card:hover { - box-shadow: var(--shadow-xl); - transform: translateY(-4px); -} - -.card-header { - padding: var(--space-xl); - border-bottom: var(--border-width) solid var(--border-color); -} - -.card-body { - padding: var(--space-xl); -} - -.card-footer { - padding: var(--space-xl); - border-top: var(--border-width) solid var(--border-color); - background: var(--bg-secondary); -} - -/* Badge System */ -.badge { - display: inline-flex; - align-items: center; - gap: var(--space-xs); - padding: var(--space-xs) var(--space-md); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - border-radius: var(--border-radius-full); - white-space: nowrap; -} - -.badge-primary { - background: var(--color-primary); - color: var(--text-inverse); -} - -.badge-secondary { - background: var(--bg-tertiary); - color: var(--text-secondary); -} - -.badge-success { - background: var(--color-success); - color: var(--text-inverse); -} - -.badge-warning { - background: var(--color-warning); - color: var(--text-inverse); -} - -.badge-error { - background: var(--color-error); - color: var(--text-inverse); -} - -/* Form Elements */ -.form-group { - margin-bottom: var(--space-lg); -} - -.form-label { - display: block; - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - color: var(--text-primary); - margin-bottom: var(--space-sm); -} - -.form-input, -.form-textarea, -.form-select { - width: 100%; - padding: var(--space-md); - font-size: var(--font-size-base); - line-height: var(--line-height-normal); - color: var(--text-primary); - background: var(--bg-primary); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-md); - transition: all var(--transition-fast); -} - -.form-input:focus, -.form-textarea:focus, -.form-select:focus { - outline: none; - border-color: var(--color-primary); - box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); -} - -.form-textarea { - resize: vertical; - min-height: 120px; -} - -/* Navigation */ -.nav { - display: flex; - align-items: center; - gap: var(--space-lg); -} - -.nav-link { - position: relative; - padding: var(--space-sm) var(--space-md); - font-weight: var(--font-weight-medium); - color: var(--text-secondary); - transition: color var(--transition-fast); -} - -.nav-link:hover, -.nav-link.active { - color: var(--color-primary); -} - -.nav-link::after { - content: ''; - position: absolute; - bottom: -2px; - left: 50%; - width: 0; - height: 2px; - background: var(--color-primary); - transition: all var(--transition-fast); - transform: translateX(-50%); -} - -.nav-link:hover::after, -.nav-link.active::after { - width: 100%; -} - -/* Header */ -.header { - position: sticky; - top: 0; - z-index: var(--z-sticky); - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(10px); - border-bottom: var(--border-width) solid var(--border-color); - transition: all var(--transition-fast); -} - -/* Header dark mode */ -.dark .header { - background: rgba(17, 24, 39, 0.95); -} - -.header-content { - display: flex; - align-items: center; - justify-content: space-between; - height: 80px; -} - -.logo { - display: flex; - align-items: center; - gap: var(--space-md); - font-size: var(--font-size-xl); - font-weight: var(--font-weight-bold); - color: var(--text-primary); - text-decoration: none; -} - -.logo-icon { - display: flex; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%); - border-radius: var(--border-radius-lg); - color: var(--text-inverse); - font-weight: var(--font-weight-bold); - font-size: var(--font-size-xl); -} - -/* Hero Section */ -.hero { - position: relative; - min-height: 100vh; - display: flex; - align-items: center; - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - overflow: hidden; -} - -.hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23f3f4f6' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.5; -} - -/* Hero dark mode pattern */ -.dark .hero::before { - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23374151' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); -} - -.hero-content { - position: relative; - z-index: 1; - text-align: center; - max-width: 800px; - margin: 0 auto; -} - -.hero-title { - font-size: clamp(var(--font-size-4xl), 5vw, var(--font-size-6xl)); - font-weight: var(--font-weight-extrabold); - margin-bottom: var(--space-lg); - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.hero-subtitle { - font-size: var(--font-size-xl); - color: var(--text-secondary); - margin-bottom: var(--space-2xl); - line-height: var(--line-height-relaxed); -} - -/* Section Spacing */ -.section { - padding: var(--space-4xl) 0; -} - -.section-sm { - padding: var(--space-2xl) 0; -} - -.section-lg { - padding: var(--space-4xl) 0; -} - -/* Grid System */ -.grid { - display: grid; - gap: var(--space-xl); -} - -.grid-cols-1 { - grid-template-columns: 1fr; -} - -.grid-cols-2 { - grid-template-columns: repeat(2, 1fr); -} - -.grid-cols-3 { - grid-template-columns: repeat(3, 1fr); -} - -.grid-cols-4 { - grid-template-columns: repeat(4, 1fr); -} - -@media (max-width: 1024px) { - .grid-cols-4 { - grid-template-columns: repeat(2, 1fr); - } - - .grid-cols-3 { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (max-width: 640px) { - .grid-cols-4, - .grid-cols-3, - .grid-cols-2 { - grid-template-columns: 1fr; - } -} - -/* Utilities */ -.text-center { - text-align: center; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.flex { - display: flex; -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.gap-sm { - gap: var(--space-sm); -} - -.gap-md { - gap: var(--space-md); -} - -.gap-lg { - gap: var(--space-lg); -} - -.gap-xl { - gap: var(--space-xl); -} - -.mb-sm { - margin-bottom: var(--space-sm); -} - -.mb-md { - margin-bottom: var(--space-md); -} - -.mb-lg { - margin-bottom: var(--space-lg); -} - -.mb-xl { - margin-bottom: var(--space-xl); -} - -.mb-2xl { - margin-bottom: var(--space-2xl); -} - -/* Animations */ -/* Page Entrance Animations */ -@keyframes pageEnter { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes slideInRight { - from { - opacity: 0; - transform: translateX(30px); - } - to { - opacity: 1; - transform: translateX(0); - } -} - -@keyframes slideInLeft { - from { - opacity: 0; - transform: translateX(-30px); - } - to { - opacity: 1; - transform: translateX(0); - } -} - -@keyframes scaleIn { - from { - opacity: 0; - transform: scale(0.9); - } - to { - opacity: 1; - transform: scale(1); - } -} - -/* Page Animation Classes */ -.page-enter { - animation: pageEnter 0.6s ease-out; -} - -/* Enhanced Load Animation Classes */ -.animate-fade-in-up { - animation: fadeInUp 0.6s ease-out forwards; - opacity: 0; -} - -.animate-fade-in { - animation: fadeIn 0.6s ease-out forwards; - opacity: 0; -} - -.animate-slide-in-right { - animation: slideInRight 0.6s ease-out forwards; - opacity: 0; -} - -.animate-slide-in-left { - animation: slideInLeft 0.6s ease-out forwards; - opacity: 0; -} - -.animate-scale-in { - animation: scaleIn 0.6s ease-out forwards; - opacity: 0; -} - -/* Mobile Menu */ -.mobile-menu { - position: fixed; - top: 80px; - left: 0; - right: 0; - background: var(--bg-primary); - border-bottom: var(--border-width) solid var(--border-color); - box-shadow: var(--shadow-lg); - z-index: var(--z-dropdown); - transform: translateY(-100%); - transition: transform var(--transition-normal); -} - -.mobile-menu.open { - transform: translateY(0); -} - -.mobile-menu-nav { - display: flex; - flex-direction: column; - padding: var(--space-lg); -} - -.mobile-menu-nav .nav-link { - padding: var(--space-md) 0; - border-bottom: var(--border-width) solid var(--border-color); -} - -.mobile-menu-nav .nav-link:last-child { - border-bottom: none; -} - -/* Footer */ -.footer { - background: var(--bg-secondary); - color: var(--text-primary); - padding: var(--space-4xl) 0 var(--space-xl); - border-top: var(--border-width) solid var(--border-color); -} - -.footer a { - color: var(--text-secondary); -} - -.footer a:hover { - color: var(--color-primary); -} - -/* Responsive Design */ -@media (max-width: 768px) { - :root { - --font-size-5xl: 2.5rem; - --font-size-4xl: 2rem; - --font-size-3xl: 1.5rem; - } - - .container { - padding: 0 var(--space-md); - } - - .hero { - min-height: 80vh; - padding: var(--space-2xl) 0; - } - - .section { - padding: var(--space-2xl) 0; - } -} - -/* Focus States */ -*:focus-visible { - outline: 2px solid var(--color-primary); - outline-offset: 2px; -} - -/* Smooth Transitions */ -* { - transition-property: - color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, - transform, filter, backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} diff --git a/src/components/ContactMethod.vue b/src/components/ContactMethod.vue deleted file mode 100644 index 51c6859..0000000 --- a/src/components/ContactMethod.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/src/components/FiverrCta.vue b/src/components/FiverrCta.vue deleted file mode 100644 index 53bc45f..0000000 --- a/src/components/FiverrCta.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/src/components/FiverrHero.vue b/src/components/FiverrHero.vue deleted file mode 100644 index 37879c9..0000000 --- a/src/components/FiverrHero.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/src/components/FiverrServiceCard.vue b/src/components/FiverrServiceCard.vue deleted file mode 100644 index e8b9b00..0000000 --- a/src/components/FiverrServiceCard.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - diff --git a/src/components/GalleryModal.vue b/src/components/GalleryModal.vue deleted file mode 100644 index 53c9f26..0000000 --- a/src/components/GalleryModal.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/src/components/LanguageSwitcher.vue b/src/components/LanguageSwitcher.vue deleted file mode 100644 index 5dfe772..0000000 --- a/src/components/LanguageSwitcher.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/src/components/ProjectCard.vue b/src/components/ProjectCard.vue deleted file mode 100644 index bcf9d4e..0000000 --- a/src/components/ProjectCard.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - - - diff --git a/src/components/ServiceFAQ.vue b/src/components/ServiceFAQ.vue deleted file mode 100644 index 536d068..0000000 --- a/src/components/ServiceFAQ.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - - - diff --git a/src/components/TechBadge.vue b/src/components/TechBadge.vue deleted file mode 100644 index 5200904..0000000 --- a/src/components/TechBadge.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/src/components/TestimonialsSection.vue b/src/components/TestimonialsSection.vue deleted file mode 100644 index 7b70ad3..0000000 --- a/src/components/TestimonialsSection.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - - - diff --git a/src/components/ThemeToggle.vue b/src/components/ThemeToggle.vue deleted file mode 100644 index 1833986..0000000 --- a/src/components/ThemeToggle.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue deleted file mode 100644 index 2dc8b05..0000000 --- a/src/components/icons/IconCommunity.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue deleted file mode 100644 index 6d4791c..0000000 --- a/src/components/icons/IconDocumentation.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue deleted file mode 100644 index c3a4f07..0000000 --- a/src/components/icons/IconEcosystem.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue deleted file mode 100644 index 7452834..0000000 --- a/src/components/icons/IconSupport.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue deleted file mode 100644 index 660598d..0000000 --- a/src/components/icons/IconTooling.vue +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/src/components/layout/AppFooter.vue b/src/components/layout/AppFooter.vue deleted file mode 100644 index c4e9081..0000000 --- a/src/components/layout/AppFooter.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/src/components/layout/AppHeader.vue b/src/components/layout/AppHeader.vue deleted file mode 100644 index 08059b1..0000000 --- a/src/components/layout/AppHeader.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/src/components/sections/CTASection.vue b/src/components/sections/CTASection.vue deleted file mode 100644 index 03f0375..0000000 --- a/src/components/sections/CTASection.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/src/components/sections/FeaturedProjectsSection.vue b/src/components/sections/FeaturedProjectsSection.vue deleted file mode 100644 index 37e9d00..0000000 --- a/src/components/sections/FeaturedProjectsSection.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/src/components/sections/HeroSection.vue b/src/components/sections/HeroSection.vue deleted file mode 100644 index a849542..0000000 --- a/src/components/sections/HeroSection.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/src/components/sections/ServicesSection.vue b/src/components/sections/ServicesSection.vue deleted file mode 100644 index 1975b7d..0000000 --- a/src/components/sections/ServicesSection.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - - - diff --git a/src/components/shared/CTAButtons.vue b/src/components/shared/CTAButtons.vue deleted file mode 100644 index 2a7e236..0000000 --- a/src/components/shared/CTAButtons.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/src/components/shared/SectionCTA.vue b/src/components/shared/SectionCTA.vue deleted file mode 100644 index 10dcb76..0000000 --- a/src/components/shared/SectionCTA.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/src/components/styles/AppFooter.css b/src/components/styles/AppFooter.css deleted file mode 100644 index 917d044..0000000 --- a/src/components/styles/AppFooter.css +++ /dev/null @@ -1,100 +0,0 @@ -/* AppFooter Styles */ - -/* Footer Base */ -.footer { - background: var(--bg-tertiary); - color: var(--text-primary); - padding: var(--space-4xl) 0 var(--space-xl); - border-top: var(--border-width) solid var(--border-color); -} - -/* Footer logo */ -.footer-logo { - width: 32px; - height: 32px; - object-fit: contain; - border-radius: var(--border-radius-md); -} - -/* Footer Brand */ -.footer-brand { - color: var(--text-primary); -} - -/* Footer Titles */ -.footer-title { - color: var(--text-primary); -} - -/* Footer Description */ -.footer-description { - color: var(--text-secondary); -} - -/* Footer Copyright */ -.footer-copyright { - color: var(--text-tertiary); -} - -/* Footer Bottom */ -.footer-bottom { - border-top: var(--border-width) solid var(--border-color); - padding-top: var(--space-lg); -} - -/* Social Links */ -.social-link { - display: flex; - align-items: center; - justify-content: center; - width: 44px; - height: 44px; - background: var(--bg-secondary); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-lg); - color: var(--text-secondary); - transition: all var(--transition-fast); -} - -.social-link:hover { - background: var(--color-primary); - color: var(--text-inverse); - border-color: var(--color-primary); - box-shadow: var(--shadow-md); - scale: 1.05; -} - -/* Footer Links */ -.footer-link { - color: var(--text-secondary); - transition: color var(--transition-fast); - text-decoration: none; -} - -.footer-link:hover { - color: var(--color-primary); -} - -/* Custom utilities */ -.space-y-sm > * + * { - margin-top: var(--space-sm); -} - -.max-w-md { - max-width: 28rem; -} - -.cursor-default { - cursor: default; -} - -/* Responsive */ -@media (min-width: 768px) { - .md\:col-span-2 { - grid-column: span 2; - } - - .md\:flex-row { - flex-direction: row; - } -} diff --git a/src/components/styles/AppHeader.css b/src/components/styles/AppHeader.css deleted file mode 100644 index 2f1a5d6..0000000 --- a/src/components/styles/AppHeader.css +++ /dev/null @@ -1,136 +0,0 @@ -/* AppHeader Styles */ - -/* Header container */ -.header { - background: var(--bg-primary); - border-bottom: 1px solid var(--border-color); - position: sticky; - top: 0; - z-index: 50; - backdrop-filter: blur(10px); - background: rgba(var(--bg-primary-rgb), 0.95); -} - -.header-content { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--space-md) 0; -} - -/* Logo */ -.logo { - display: flex; - align-items: center; - gap: var(--space-sm); - text-decoration: none; - color: var(--text-primary); - font-weight: 600; - font-size: 1.25rem; -} - -.logo:hover { - color: var(--color-primary); -} - -/* Logo styling */ -.logo-image { - width: 32px; - height: 32px; - object-fit: contain; - border-radius: var(--border-radius-md); -} - -/* Navigation */ -.nav { - display: flex; - align-items: center; - gap: var(--space-lg); -} - -.nav-link { - position: relative; - color: var(--text-secondary); - text-decoration: none; - font-weight: 500; - padding: var(--space-sm) 0; - transition: color var(--transition-fast); -} - -.nav-link:hover { - color: var(--text-primary); -} - -.nav-link.active, -.nav-link.router-link-active { - color: var(--color-primary); -} - -.nav-link.active::after, -.nav-link.router-link-active::after { - content: ''; - position: absolute; - bottom: -2px; - left: 50%; - transform: translateX(-50%); - width: 80%; - height: 2px; - background: var(--color-primary); - border-radius: 1px; -} - -/* Header actions */ -.header-actions { - display: flex; - align-items: center; - gap: var(--space-sm); -} - -/* Mobile menu */ -.mobile-menu { - display: none; - background: var(--bg-primary); - border-top: 1px solid var(--border-color); - padding: var(--space-md) 0; -} - -.mobile-menu.open { - display: block; -} - -.mobile-menu-nav { - display: flex; - flex-direction: column; - gap: var(--space-sm); -} - -.mobile-menu .nav-link { - padding: var(--space-md); - border-radius: var(--border-radius-md); - display: block; -} - -.mobile-menu .nav-link:hover { - background: var(--bg-secondary); -} - -/* Mobile responsive utilities */ -@media (min-width: 768px) { - .md\:flex { - display: flex !important; - } - - .md\:hidden { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden { - display: none; - } - - .nav { - display: none; - } -} diff --git a/src/components/styles/CTAButtons.css b/src/components/styles/CTAButtons.css deleted file mode 100644 index d8f4389..0000000 --- a/src/components/styles/CTAButtons.css +++ /dev/null @@ -1,78 +0,0 @@ -/* CTAButtons Styles */ -.cta-buttons-container { - display: flex; - justify-content: center; - width: 100%; -} - -.cta-buttons { - display: flex; - gap: 1rem; - justify-content: center; - align-items: center; - max-width: 900px; - width: 100%; -} - -/* Column Layout (Default) */ -.cta-buttons--columns { - flex-direction: column; -} - -@media (min-width: 640px) { - .cta-buttons--columns { - flex-direction: row; - flex-wrap: wrap; - } -} - -@media (min-width: 768px) { - .cta-buttons--columns { - flex-direction: row; - flex-wrap: nowrap; - } -} - -/* Row Layout */ -.cta-buttons--row { - flex-direction: column; -} - -@media (min-width: 640px) { - .cta-buttons--row { - flex-direction: row; - flex-wrap: wrap; - } -} - -/* Stack Layout */ -.cta-buttons--stack { - flex-direction: column; -} - -/* Button Styling */ -.cta-buttons :deep(.btn) { - white-space: nowrap; - min-width: fit-content; - flex: 0 0 auto; - text-align: center; -} - -@media (min-width: 768px) { - .cta-buttons--columns :deep(.btn) { - flex: 1 1 auto; - max-width: 280px; - } - - .cta-buttons--row :deep(.btn) { - flex: 0 1 auto; - max-width: 250px; - } -} - -@media (max-width: 639px) { - .cta-buttons :deep(.btn) { - width: 100%; - max-width: 320px; - } -} diff --git a/src/components/styles/ContactMethod.css b/src/components/styles/ContactMethod.css deleted file mode 100644 index e2e08fc..0000000 --- a/src/components/styles/ContactMethod.css +++ /dev/null @@ -1,80 +0,0 @@ -/* Contact Methods */ -.contact-method { - display: flex; - align-items: flex-start; - padding: var(--space-md); - background: var(--bg-secondary); - border-radius: var(--border-radius-lg); - transition: all var(--transition-fast); -} - -.contact-method:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-lg); -} - -.contact-icon { - width: 40px; - height: 40px; - border-radius: var(--border-radius-lg); - display: flex; - align-items: center; - justify-content: center; - margin-right: var(--space-md); - flex-shrink: 0; -} - -.contact-icon-email { - background: var(--color-primary); - color: var(--text-inverse); -} - -.contact-icon-phone { - background: var(--color-info); - color: var(--text-inverse); -} - -.contact-icon-location { - background: var(--color-secondary); - color: var(--text-inverse); -} - -.contact-info { - flex: 1; -} - -.contact-title { - font-weight: 600; - color: var(--text-primary); - margin-bottom: var(--space-xs); -} - -.contact-link { - color: var(--color-primary); - text-decoration: none; - transition: color var(--transition-fast); - display: block; - margin-bottom: var(--space-xs); -} - -.contact-link:hover { - color: var(--color-primary-dark); -} - -.contact-text { - color: var(--text-primary); - margin-bottom: var(--space-xs); -} - -.contact-description { - font-size: var(--font-size-sm); - color: var(--text-secondary); -} - -.w-6 { - width: 1.5rem; -} - -.h-6 { - height: 1.5rem; -} diff --git a/src/components/styles/FeaturedProjectsSection.css b/src/components/styles/FeaturedProjectsSection.css deleted file mode 100644 index 609f65a..0000000 --- a/src/components/styles/FeaturedProjectsSection.css +++ /dev/null @@ -1,21 +0,0 @@ -/* FeaturedProjectsSection Styles */ -.projects-grid { - display: grid; - grid-template-columns: 1fr; - gap: 2rem; - margin-bottom: 3rem; -} - -@media (min-width: 768px) { - .projects-grid { - grid-template-columns: repeat(2, 1fr); - gap: 2rem; - } -} - -@media (min-width: 1024px) { - .projects-grid { - grid-template-columns: repeat(3, 1fr); - gap: 2rem; - } -} diff --git a/src/components/styles/FiverrCta.css b/src/components/styles/FiverrCta.css deleted file mode 100644 index fe58d89..0000000 --- a/src/components/styles/FiverrCta.css +++ /dev/null @@ -1,38 +0,0 @@ -/* CTA Section */ -.cta-section { - background: var(--bg-secondary); - padding: var(--space-4xl) 0; - position: relative; -} - -.cta-section::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23e5e7eb' fill-opacity='0.3'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.5; -} - -.cta-content { - position: relative; - z-index: 1; - max-width: 600px; - margin: 0 auto; -} - -.cta-title { - font-size: var(--font-size-4xl); - font-weight: var(--font-weight-bold); - color: var(--text-primary); - margin-bottom: var(--space-lg); -} - -.cta-subtitle { - font-size: var(--font-size-lg); - color: var(--text-secondary); - margin-bottom: var(--space-2xl); - line-height: var(--line-height-relaxed); -} diff --git a/src/components/styles/FiverrHero.css b/src/components/styles/FiverrHero.css deleted file mode 100644 index fac04a3..0000000 --- a/src/components/styles/FiverrHero.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Hero Section */ -.fiverr-hero { - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - padding: var(--space-4xl) 0 var(--space-3xl); - position: relative; - overflow: hidden; -} - -.fiverr-hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23f3f4f6' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.5; -} - -.hero-content { - position: relative; - z-index: 1; -} - -.hero-title { - font-size: var(--font-size-5xl); - font-weight: var(--font-weight-extrabold); - color: var(--text-primary); - margin-bottom: var(--space-lg); - line-height: var(--line-height-tight); -} - -.hero-subtitle { - font-size: var(--font-size-xl); - color: var(--text-secondary); - margin-bottom: var(--space-2xl); - max-width: 700px; - margin-left: auto; - margin-right: auto; - line-height: var(--line-height-relaxed); -} - -/* Stats Grid */ -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: var(--space-xl); - margin-bottom: var(--space-2xl); - max-width: 500px; - margin-left: auto; - margin-right: auto; -} - -.stat-item { - text-align: center; -} - -.stat-number { - font-size: var(--font-size-3xl); - font-weight: var(--font-weight-extrabold); - color: var(--color-primary); - margin-bottom: var(--space-xs); -} - -.stat-label { - font-size: var(--font-size-sm); - color: var(--text-secondary); - text-transform: uppercase; - letter-spacing: 0.05em; -} - -.hero-cta { - margin-top: var(--space-xl); -} diff --git a/src/components/styles/FiverrServiceCard.css b/src/components/styles/FiverrServiceCard.css deleted file mode 100644 index 398b4b1..0000000 --- a/src/components/styles/FiverrServiceCard.css +++ /dev/null @@ -1,95 +0,0 @@ -/* Service Card */ -.service-card { - height: fit-content; -} - -.service-image { - position: relative; - overflow: hidden; - aspect-ratio: 16/9; -} - -.service-image img { - width: 100%; - height: 100%; - object-fit: cover; - transition: transform 0.3s ease; -} - -.group:hover .service-image img { - transform: scale(1.1); -} - -.service-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: var(--space-md); -} - -.service-title { - font-size: var(--font-size-xl); - font-weight: var(--font-weight-bold); - margin-bottom: var(--space-md); - transition: color 0.3s ease; -} - -.group:hover .service-title { - color: var(--color-primary); -} - -.service-description { - color: var(--text-secondary); - margin-bottom: var(--space-lg); - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.features-list { - margin-bottom: var(--space-lg); -} - -.features-title { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - margin-bottom: var(--space-sm); -} - -.features-items { - list-style: none; - padding: 0; - margin: 0; - display: flex; - flex-direction: column; - gap: var(--space-xs); -} - -.feature-item { - display: flex; - align-items: flex-start; - gap: var(--space-xs); - font-size: var(--font-size-sm); - color: var(--text-secondary); -} - -.feature-icon { - width: 1rem; - height: 1rem; - color: var(--color-success); - flex-shrink: 0; - margin-top: 0.125rem; -} - -.more-features { - font-size: var(--font-size-xs); - color: var(--text-secondary); - font-weight: var(--font-weight-medium); -} - -.service-actions { - display: flex; - align-items: center; - justify-content: space-between; -} diff --git a/src/components/styles/GalleryModal.css b/src/components/styles/GalleryModal.css deleted file mode 100644 index 792aacd..0000000 --- a/src/components/styles/GalleryModal.css +++ /dev/null @@ -1,201 +0,0 @@ -/* GalleryModal Styles */ - -.gallery-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 9999; - display: flex; - align-items: center; - justify-content: center; - padding: 1rem; -} - -.gallery-modal-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.9); - backdrop-filter: blur(4px); -} - -.gallery-close { - position: absolute; - top: 1rem; - right: 1rem; - z-index: 10001; - width: 3rem; - height: 3rem; - border: none; - border-radius: 50%; - background: rgba(255, 255, 255, 0.1); - color: white; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s ease; - backdrop-filter: blur(10px); -} - -.gallery-close:hover { - background: rgba(255, 255, 255, 0.2); - transform: scale(1.1); -} - -.gallery-close svg { - width: 1.5rem; - height: 1.5rem; -} - -.gallery-nav { - position: absolute; - top: 50%; - transform: translateY(-50%); - z-index: 10001; - width: 3rem; - height: 3rem; - border: none; - border-radius: 50%; - background: rgba(255, 255, 255, 0.1); - color: white; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s ease; - backdrop-filter: blur(10px); -} - -.gallery-nav:hover { - background: rgba(255, 255, 255, 0.2); - transform: translateY(-50%) scale(1.1); -} - -.gallery-nav-prev { - left: 1rem; -} - -.gallery-nav-next { - right: 1rem; -} - -.gallery-nav svg { - width: 1.5rem; - height: 1.5rem; -} - -.gallery-content { - position: relative; - z-index: 10000; - max-width: 90vw; - max-height: 90vh; - display: flex; - flex-direction: column; - align-items: center; -} - -.gallery-image { - max-width: 100%; - max-height: 80vh; - object-fit: contain; - border-radius: 0.5rem; - box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5); -} - -.gallery-info { - margin-top: 1rem; - text-align: center; - color: white; -} - -.gallery-title { - font-size: 1.25rem; - font-weight: 600; - margin: 0 0 0.5rem 0; -} - -.gallery-counter { - font-size: 0.875rem; - opacity: 0.8; - margin: 0; -} - -.gallery-thumbnails { - display: flex; - gap: 0.5rem; - margin-top: 1rem; - justify-content: center; - flex-wrap: wrap; -} - -.gallery-thumbnail { - width: 0.75rem; - height: 0.75rem; - border: none; - border-radius: 50%; - background: none; - cursor: pointer; - padding: 0; -} - -.thumbnail-indicator { - width: 100%; - height: 100%; - border-radius: 50%; - background: rgba(255, 255, 255, 0.4); - transition: all 0.2s ease; -} - -.gallery-thumbnail.active .thumbnail-indicator { - background: white; - transform: scale(1.2); -} - -.gallery-thumbnail:hover .thumbnail-indicator { - background: rgba(255, 255, 255, 0.7); - transform: scale(1.1); -} - -/* Mobile adjustments */ -@media (max-width: 768px) { - .gallery-modal { - padding: 0.5rem; - } - - .gallery-close, - .gallery-nav { - width: 2.5rem; - height: 2.5rem; - } - - .gallery-close svg, - .gallery-nav svg { - width: 1.25rem; - height: 1.25rem; - } - - .gallery-nav-prev { - left: 0.5rem; - } - - .gallery-nav-next { - right: 0.5rem; - } - - .gallery-image { - max-height: 70vh; - } - - .gallery-title { - font-size: 1rem; - } - - .gallery-counter { - font-size: 0.75rem; - } -} diff --git a/src/components/styles/LanguageSwitcher.css b/src/components/styles/LanguageSwitcher.css deleted file mode 100644 index 7e23646..0000000 --- a/src/components/styles/LanguageSwitcher.css +++ /dev/null @@ -1,63 +0,0 @@ -/* LanguageSwitcher Styles */ - -.language-switcher { - display: flex; - align-items: center; -} - -.language-switcher-buttons { - display: flex; - gap: var(--space-xs); - background: var(--bg-secondary); - border-radius: var(--border-radius-lg); - padding: var(--space-xs); - border: 1px solid var(--border-color); -} - -.language-btn { - display: flex; - align-items: center; - gap: var(--space-xs); - padding: var(--space-xs) var(--space-sm); - border: none; - background: transparent; - border-radius: var(--border-radius-md); - cursor: pointer; - transition: all 0.2s ease; - color: var(--text-secondary); - font-size: 0.875rem; - font-weight: 500; -} - -.language-btn:hover { - background: var(--bg-tertiary); - color: var(--text-primary); -} - -.language-btn.active { - background: var(--color-primary); - color: white; - box-shadow: var(--shadow-sm); -} - -.flag { - font-size: 1rem; - line-height: 1; -} - -.lang-code { - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 0.05em; -} - -/* Mobile responsive */ -@media (max-width: 640px) { - .lang-code { - display: none; - } - - .language-btn { - padding: var(--space-xs); - } -} diff --git a/src/components/styles/ProjectCard.css b/src/components/styles/ProjectCard.css deleted file mode 100644 index ac91ab6..0000000 --- a/src/components/styles/ProjectCard.css +++ /dev/null @@ -1,81 +0,0 @@ -/* Project Card Styles */ -.project-image { - position: relative; - overflow: hidden; - aspect-ratio: 16/9; -} - -.project-image img { - width: 100%; - height: 100%; - object-fit: cover; - transition: transform var(--transition-normal); -} - -.group:hover .project-image img { - transform: scale(1.1); -} - -/* Project overlay */ -.project-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: linear-gradient(to top, rgba(0, 0, 0, 0.6) 0%, transparent 50%, transparent 100%); - opacity: 0; - transition: opacity var(--transition-normal); -} - -.group:hover .project-overlay { - opacity: 1; -} - -.project-overlay-content { - position: absolute; - bottom: 1rem; - left: 1rem; - right: 1rem; -} - -/* Project content */ -.project-meta { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: var(--space-md); -} - -.project-title { - font-size: var(--font-size-xl); - font-weight: var(--font-weight-bold); - margin-bottom: var(--space-md); - transition: color var(--transition-fast); -} - -.group:hover .project-title { - color: var(--color-primary); -} - -.project-description { - color: var(--text-secondary); - margin-bottom: var(--space-lg); - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.project-technologies { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - margin-bottom: var(--space-lg); -} - -.project-actions { - display: flex; - align-items: center; - justify-content: space-between; -} diff --git a/src/components/styles/SectionCTA.css b/src/components/styles/SectionCTA.css deleted file mode 100644 index 2ea10c9..0000000 --- a/src/components/styles/SectionCTA.css +++ /dev/null @@ -1,65 +0,0 @@ -/* SectionCTA Styles */ -.section-cta { - background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); - border-radius: 20px; - padding: 48px 32px; - text-align: center; - margin: 64px 0; - border: 1px solid #e2e8f0; - transition: all 0.3s ease; -} - -.section-cta:hover { - transform: translateY(-2px); - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); -} - -.cta-content { - max-width: 600px; - margin: 0 auto; -} - -.cta-question { - font-size: 1.75rem; - font-weight: 700; - color: #1e293b; - margin-bottom: 16px; - line-height: 1.3; -} - -.cta-description { - font-size: 1.125rem; - color: #64748b; - margin-bottom: 32px; - line-height: 1.6; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .section-cta { - padding: 32px 24px; - margin: 48px 0; - } - - .cta-question { - font-size: 1.5rem; - } - - .cta-description { - font-size: 1rem; - } -} - -/* Dark Theme */ -.dark .section-cta { - background: linear-gradient(135deg, #1e293b 0%, #334155 100%); - border-color: #475569; -} - -.dark .cta-question { - color: #f1f5f9; -} - -.dark .cta-description { - color: #94a3b8; -} diff --git a/src/components/styles/ServiceFAQ.css b/src/components/styles/ServiceFAQ.css deleted file mode 100644 index 472d50f..0000000 --- a/src/components/styles/ServiceFAQ.css +++ /dev/null @@ -1,366 +0,0 @@ -.faq-section { - padding: 4rem 0; - background: #f8fafc; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 1rem; -} - -.faq-header { - margin-bottom: 3rem; -} - -.section-title { - font-size: 2.5rem; - font-weight: 700; - color: #1e293b; - margin-bottom: 1rem; -} - -.section-subtitle { - font-size: 1.25rem; - color: #64748b; - max-width: 600px; - margin: 0 auto; -} - -.faq-grid { - max-width: 800px; - margin: 0 auto; - display: flex; - flex-direction: column; - gap: 1rem; -} - -.faq-item { - background: white; - border-radius: 12px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - overflow: hidden; - transition: all 0.3s ease; - border: 1px solid #e2e8f0; -} - -.faq-item:hover { - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - transform: translateY(-1px); -} - -.faq-item.active { - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); - border-color: #3b82f6; -} - -.faq-question { - width: 100%; - padding: 1.5rem; - background: none; - border: none; - text-align: left; - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - font-size: 1.1rem; - font-weight: 600; - color: #1e293b; - transition: color 0.3s ease; -} - -.faq-question:hover { - color: #3b82f6; -} - -.faq-item.active .faq-question { - color: #3b82f6; - border-bottom: 1px solid #e2e8f0; -} - -.question-text { - flex: 1; - margin-right: 1rem; -} - -.faq-icon { - width: 24px; - height: 24px; - transition: transform 0.3s ease; - color: #3b82f6; - flex-shrink: 0; -} - -.faq-icon.rotated { - transform: rotate(180deg); -} - -.faq-answer { - max-height: 0; - overflow: hidden; - transition: max-height 0.3s ease; -} - -.faq-answer.open { - max-height: 500px; -} - -.answer-content { - padding: 0 1.5rem 1.5rem; - color: #64748b; - line-height: 1.6; -} - -.answer-content p { - margin-bottom: 1rem; -} - -.faq-features { - margin-top: 1rem; - padding: 1rem; - background: #f1f5f9; - border-radius: 8px; - border-left: 4px solid #3b82f6; -} - -.faq-features h4 { - margin-bottom: 0.75rem; - color: #3b82f6; - font-size: 0.9rem; - font-weight: 600; -} - -.faq-features ul { - list-style: none; - padding: 0; - margin: 0; -} - -.faq-features li { - padding: 0.25rem 0; - position: relative; - padding-left: 1.5rem; - color: #475569; -} - -.faq-features li::before { - content: '✅'; - position: absolute; - left: 0; - top: 0.25rem; -} - -.faq-cta { - background: white; - padding: 3rem; - border-radius: 12px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - margin-top: 3rem; - border: 1px solid #e2e8f0; -} - -.cta-title { - font-size: 1.5rem; - font-weight: 700; - margin-bottom: 1rem; - color: #1e293b; -} - -.cta-subtitle { - color: #64748b; - margin-bottom: 2rem; - font-size: 1.1rem; -} - -/* Dark theme support using CSS classes */ -:root.dark .faq-section { - background: #0f172a; -} - -:root.dark .section-title { - color: #f1f5f9; -} - -:root.dark .section-subtitle { - color: #94a3b8; -} - -:root.dark .faq-item { - background: #1e293b; - border-color: #334155; -} - -:root.dark .faq-item.active { - border-color: #60a5fa; -} - -:root.dark .faq-question { - color: #f1f5f9; -} - -:root.dark .faq-question:hover { - color: #60a5fa; -} - -:root.dark .faq-item.active .faq-question { - color: #60a5fa; - border-bottom-color: #334155; -} - -:root.dark .faq-icon { - color: #60a5fa; -} - -:root.dark .answer-content { - color: #94a3b8; -} - -:root.dark .faq-features { - background: #0f172a; - border-left-color: #60a5fa; -} - -:root.dark .faq-features h4 { - color: #60a5fa; -} - -:root.dark .faq-features li { - color: #cbd5e1; -} - -:root.dark .faq-cta { - background: #1e293b; - border-color: #334155; -} - -:root.dark .cta-title { - color: #f1f5f9; -} - -:root.dark .cta-subtitle { - color: #94a3b8; -} - -/* Light theme explicit styles (optional but good for clarity) */ -:root:not(.dark) .faq-section { - background: #f8fafc; -} - -:root:not(.dark) .section-title { - color: #1e293b; -} - -:root:not(.dark) .section-subtitle { - color: #64748b; -} - -:root:not(.dark) .faq-item { - background: white; - border-color: #e2e8f0; -} - -:root:not(.dark) .faq-item.active { - border-color: #3b82f6; -} - -:root:not(.dark) .faq-question { - color: #1e293b; -} - -:root:not(.dark) .faq-question:hover { - color: #3b82f6; -} - -:root:not(.dark) .faq-item.active .faq-question { - color: #3b82f6; - border-bottom-color: #e2e8f0; -} - -:root:not(.dark) .faq-icon { - color: #3b82f6; -} - -:root:not(.dark) .answer-content { - color: #64748b; -} - -:root:not(.dark) .faq-features { - background: #f1f5f9; - border-left-color: #3b82f6; -} - -:root:not(.dark) .faq-features h4 { - color: #3b82f6; -} - -:root:not(.dark) .faq-features li { - color: #475569; -} - -:root:not(.dark) .faq-cta { - background: white; - border-color: #e2e8f0; -} - -:root:not(.dark) .cta-title { - color: #1e293b; -} - -:root:not(.dark) .cta-subtitle { - color: #64748b; -} - -@media (max-width: 768px) { - .faq-section { - padding: 3rem 0; - } - - .section-title { - font-size: 2rem; - } - - .section-subtitle { - font-size: 1.1rem; - } - - .faq-question { - padding: 1rem; - font-size: 1rem; - } - - .answer-content { - padding: 0 1rem 1rem; - } - - .faq-cta { - padding: 2rem 1rem; - margin-top: 2rem; - } - - .cta-title { - font-size: 1.3rem; - } - - .cta-subtitle { - font-size: 1rem; - } -} - -@media (max-width: 480px) { - .container { - padding: 0 0.5rem; - } - - .faq-question { - padding: 0.75rem; - } - - .answer-content { - padding: 0 0.75rem 0.75rem; - } - - .question-text { - margin-right: 0.5rem; - } -} diff --git a/src/components/styles/ServicesSection.css b/src/components/styles/ServicesSection.css deleted file mode 100644 index 8c86f75..0000000 --- a/src/components/styles/ServicesSection.css +++ /dev/null @@ -1,30 +0,0 @@ -/* ServicesSection Styles */ -.services-grid { - display: grid; - grid-template-columns: 1fr; - gap: 2rem; - margin-bottom: 3rem; -} - -@media (min-width: 768px) { - .services-grid { - grid-template-columns: repeat(2, 1fr); - gap: 2rem; - } -} - -.services-section { - background: var(--bg-secondary); - padding: 5rem 0; -} - -.service-icon { - width: 3rem; - height: 3rem; - border-radius: 0.75rem; - display: flex; - align-items: center; - justify-content: center; - margin-right: 1rem; - flex-shrink: 0; -} diff --git a/src/components/styles/TechBadge.css b/src/components/styles/TechBadge.css deleted file mode 100644 index ee20d25..0000000 --- a/src/components/styles/TechBadge.css +++ /dev/null @@ -1,36 +0,0 @@ -/* TechBadge Styles */ - -.tech-badge { - display: inline-flex; - align-items: center; - gap: var(--space-sm); - padding: var(--space-sm) var(--space-md); - background: var(--bg-primary); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-lg); - transition: all var(--transition-fast); - white-space: nowrap; -} - -.tech-badge:hover { - box-shadow: var(--shadow-md); - transform: translateY(-1px); -} - -.tech-image { - width: 20px; - height: 20px; - object-fit: contain; - flex-shrink: 0; -} - -.tech-name { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - color: var(--text-primary); -} - -.tech-level { - font-size: var(--font-size-xs); - padding: var(--space-xs) var(--space-sm); -} diff --git a/src/components/styles/TestimonialCard.css b/src/components/styles/TestimonialCard.css deleted file mode 100644 index 05f2b75..0000000 --- a/src/components/styles/TestimonialCard.css +++ /dev/null @@ -1,330 +0,0 @@ -/* Testimonial Card - Clean Modern Design */ -.testimonial-card { - background: white; - border-radius: 16px; - padding: 32px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - border: 1px solid #e2e8f0; - height: fit-content; - transition: all 0.2s ease; -} - -.testimonial-card:hover { - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - transform: translateY(-2px); -} - -.testimonial-card.featured { - border: 2px solid #3b82f6; - position: relative; -} - -.testimonial-card.featured::after { - content: '⭐ Featured'; - position: absolute; - top: -1px; - right: -1px; - background: #3b82f6; - color: white; - padding: 4px 12px; - border-radius: 0 14px 0 12px; - font-size: 0.75rem; - font-weight: 600; -} - -/* Header */ -.testimonial-header { - display: flex; - align-items: flex-start; - gap: 16px; - margin-bottom: 24px; -} - -.client-info { - flex: 1; - display: flex; - align-items: center; - gap: 12px; -} - -.client-avatar { - width: 48px; - height: 48px; - border-radius: 50%; - overflow: hidden; - flex-shrink: 0; -} - -.client-avatar img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.client-details { - flex: 1; -} - -.client-name { - font-size: 1rem; - font-weight: 700; - color: #1e293b; - margin-bottom: 4px; - transition: color 0.3s ease; -} - -.client-role { - font-size: 0.875rem; - color: #3b82f6; - font-weight: 500; - margin-bottom: 2px; - transition: color 0.3s ease; -} - -.client-company { - font-size: 0.75rem; - color: #64748b; - transition: color 0.3s ease; -} - -/* Rating */ -.rating { - flex-shrink: 0; - text-align: right; -} - -.stars { - margin-bottom: 4px; -} - -.star { - font-size: 1rem; - color: #fbbf24; - margin-left: 1px; -} - -.star:not(.filled) { - color: #e5e7eb; -} - -.rating-text { - font-size: 0.75rem; - color: #64748b; - font-weight: 600; - transition: color 0.3s ease; -} - -/* Content */ -.testimonial-content { - margin-bottom: 24px; -} - -.testimonial-content blockquote { - font-size: 1rem; - line-height: 1.6; - color: #374151; - margin-bottom: 20px; - font-style: normal; - position: relative; - transition: color 0.3s ease; -} - -/* Project Info */ -.project-info { - margin-bottom: 16px; -} - -.project-tag { - display: inline-flex; - align-items: center; - gap: 8px; - background: #eff6ff; - color: #1e40af; - padding: 6px 12px; - border-radius: 20px; - font-size: 0.75rem; - font-weight: 600; - transition: all 0.3s ease; -} - -.project-type { - opacity: 0.8; -} - -/* Results */ -.results { - margin-bottom: 16px; -} - -.results h5 { - font-size: 0.875rem; - color: #059669; - margin-bottom: 8px; - font-weight: 600; - transition: color 0.3s ease; -} - -.results ul { - list-style: none; - padding: 0; - margin: 0; -} - -.results li { - font-size: 0.875rem; - color: #64748b; - padding: 2px 0; - position: relative; - padding-left: 20px; - transition: color 0.3s ease; -} - -.results li::before { - content: '✓'; - position: absolute; - left: 0; - color: #059669; - font-weight: bold; - transition: color 0.3s ease; -} - -/* Footer */ -.testimonial-footer { - display: flex; - justify-content: space-between; - align-items: center; - padding-top: 20px; - border-top: 1px solid #f1f5f9; - gap: 12px; - transition: border-color 0.3s ease; -} - -.badges { - display: flex; - gap: 8px; - flex-wrap: wrap; -} - -.badge { - padding: 4px 8px; - border-radius: 12px; - font-size: 0.6875rem; - font-weight: 600; -} - -.badge.featured { - background: #fef3c7; - color: #92400e; -} - -.badge.platform { - background: #f1f5f9; - color: #64748b; -} - -.testimonial-date { - font-size: 0.75rem; - color: #94a3b8; - transition: color 0.3s ease; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .testimonial-card { - padding: 24px; - } - - .testimonial-header { - flex-direction: column; - gap: 12px; - } - - .client-info { - width: 100%; - } - - .rating { - align-self: flex-start; - text-align: left; - } - - .testimonial-footer { - flex-direction: column; - align-items: flex-start; - gap: 8px; - } -} - -/* Dark Theme */ -.dark .testimonial-card { - background: #1e293b; - border-color: #334155; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.dark .testimonial-card:hover { - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); -} - -.dark .testimonial-card.featured { - border-color: #60a5fa; -} - -.dark .testimonial-card.featured::after { - background: #60a5fa; -} - -.dark .client-name { - color: #f1f5f9; -} - -.dark .client-role { - color: #60a5fa; -} - -.dark .client-company { - color: #94a3b8; -} - -.dark .rating-text { - color: #94a3b8; -} - -.dark .testimonial-content blockquote { - color: #cbd5e1; -} - -.dark .project-tag { - background: #1e40af; - color: #bfdbfe; -} - -.dark .results h5 { - color: #34d399; -} - -.dark .results li { - color: #94a3b8; -} - -.dark .results li::before { - color: #34d399; -} - -.dark .testimonial-footer { - border-top-color: #334155; -} - -.dark .badge.featured { - background: #78350f; - color: #fcd34d; -} - -.dark .badge.platform { - background: #334155; - color: #94a3b8; -} - -.dark .testimonial-date { - color: #64748b; -} diff --git a/src/components/styles/TestimonialsCTA.css b/src/components/styles/TestimonialsCTA.css deleted file mode 100644 index eb6c44f..0000000 --- a/src/components/styles/TestimonialsCTA.css +++ /dev/null @@ -1,58 +0,0 @@ -/* Testimonials CTA - Clean Modern Design */ -.testimonials-cta { - text-align: center; - background: white; - border-radius: 20px; - padding: 48px 32px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - border: 1px solid #e2e8f0; - margin-top: 40px; - transition: all 0.3s ease; -} - -.cta-title { - font-size: 1.5rem; - font-weight: 700; - color: #1e293b; - margin-bottom: 12px; - transition: color 0.3s ease; -} - -.cta-subtitle { - font-size: 1rem; - color: #64748b; - margin-bottom: 32px; - line-height: 1.6; - transition: color 0.3s ease; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .testimonials-cta { - padding: 32px 24px; - margin-top: 32px; - } - - .cta-title { - font-size: 1.25rem; - } - - .cta-subtitle { - font-size: 0.875rem; - } -} - -/* Dark Theme */ -.dark .testimonials-cta { - background: #1e293b; - border-color: #334155; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.dark .cta-title { - color: #f1f5f9; -} - -.dark .cta-subtitle { - color: #94a3b8; -} diff --git a/src/components/styles/TestimonialsSection.css b/src/components/styles/TestimonialsSection.css deleted file mode 100644 index c601a4c..0000000 --- a/src/components/styles/TestimonialsSection.css +++ /dev/null @@ -1,80 +0,0 @@ -/* Testimonials Section - Clean Modern Design */ -.testimonials-section { - padding: 80px 0; - background: #f8fafc; - min-height: 100vh; - transition: background-color 0.3s ease; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -.testimonials-header { - text-align: center; - margin-bottom: 60px; -} - -.section-title { - font-size: 2.5rem; - font-weight: 800; - color: #1e293b; - margin-bottom: 16px; - letter-spacing: -0.025em; - transition: color 0.3s ease; -} - -.section-subtitle { - font-size: 1.125rem; - color: #64748b; - max-width: 600px; - margin: 0 auto 40px; - line-height: 1.7; - transition: color 0.3s ease; -} - -/* Dark Theme */ -.dark .testimonials-section { - background: #0f172a; -} - -.dark .section-title { - color: #f1f5f9; -} - -.dark .section-subtitle { - color: #94a3b8; -} - -.testimonials-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); - gap: 30px; - margin-bottom: 60px; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .testimonials-section { - padding: 60px 0; - } - - .container { - padding: 0 16px; - } - - .section-title { - font-size: 2rem; - } - - .section-subtitle { - font-size: 1rem; - } - - .testimonials-grid { - grid-template-columns: 1fr; - gap: 20px; - } -} diff --git a/src/components/styles/TestimonialsStats.css b/src/components/styles/TestimonialsStats.css deleted file mode 100644 index 2c39ddf..0000000 --- a/src/components/styles/TestimonialsStats.css +++ /dev/null @@ -1,72 +0,0 @@ -/* Testimonials Stats - Clean Simple Design */ -.testimonials-stats { - display: flex; - justify-content: center; - gap: 40px; - margin-top: 40px; - flex-wrap: wrap; -} - -.stat-item { - text-align: center; - background: white; - padding: 30px 20px; - border-radius: 12px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - min-width: 140px; - border: 1px solid #e2e8f0; - transition: all 0.3s ease; -} - -.stat-number { - font-size: 2.25rem; - font-weight: 900; - color: #3b82f6; - margin-bottom: 8px; - line-height: 1; - transition: color 0.3s ease; -} - -.stat-label { - font-size: 0.875rem; - color: #64748b; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.05em; - transition: color 0.3s ease; -} - -/* Dark Theme */ -.dark .stat-item { - background: #1e293b; - border-color: #334155; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); -} - -.dark .stat-number { - color: #60a5fa; -} - -.dark .stat-label { - color: #94a3b8; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .testimonials-stats { - gap: 20px; - } - - .stat-item { - padding: 20px 16px; - min-width: 120px; - } - - .stat-number { - font-size: 1.875rem; - } - - .stat-label { - font-size: 0.75rem; - } -} diff --git a/src/components/styles/ThemeToggle.css b/src/components/styles/ThemeToggle.css deleted file mode 100644 index 7b70b4e..0000000 --- a/src/components/styles/ThemeToggle.css +++ /dev/null @@ -1,44 +0,0 @@ -/* ThemeToggle Styles */ - -.theme-toggle { - display: flex; - align-items: center; - justify-content: center; - width: 40px; - height: 40px; - border: none; - border-radius: var(--border-radius-lg); - background: var(--bg-secondary); - color: var(--text-secondary); - cursor: pointer; - transition: all var(--transition-fast); - position: relative; - overflow: hidden; -} - -.theme-toggle:hover { - background: var(--color-primary); - color: var(--text-inverse); - transform: scale(1.05); -} - -.theme-toggle:active { - transform: scale(0.95); -} - -.theme-icon { - width: 20px; - height: 20px; - transition: all var(--transition-fast); -} - -/* Dark mode styles */ -:global(.dark) .theme-toggle { - background: var(--bg-secondary); - color: var(--text-secondary); -} - -:global(.dark) .theme-toggle:hover { - background: var(--color-primary); - color: var(--text-inverse); -} diff --git a/src/components/testimonials/TestimonialCard.vue b/src/components/testimonials/TestimonialCard.vue deleted file mode 100644 index 27a56a2..0000000 --- a/src/components/testimonials/TestimonialCard.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - diff --git a/src/components/testimonials/TestimonialsCTA.vue b/src/components/testimonials/TestimonialsCTA.vue deleted file mode 100644 index 4d011df..0000000 --- a/src/components/testimonials/TestimonialsCTA.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/components/testimonials/TestimonialsStats.vue b/src/components/testimonials/TestimonialsStats.vue deleted file mode 100644 index 951fc63..0000000 --- a/src/components/testimonials/TestimonialsStats.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/composables/useAssets.ts b/src/composables/useAssets.ts deleted file mode 100644 index 3a69d70..0000000 --- a/src/composables/useAssets.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Composable for handling dynamic asset imports in Vite - */ -export function useAssets() { - // Pre-load all images using Vite's import.meta.glob - const imageModules = import.meta.glob('../assets/images/**/*', { eager: true }) - - /** - * Get image URL from assets folder - * @param path - Path like '@/assets/images/filename.webp' or 'filename.webp' - * @returns string - The image URL - */ - const getImageUrl = (path: string | undefined): string => { - try { - // Handle undefined or empty path - if (!path || path.trim() === '') { - console.warn('getImageUrl called with empty or undefined path') - return `https://via.placeholder.com/400x300/f3f4f6/9ca3af?text=${encodeURIComponent('No image')}` - } - - // Clean the path to get just the filename - let cleanPath = path - if (path.startsWith('@/assets/images/')) { - cleanPath = path.replace('@/assets/images/', '') - } - - // Build the full path for the module lookup - const fullPath = `../assets/images/${cleanPath}` - - // Get the image module - const imageModule = imageModules[fullPath] as { default: string } - - if (imageModule && imageModule.default) { - return imageModule.default - } - - // Fallback: try to construct URL directly - return new URL(`../assets/images/${cleanPath}`, import.meta.url).href - } catch (error) { - console.warn(`Failed to load image: ${path}`, error) - // Return a placeholder image - return `https://via.placeholder.com/400x300/f3f4f6/9ca3af?text=${encodeURIComponent('Image not found')}` - } - } - - return { - getImageUrl - } -} diff --git a/src/composables/useDateFormat.ts b/src/composables/useDateFormat.ts deleted file mode 100644 index 9bc1ecb..0000000 --- a/src/composables/useDateFormat.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { useI18n } from './useI18n' - -export function useDateFormat() { - const { currentLocale } = useI18n() - - const formatRelativeTime = (dateString: string): string => { - // Parse DD/MM/YYYY format - const [day, month, year] = dateString.split('/').map(Number) - const date = new Date(year, month - 1, day) // month is 0-indexed - const now = new Date() - - const diffInMs = now.getTime() - date.getTime() - const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24)) - const diffInMonths = Math.floor(diffInDays / 30) - const diffInYears = Math.floor(diffInDays / 365) - - if (currentLocale.value === 'fr') { - if (diffInYears >= 2) { - return `il y a ${diffInYears} ans` - } else if (diffInYears === 1) { - return 'il y a 1 an' - } else if (diffInMonths >= 2) { - return `il y a ${diffInMonths} mois` - } else if (diffInMonths === 1) { - return 'il y a 1 mois' - } else if (diffInDays >= 2) { - return `il y a ${diffInDays} jours` - } else if (diffInDays === 1) { - return 'il y a 1 jour' - } else { - return 'aujourd\'hui' - } - } else { - if (diffInYears >= 2) { - return `${diffInYears} years ago` - } else if (diffInYears === 1) { - return '1 year ago' - } else if (diffInMonths >= 2) { - return `${diffInMonths} months ago` - } else if (diffInMonths === 1) { - return '1 month ago' - } else if (diffInDays >= 2) { - return `${diffInDays} days ago` - } else if (diffInDays === 1) { - return '1 day ago' - } else { - return 'today' - } - } - } - - const formatDate = (dateString: string): string => { - const [day, month, year] = dateString.split('/').map(Number) - const date = new Date(year, month - 1, day) - - if (currentLocale.value === 'fr') { - return date.toLocaleDateString('fr-FR', { - day: '2-digit', - month: '2-digit', - year: 'numeric' - }) - } else { - return date.toLocaleDateString('en-US', { - day: '2-digit', - month: '2-digit', - year: 'numeric' - }) - } - } - - return { - formatRelativeTime, - formatDate - } -} \ No newline at end of file diff --git a/src/composables/useGallery.ts b/src/composables/useGallery.ts deleted file mode 100644 index f388b7d..0000000 --- a/src/composables/useGallery.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ref, computed } from 'vue' - -export function useGallery() { - const isOpen = ref(false) - const currentIndex = ref(0) - const images = ref([]) - - const currentImage = computed(() => images.value[currentIndex.value]) - const hasNext = computed(() => currentIndex.value < images.value.length - 1) - const hasPrevious = computed(() => currentIndex.value > 0) - - const openGallery = (galleryImages: string[], index: number = 0) => { - images.value = galleryImages - currentIndex.value = index - isOpen.value = true - // Prevent body scroll when modal is open - document.body.style.overflow = 'hidden' - } - - const closeGallery = () => { - isOpen.value = false - currentIndex.value = 0 - images.value = [] - // Restore body scroll - document.body.style.overflow = '' - } - - const nextImage = () => { - if (hasNext.value) { - currentIndex.value++ - } - } - - const previousImage = () => { - if (hasPrevious.value) { - currentIndex.value-- - } - } - - const goToImage = (index: number) => { - if (index >= 0 && index < images.value.length) { - currentIndex.value = index - } - } - - return { - isOpen, - currentIndex, - currentImage, - hasNext, - hasPrevious, - openGallery, - closeGallery, - nextImage, - previousImage, - goToImage, - images: computed(() => images.value) - } -} diff --git a/src/composables/useI18n.ts b/src/composables/useI18n.ts deleted file mode 100644 index 8c5616d..0000000 --- a/src/composables/useI18n.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useI18n as useVueI18n } from 'vue-i18n' -import { computed } from 'vue' - -export function useI18n() { - const { locale, t, availableLocales } = useVueI18n() - - const currentLocale = computed(() => locale.value) - - const isEnglish = computed(() => locale.value === 'en') - const isFrench = computed(() => locale.value === 'fr') - - const switchLocale = (newLocale: string) => { - if (availableLocales.includes(newLocale)) { - locale.value = newLocale - localStorage.setItem('locale', newLocale) - } - } - - const toggleLocale = () => { - const newLocale = locale.value === 'en' ? 'fr' : 'en' - switchLocale(newLocale) - } - - return { - t, - locale, - currentLocale, - isEnglish, - isFrench, - switchLocale, - toggleLocale, - availableLocales - } -} diff --git a/src/composables/useProjects.ts b/src/composables/useProjects.ts deleted file mode 100644 index fcf84bd..0000000 --- a/src/composables/useProjects.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { computed } from 'vue' -import { useI18n } from '@/composables/useI18n' -import type { Project } from '@/types' - -// Base project data without translations -const baseProjects: Omit[] = [ - { - id: 'virtual-tour', - image: '@/assets/images/virtualtour.webp', - technologies: ['Vue.js', 'Three.js', 'WebGL', 'Node.js'], - category: 'Web Development', - buttons: [ - { - title: 'Visit', - link: 'https://www.lycee-chabanne16.fr/visites/BACSN/index.htm' - } - ], - date: '2022' - }, - { - id: 'xinko', - image: '@/assets/images/xinko.webp', - technologies: ['Node.js', 'Discord.js', 'MongoDB', 'Express'], - category: 'Bot Development', - featured: true, - buttons: [ - { - title: 'Invite', - link: 'https://discord.com/api/oauth2/authorize?client_id=1035571329866407976&permissions=292288982151&scope=applications.commands%20bot' - } - ], - date: '2023' - }, - { - id: 'image-manipulation', - image: '@/assets/images/dig.webp', - technologies: ['JavaScript', 'Node.js', 'Canvas', 'npm'], - category: 'Open Source', - featured: true, - buttons: [ - { - title: 'Repository', - link: 'https://git.mrkayjaydee.xyz/Mr-KayJayDee/discord-image-generation' - }, - { - title: 'NPM Package', - link: 'https://www.npmjs.com/package/discord-image-generation' - } - ], - date: '2022' - }, - { - id: 'primate-web-admin', - image: '@/assets/images/primate.webp', - technologies: ['React', 'TypeScript', 'Node.js', 'Express'], - category: 'Enterprise Software', - date: '2023' - }, - { - id: 'instagram-bot', - image: '@/assets/images/instagram.webp', - technologies: ['JavaScript', 'Node.js', 'Instagram API', 'Canvas'], - category: 'Social Media Bot', - buttons: [ - { - title: 'Repository', - link: 'https://git.mrkayjaydee.xyz/Mr-KayJayDee/instagram-bot' - } - ], - date: '2022' - }, - { - id: 'crowdin-status-bot', - image: '@/assets/images/crowdin.webp', - technologies: ['Node.js', 'Discord.js', 'Crowdin API', 'Cron'], - category: 'Automation', - buttons: [ - { - title: 'Repository', - link: 'https://git.mrkayjaydee.xyz/Mr-KayJayDee/discord-crowdin-status' - } - ], - date: '2023' - }, - { - id: 'flowboard', - image: '@/assets/images/flowboard/flowboard_1.webp', - technologies: ['Vue.js', 'Node.js', 'TypeScript', 'MongoDB', 'Express'], - category: 'Web Development', - featured: true, - features: [ - 'Organize your tasks, projects and ideas by creating thematic boards adapted to your needs', - 'Add cards for each task, assign members, set due dates, and track progress at a glance', - 'Invite colleagues and teammates to join your boards to work together, share ideas, and coordinate your efforts', - 'Keep an overview of the progress of your projects thanks to a simple and intuitive interface', - 'Use labels, lists and tables to prioritize tasks, set priorities and keep the overview clear' - ], - gallery: [ - '@/assets/images/flowboard/flowboard_1.webp', - '@/assets/images/flowboard/flowboard_2.webp', - '@/assets/images/flowboard/flowboard_3.webp', - '@/assets/images/flowboard/flowboard_4.webp' - ], - date: '2024' - } -] - -export function useProjects() { - const { t } = useI18n() - - const projects = computed((): Project[] => { - return baseProjects.map(project => ({ - ...project, - title: t(`projectData.${project.id}.title`), - description: t(`projectData.${project.id}.description`), - longDescription: t(`projectData.${project.id}.longDescription`), - buttons: project.buttons?.map(button => ({ - ...button, - title: t(`projectData.${project.id}.buttons.${button.title.toLowerCase()}`, button.title) - })) || [] - })) - }) - - return { - projects: projects - } -} diff --git a/src/composables/useSeo.ts b/src/composables/useSeo.ts deleted file mode 100644 index 451da06..0000000 --- a/src/composables/useSeo.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { onMounted, onUnmounted } from 'vue' -import { useRoute } from 'vue-router' - -interface SeoOptions { - title?: string - description?: string - keywords?: string - ogTitle?: string - ogDescription?: string - ogImage?: string - ogUrl?: string - twitterCard?: string - twitterTitle?: string - twitterDescription?: string - twitterImage?: string - canonicalUrl?: string - structuredData?: object - noindex?: boolean - nofollow?: boolean -} - -export function useSeo(options: SeoOptions = {}) { - const route = useRoute() - const originalTitle = document.title - const metaElements: HTMLMetaElement[] = [] - const linkElements: HTMLLinkElement[] = [] - const scriptElements: HTMLScriptElement[] = [] - - const setTitle = (title: string) => { - document.title = title - setMetaTag('og:title', title, true) - setMetaTag('twitter:title', title, true) - } - - const setMetaTag = (name: string, content: string, property?: boolean) => { - let meta = document.querySelector(`meta[${property ? 'property' : 'name'}="${name}"]`) as HTMLMetaElement - - if (!meta) { - meta = document.createElement('meta') - if (property) { - meta.setAttribute('property', name) - } else { - meta.setAttribute('name', name) - } - document.head.appendChild(meta) - metaElements.push(meta) - } - - meta.setAttribute('content', content) - } - - const setLinkTag = (rel: string, href: string) => { - let link = document.querySelector(`link[rel="${rel}"]`) as HTMLLinkElement - - if (!link) { - link = document.createElement('link') - link.setAttribute('rel', rel) - document.head.appendChild(link) - linkElements.push(link) - } - - link.setAttribute('href', href) - } - - const setStructuredData = (data: object) => { - const script = document.createElement('script') - script.type = 'application/ld+json' - script.textContent = JSON.stringify(data) - document.head.appendChild(script) - scriptElements.push(script) - } - - onMounted(() => { - // Set title with site name suffix - if (options.title) { - const fullTitle = options.title.includes('Killian') ? options.title : `${options.title} | Killian - Full Stack Developer` - setTitle(fullTitle) - } - - // Set description - if (options.description) { - setMetaTag('description', options.description) - setMetaTag('og:description', options.ogDescription || options.description, true) - setMetaTag('twitter:description', options.twitterDescription || options.description, true) - } - - // Set keywords - if (options.keywords) { - setMetaTag('keywords', options.keywords) - } - - // Set Open Graph tags - if (options.ogTitle) { - setMetaTag('og:title', options.ogTitle, true) - } - - if (options.ogImage) { - setMetaTag('og:image', options.ogImage, true) - setMetaTag('twitter:image', options.twitterImage || options.ogImage, true) - } - - if (options.ogUrl || route) { - const url = options.ogUrl || `https://killiandalcin.fr${route.path}` - setMetaTag('og:url', url, true) - setMetaTag('twitter:url', url, true) - } - - // Set Twitter Card - setMetaTag('twitter:card', options.twitterCard || 'summary_large_image', true) - - // Set canonical URL - if (options.canonicalUrl || route) { - const canonicalUrl = options.canonicalUrl || `https://killiandalcin.fr${route.path}` - setLinkTag('canonical', canonicalUrl) - } - - // Set robots meta - const robotsContent = [] - if (options.noindex) robotsContent.push('noindex') - if (options.nofollow) robotsContent.push('nofollow') - if (robotsContent.length === 0) robotsContent.push('index', 'follow') - setMetaTag('robots', robotsContent.join(', ')) - - // Set default Open Graph type - setMetaTag('og:type', 'website', true) - setMetaTag('og:site_name', 'Killian Portfolio', true) - - // Set structured data - if (options.structuredData) { - setStructuredData(options.structuredData) - } - - // Default structured data for breadcrumbs - if (route && route.name !== 'home') { - const breadcrumbData = { - '@context': 'https://schema.org', - '@type': 'BreadcrumbList', - 'itemListElement': [ - { - '@type': 'ListItem', - 'position': 1, - 'name': 'Home', - 'item': 'https://killiandalcin.fr' - }, - { - '@type': 'ListItem', - 'position': 2, - 'name': options.title || route.name, - 'item': `https://killiandalcin.fr${route.path}` - } - ] - } - setStructuredData(breadcrumbData) - } - }) - - onUnmounted(() => { - // Restore original title - document.title = originalTitle - - // Remove meta tags we added - metaElements.forEach(meta => { - if (meta.parentNode) { - meta.parentNode.removeChild(meta) - } - }) - - // Remove link tags we added - linkElements.forEach(link => { - if (link.parentNode) { - link.parentNode.removeChild(link) - } - }) - - // Remove script tags we added - scriptElements.forEach(script => { - if (script.parentNode) { - script.parentNode.removeChild(script) - } - }) - }) - - return { - setTitle, - setMetaTag, - setLinkTag, - setStructuredData - } -} diff --git a/src/composables/useSiteConfig.ts b/src/composables/useSiteConfig.ts deleted file mode 100644 index 53331fc..0000000 --- a/src/composables/useSiteConfig.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { computed } from 'vue' -import { useI18n } from '@/composables/useI18n' -import { siteConfig as baseSiteConfig } from '@/config/site' - -export function useSiteConfig() { - const { t } = useI18n() - - const siteConfig = computed(() => ({ - ...baseSiteConfig, - title: t('seo.home.title'), - description: t('seo.home.description'), - contact: { - ...baseSiteConfig.contact - }, - fiverr: { - ...baseSiteConfig.fiverr - } - })) - - return { - siteConfig - } -} diff --git a/src/composables/useTheme.ts b/src/composables/useTheme.ts deleted file mode 100644 index 77816b2..0000000 --- a/src/composables/useTheme.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { ref, watch, onMounted } from 'vue' - -export type Theme = 'light' | 'dark' - -const isDark = ref(false) - -export function useTheme() { - const toggleTheme = () => { - isDark.value = !isDark.value - } - - const setTheme = (theme: Theme) => { - isDark.value = theme === 'dark' - } - - const getTheme = (): Theme => { - return isDark.value ? 'dark' : 'light' - } - - // Apply theme to document - const applyTheme = () => { - if (typeof document !== 'undefined') { - document.documentElement.classList.toggle('dark', isDark.value) - document.documentElement.setAttribute('data-theme', getTheme()) - } - } - - // Save theme to localStorage - const saveTheme = () => { - if (typeof localStorage !== 'undefined') { - localStorage.setItem('theme', getTheme()) - } - } - - // Load theme from localStorage or default to dark mode - const loadTheme = () => { - if (typeof window !== 'undefined') { - const savedTheme = localStorage.getItem('theme') as Theme | null - - if (savedTheme) { - setTheme(savedTheme) - } else { - // Default to dark mode instead of system preference - setTheme('dark') - } - } - } - - // Watch for theme changes - watch(isDark, () => { - applyTheme() - saveTheme() - }) - - // Initialize theme on mount - onMounted(() => { - loadTheme() - applyTheme() - }) - - return { - isDark, - toggleTheme, - setTheme, - getTheme - } -} diff --git a/src/config/site.ts b/src/config/site.ts deleted file mode 100644 index 1cfedbd..0000000 --- a/src/config/site.ts +++ /dev/null @@ -1,170 +0,0 @@ -export interface SocialLink { - name: string - url: string - icon: string - username?: string -} - -export interface ContactInfo { - email: string - phone: string - location: string -} - -export interface FiverrService { - id: string - url: string - image: string - price: string -} - -export interface FiverrConfig { - profileUrl: string - services: FiverrService[] -} - -export interface SiteConfig { - name: string - title: string - description: string - author: string - contact: ContactInfo - social: SocialLink[] - fiverr: FiverrConfig - url: string - seo: { - defaultImage: string - twitterHandle: string - locale: string - alternateLocales: string[] - internalLinks: { - priority: { url: string; text: string; priority: number }[] - services: { url: string; text: string }[] - } - organization: { - '@type': string - name: string - logo: string - priceRange: string - aggregateRating: { - ratingValue: string - reviewCount: string - } - } - } - performance: { - enablePrefetch: boolean - enablePreconnect: boolean - criticalCSS: boolean - lazyLoadImages: boolean - webpSupport: boolean - } -} - -export const siteConfig: SiteConfig = { - name: 'Killian', - title: 'Killian - Full Stack Developer | Vue.js, React, Node.js Expert', - description: '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.', - author: 'Killian', - url: 'https://killiandalcin.fr', - - contact: { - email: 'contact@killiandalcin.fr', - phone: '+33 6 49 19 38 16', - location: 'France' - }, - - social: [ - { - name: 'Gitea', - url: 'https://gitea.kamisama.ovh/kayjaydee', - icon: 'github', - username: 'kayjaydee' - }, - { - name: 'LinkedIn', - url: 'https://linkedin.com/in/killian-dal-cin', - icon: 'linkedin', - username: 'killian-dalcin' - }, - { - name: 'Discord', - url: 'https://discord.com/users/370940770225618954', - icon: 'discord', - username: 'kayjaydee' - }, - { - name: 'Email', - url: 'mailto:contact@killiandalcin.fr', - icon: 'email' - } - ], - - fiverr: { - profileUrl: 'https://www.fiverr.com/users/mr_kayjaydee', - services: [ - { - id: 'discord-bot', - url: 'https://www.fiverr.com/s/rEDa84j', - image: '@/assets/images/fiverr/discord_bot.webp', - price: '$25' - }, - { - id: 'minecraft-plugin', - url: 'https://www.fiverr.com/s/xXVY20Q', - image: '@/assets/images/fiverr/minecraft_plugin.webp', - price: '$50' - }, - { - id: 'telegram-bot', - url: '#', - image: '@/assets/images/fiverr/telegram_bot.webp', - price: '$20' - }, - { - id: 'website-development', - url: '#', - image: '@/assets/images/fiverr/website.webp', - price: '$50' - } - ] - }, - - seo: { - defaultImage: '/portfolio-preview.webp', - twitterHandle: '@killiandalcin', - locale: 'en_US', - alternateLocales: ['fr_FR'], - internalLinks: { - priority: [ - { url: '/fiverr', text: 'Services Fiverr', priority: 0.9 }, - { url: '/projects', text: 'Portfolio', priority: 0.8 }, - { url: '/contact', text: 'Contact', priority: 0.8 } - ], - services: [ - { url: '/fiverr#discord-bot', text: 'Bot Discord' }, - { url: '/fiverr#minecraft-plugin', text: 'Plugin Minecraft' }, - { url: '/fiverr#telegram-bot', text: 'Bot Telegram' }, - { url: '/fiverr#website-development', text: 'Développement Web' } - ] - }, - organization: { - '@type': 'ProfessionalService', - name: 'Killian Dalcin - Développeur Full Stack', - logo: 'https://killiandalcin.fr/logo.webp', - priceRange: '€€€', - aggregateRating: { - ratingValue: '5', - reviewCount: '50' - } - } - }, - - performance: { - enablePrefetch: true, - enablePreconnect: true, - criticalCSS: true, - lazyLoadImages: true, - webpSupport: true - } -} diff --git a/src/data/faq.ts b/src/data/faq.ts deleted file mode 100644 index a0031f2..0000000 --- a/src/data/faq.ts +++ /dev/null @@ -1,27 +0,0 @@ -// FAQ Data for Home Page -export interface FAQ { - question: string - answer: string - features: string[] -} - -// Function to get translated FAQs -export const getHomeFAQs = (t: (key: string) => string | string[]): FAQ[] => { - return [ - { - question: t('faq.homeFaq.delivery.question') as string, - answer: t('faq.homeFaq.delivery.answer') as string, - features: t('faq.homeFaq.delivery.features') as string[] - }, - { - question: t('faq.homeFaq.maintenance.question') as string, - answer: t('faq.homeFaq.maintenance.answer') as string, - features: t('faq.homeFaq.maintenance.features') as string[] - }, - { - question: t('faq.homeFaq.companies.question') as string, - answer: t('faq.homeFaq.companies.answer') as string, - features: t('faq.homeFaq.companies.features') as string[] - } - ] -} diff --git a/src/data/techstack.ts b/src/data/techstack.ts deleted file mode 100644 index 1c3fb1d..0000000 --- a/src/data/techstack.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { TechStack } from '@/types' - -export const techStack: TechStack = { - programming: [ - { name: 'JavaScript', level: 'Advanced', image: '@/assets/images/javascript.webp' }, - { name: 'TypeScript', level: 'Advanced', image: '@/assets/images/typescript.webp' }, - { name: 'Node.js', level: 'Advanced', image: '@/assets/images/nodejs.webp' }, - { name: 'Bash', level: 'Intermediate', image: '@/assets/images/bash.webp' }, - { name: 'Markdown', level: 'Advanced', image: '@/assets/images/markdown.webp' }, - { name: 'Ruby', level: 'Intermediate', image: '@/assets/images/ruby.webp' }, - { name: 'Ruby on Rails', level: 'Intermediate', image: '@/assets/images/rubyonrails.webp' }, - ], - front: [ - { name: 'Vue.js', level: 'Advanced', image: '@/assets/images/vuejs.webp' }, - { name: 'React', level: 'Intermediate', image: '@/assets/images/react.webp' }, - { name: 'Angular', level: 'Intermediate', image: '@/assets/images/angular.webp' }, - { name: 'HTML', level: 'Advanced', image: '@/assets/images/html.webp' }, - { name: 'CSS', level: 'Advanced', image: '@/assets/images/css.webp' }, - { name: 'Figma', level: 'Advanced', image: '@/assets/images/figma.webp' }, - { name: 'WordPress', level: 'Intermediate', image: '@/assets/images/wordpress.webp' } - ], - database: [ - { name: 'MongoDB', level: 'Advanced', image: '@/assets/images/mongodb.webp' }, - { name: 'MySQL', level: 'Advanced', image: '@/assets/images/mysql.webp' }, - { name: 'Redis', level: 'Advanced', image: '@/assets/images/redis.webp' }, - { name: 'SQLite', level: 'Advanced', image: '@/assets/images/sqlite.webp' }, - { name: 'PostgreSQL', level: 'Advanced', image: '@/assets/images/postgresql.webp' }, - { name: 'Bootstrap', level: 'Intermediate', image: '@/assets/images/bootstrap.webp' }, - { name: 'Tailwind CSS', level: 'Intermediate', image: '@/assets/images/tailwindcss.webp' } - ], - devtools: [ - { name: 'Git', level: 'Advanced', image: '@/assets/images/git.webp' }, - { name: 'GitHub', level: 'Advanced', image: '@/assets/images/github.webp' }, - { name: 'GitLab', level: 'Advanced', image: '@/assets/images/gitlab.webp' }, - { name: 'GitKraken', level: 'Advanced', image: '@/assets/images/gitkraken.webp' }, - { name: 'Visual Studio Code', level: 'Advanced', image: '@/assets/images/vscode.webp' }, - { name: 'Atom', level: 'Advanced', image: '@/assets/images/atom.webp' }, - { name: 'Docker', level: 'Advanced', image: '@/assets/images/docker.webp' }, - { name: 'npm', level: 'Advanced', image: '@/assets/images/npm.webp' }, - { name: 'Postman', level: 'Advanced', image: '@/assets/images/postman.webp' }, - { name: 'FileZilla', level: 'Advanced', image: '@/assets/images/filezilla.webp' }, - { name: 'Termius', level: 'Advanced', image: '@/assets/images/termius.webp' }, - { name: 'HeidiSQL', level: 'Advanced', image: '@/assets/images/heidisql.webp' }, - { name: 'MySQL Workbench', level: 'Advanced', image: '@/assets/images/mysqlworkbench.webp' }, - { name: 'Sequel Pro', level: 'Intermediate', image: '@/assets/images/sequelpro.webp' } - ], - operating_systems: [ - { name: 'Linux', level: 'Advanced', image: '@/assets/images/linux.webp' }, - { name: 'Ubuntu', level: 'Advanced', image: '@/assets/images/ubuntu.webp' }, - { name: 'Debian', level: 'Advanced', image: '@/assets/images/debian.webp' }, - { name: 'Arch Linux', level: 'Intermediate', image: '@/assets/images/archlinux.webp' }, - { name: 'Kali Linux', level: 'Intermediate', image: '@/assets/images/kalilinux.webp' }, - { name: 'Deepin', level: 'Intermediate', image: '@/assets/images/deepin.webp' }, - { name: 'Windows', level: 'Advanced', image: '@/assets/images/windows.webp' }, - { name: 'macOS', level: 'Advanced', image: '@/assets/images/macos.webp' }, - { name: 'Android', level: 'Advanced', image: '@/assets/images/android.webp' }, - { name: 'iOS', level: 'Intermediate', image: '@/assets/images/ios.webp' }, - { name: 'Wear OS', level: 'Intermediate', image: '@/assets/images/wearos.webp' }, - { name: 'watchOS', level: 'Intermediate', image: '@/assets/images/watchos.webp' } - ], - socials: [ - { name: 'Discord', level: 'Advanced', image: '@/assets/images/discord.webp' }, - { name: 'Instagram', level: 'Advanced', image: '@/assets/images/instagram.webp' }, - { name: 'LinkedIn', level: 'Advanced', image: '@/assets/images/linkedin.webp' }, - { name: 'Twitter', level: 'Advanced', image: '@/assets/images/twitter.webp' }, - { name: 'Reddit', level: 'Advanced', image: '@/assets/images/reddit.webp' }, - { name: 'Facebook', level: 'Advanced', image: '@/assets/images/facebook.webp' }, - { name: 'Messenger', level: 'Advanced', image: '@/assets/images/messenger.webp' }, - { name: 'WhatsApp', level: 'Advanced', image: '@/assets/images/whatsapp.webp' }, - { name: 'Telegram', level: 'Advanced', image: '@/assets/images/telegram.webp' } - ] -} diff --git a/src/data/testimonials.ts b/src/data/testimonials.ts deleted file mode 100644 index a0675b8..0000000 --- a/src/data/testimonials.ts +++ /dev/null @@ -1,104 +0,0 @@ -// Real Fiverr Reviews Data -export interface Testimonial { - name: string - role: string - company: string - avatar: string - rating: number - content: string - date: string - platform: string - featured?: boolean - project_type: string - results?: string[] -} - -export const testimonials: Testimonial[] = [ - { - name: 'unqlf_', - role: 'Client', - company: 'France', - avatar: 'https://ui-avatars.com/api/?name=U&background=3b82f6&color=ffffff&size=128', - rating: 5, - content: 'Je conseil ce vendeur il écoute clairement les conseils, les informations qu\'on lui donne, il mérite clairement son niveau dans le développement et prend en compte chaque erreur.', - date: '15/03/2023', - platform: 'Fiverr', - featured: true, - project_type: 'Plugin Minecraft', - results: [ - 'Prix: Jusqu\'à 50€', - 'Durée: 10 jours', - 'Écoute client excellente' - ] - }, - { - name: 'colo263', - role: 'Client', - company: 'France', - avatar: 'https://ui-avatars.com/api/?name=C&background=059669&color=ffffff&size=128', - rating: 5, - content: 'Travail excellent, Communication au top, Disponible en tout temps, réactif et à l\'écoute je le recommande vivement et reviendrai vers lui si je dois refaire un projet similaire !', - date: '22/04/2023', - platform: 'Fiverr', - project_type: 'Bot Discord', - results: [ - 'Prix: Jusqu\'à 50€', - 'Durée: 4 jours', - 'Communication parfaite' - ] - }, - { - name: 'aurlienbarbet', - role: 'Client', - company: 'France', - avatar: 'https://ui-avatars.com/api/?name=A&background=dc2626&color=ffffff&size=128', - rating: 5, - content: 'Le prestataire est très professionnel, prêt à faire l\'offre la plus juste et à ajuster un prix pour votre commande. Réponds à tout les questions ! une bonne expérience pour ma part', - date: '08/06/2023', - platform: 'Fiverr', - project_type: 'Bot Discord', - results: [ - 'Prix: Jusqu\'à 50€', - 'Durée: 1 jour', - 'Prix ajusté sur mesure' - ] - }, - { - name: 'cobra2', - role: 'Client', - company: 'France', - avatar: 'https://ui-avatars.com/api/?name=C&background=7c3aed&color=ffffff&size=128', - rating: 5, - content: 'Excellent développeur, la commande fut plus rapide que prévu la communication est instantané et le résultat est parfait. Je recommande fortement et reviendrai sûrement pour des mise à jour !', - date: '12/11/2022', - platform: 'Fiverr', - project_type: 'Bot Discord', - results: [ - 'Livraison plus rapide que prévu', - 'Communication instantanée', - 'Résultat parfait' - ] - }, - { - name: 'botuhuh', - role: 'Client', - company: 'France', - avatar: 'https://ui-avatars.com/api/?name=B&background=ea580c&color=ffffff&size=128', - rating: 5, - content: 'awesome guy, I recommend, thanks again !!!!', - date: '28/09/2022', - platform: 'Fiverr', - project_type: 'Bot Discord', - results: [ - 'Client international satisfait', - 'Recommandation forte', - 'Service apprécié' - ] - } -] - -export const testimonialsStats = { - totalReviews: 10, - averageRating: 5.0, - projectsCompleted: 25 -} diff --git a/src/i18n/index.ts b/src/i18n/index.ts deleted file mode 100644 index 81e273e..0000000 --- a/src/i18n/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createI18n } from 'vue-i18n' -import en from '@/locales/en' -import fr from '@/locales/fr' - -// Get the saved locale from localStorage or default to English -const savedLocale = localStorage.getItem('locale') || 'en' - -const i18n = createI18n({ - legacy: false, - locale: savedLocale, - fallbackLocale: 'en', - messages: { - en, - fr - } -}) - -export default i18n diff --git a/src/locales/en.ts b/src/locales/en.ts deleted file mode 100644 index 9b2a9cd..0000000 --- a/src/locales/en.ts +++ /dev/null @@ -1,517 +0,0 @@ -export default { - // Navigation - nav: { - home: 'Home', - projects: 'Portfolio Projects', - about: 'About', - contact: 'Contact', - formation: 'Training', - fiverr: 'Fiverr Services' - }, - - // Home page - home: { - title: '🚀 Expert Full Stack Developer for Hire | Vue.js, React & Node.js Specialist', - subtitle: 'I turn your ideas into high-performance web apps that drive real results. Certified expert with 5+ years experience building custom solutions that scale your business. ⭐ 100% client satisfaction ⏱️ Fast delivery guaranteed', - cta: { - viewProjects: '🎯 Explore My Success Stories', - contactMe: '💬 Get Free Quote in 24h' - }, - featuredProjects: { - title: 'Web Applications That Deliver Results 🏆', - subtitle: 'Portfolio of real projects that transformed ideas into success. Lightning-fast Vue.js apps, scalable React platforms, robust Node.js APIs. Every project = proven ROI for my clients.', - viewAll: 'Explore All Projects →' - }, - services: { - title: 'Premium Web Development Services 💎', - subtitle: 'Turnkey solutions that boost your growth. Cutting-edge technologies + proven methodology = guaranteed success for your digital project.', - webDev: { - title: '⚡ Custom Vue.js/React Web Applications', - description: 'Lightning-fast web apps that convert visitors into customers. Modern SPAs, offline-first PWAs, high-conversion e-commerce. SEO-friendly from day one.' - }, - mobileApps: { - title: '📱 Cost-Effective Cross-Platform Mobile Apps', - description: 'One codebase = iOS + Android + Web. React Native for performant native apps. 60% cost savings vs native development. Push notifications, geolocation, integrated payments.' - }, - optimization: { - title: '🚀 Performance & Technical SEO Optimization', - description: 'Boost your Google visibility and conversions. Optimized Core Web Vitals, <2s load time. Free SEO audit included. Average +250% organic traffic growth.' - }, - maintenance: { - title: '🛡️ Proactive Maintenance & 24/7 Support', - description: 'Sleep well while I watch over your apps. Real-time monitoring, automatic security patches, daily backups. <2h emergency response. 99.9% uptime guaranteed.' - } - }, - cta2: { - title: 'Looking for a Full Stack Developer?', - subtitle: 'Let\'s discuss your project requirements and build something amazing together.', - startProject: 'Start a Conversation', - learnMore: '🎯 Explore My Success Stories' - } - }, - - // Projects page - projects: { - title: 'Web Development Portfolio', - subtitle: 'Browse my full stack development projects featuring Vue.js applications, React websites, Node.js APIs, Discord bots, and enterprise software solutions. Real-world examples of clean code and modern architecture.', - categories: { - all: 'All Projects', - 'webdevelopment': 'Web Development', - 'botdevelopment': 'Bot Development', - 'opensource': 'Open Source', - 'enterprisesoftware': 'Enterprise Software', - 'socialmediabot': 'Social Media Bots', - 'automation': 'Automation Tools' - }, - buttons: { - website: 'Live Website', - repository: 'Source Code', - npmpackage: 'NPM Package', - viewProject: 'View Details' - }, - projectDetail: { - backToProjects: 'Back to Projects', - viewDemo: 'View Demo', - sourceCode: 'Source Code', - share: 'Share', - aboutProject: 'About the Project', - keyFeatures: 'Key Features', - technologiesUsed: 'Technologies Used', - gallery: 'Gallery', - projectInfo: 'Project Information', - date: 'Date', - category: 'Category', - status: 'Status', - relatedProjects: 'Related Projects' - }, - noResults: { - title: 'No projects found', - description: 'Try modifying your search or filter criteria.' - } - }, - - // About page - about: { - title: 'About Killian - Full Stack Developer', - subtitle: 'Experienced web developer passionate about Vue.js, React, Node.js, and modern JavaScript technologies.', - intro: { - title: 'Professional Full Stack Developer', - content: 'I\'m Killian, an experienced full stack developer specializing in JavaScript technologies. With expertise in Vue.js, React, Node.js, and TypeScript, I create scalable web applications, RESTful APIs, and real-time systems that exceed client expectations.' - }, - skills: { - title: 'Technical Skills & Expertise', - programming: 'Programming Languages', - frontend: 'Frontend Technologies', - backend: 'Backend Technologies', - tools: 'DevOps & Tools', - systems: 'Operating Systems' - }, - experience: { - title: 'Professional Experience', - content: 'Years of professional web development experience building enterprise applications, e-commerce platforms, SaaS products, and custom software solutions. Proven track record of delivering high-quality code on time and within budget.' - }, - approach: { - title: 'Development Philosophy', - subtitle: 'My approach to full stack development focuses on clean code, scalable architecture, and exceptional user experience.', - performance: { - title: 'Performance-First Development', - description: 'Optimized code, lazy loading, code splitting, and caching strategies. Achieving perfect Lighthouse scores and Core Web Vitals metrics.' - }, - architecture: { - title: 'Scalable Architecture', - description: 'Microservices, serverless functions, and modular design patterns. Building applications that scale effortlessly with your business growth.' - }, - quality: { - title: 'Code Quality & Testing', - description: 'Test-driven development (TDD), automated testing, continuous integration (CI/CD), and comprehensive code reviews ensuring bug-free deployments.' - }, - collaboration: { - title: 'Agile Collaboration', - description: 'Excellent communication, agile methodologies, and transparent project management. Regular updates and collaborative problem-solving.' - } - }, - cta: { - title: 'Looking for a Full Stack Developer?', - description: 'Let\'s discuss your project requirements and build something amazing together.', - button: 'Start a Conversation' - } - }, - - // Fiverr page - fiverr: { - title: '🔥 Premium Fiverr Services - 5⭐ Top Rated Developer', - subtitle: '✅ 500+ orders delivered ✅ 100% satisfaction rate ✅ <1h response time ✅ 24/7 support. Certified expert in Discord bots, Minecraft plugins & web development. Transform your ideas into reality TODAY!', - profileCta: '🎯 Order Now on Fiverr', - stats: { - rating: 'Perfect 5⭐ Rating' - }, - pricing: { - startingAt: 'From' - }, - services: { - title: '💎 Premium Services That Deliver', - subtitle: 'Professional solutions delivered in record time. Every service includes: ✅ Full source code ✅ Detailed documentation ✅ 30-day support ✅ Unlimited revisions', - features: 'What\'s Included', - orderNow: '🚀 Order This Service', - learnMore: 'View All Details', - moreFeatures: 'premium benefits included', - comingSoon: 'Available Soon', - available: '🟢 Available Now' - }, - serviceData: { - 'discord-bot': { - title: '🤖 All-In-One Discord Bot | #1 Best-Seller', - description: 'The Discord bot of your dreams, coded by an expert. Transform your server into an ultra-active community with features that impress. 1000+ bots delivered, 100% happy clients!', - features: [ - '⚡ Advanced AI moderation system (anti-spam, anti-raid, smart auto-mod)', - '🎮 Addictive mini-games: casino, RPG, quiz with global leaderboards', - '🎵 HD music player: Spotify, YouTube, SoundCloud with saved playlists', - '🎨 Modern web interface for easy configuration (React dashboard included)', - '☁️ FREE premium VPS hosting for 3 months ($150 value)' - ] - }, - 'minecraft-plugin': { - title: '⛏️ Premium Minecraft Java Plugin | Spigot/Paper Expert', - description: 'Custom Minecraft plugins that transform your server into a unique experience. Compatible 1.8 → 1.20+, optimized for large servers (1000+ players). Your competitive advantage!', - features: [ - '🎯 Revolutionary gameplay: procedural dungeons, custom bosses, magic spells', - '💰 Advanced economy: GUI shops, auction house, jobs with XP system', - '🏆 Progression systems: levels, skills, customizable RPG classes', - '💾 Optimized MySQL/Redis database for maximum performance', - '🌍 Multi-server ready: BungeeCord/Velocity with synchronization' - ] - }, - 'telegram-bot': { - title: '💬 Pro Business Telegram Bot | Powerful Automation', - description: 'Professional Telegram bot that boosts your business. Perfect for e-commerce, customer support, communities. Modern interface, 0 code required for usage!', - features: [ - '🤖 Conversational AI: integrated ChatGPT for natural responses', - '🛒 Complete e-commerce: product catalog, cart, Stripe/PayPal payments', - '📢 Smart broadcasting: user segments, A/B testing, analytics', - '🌐 Automatic multi-language with DeepL detection and translation', - '🔐 Maximum security: 2FA, encryption, GDPR compliant' - ] - }, - 'website-development': { - title: '🌟 Premium Vue.js/React Website | SEO-First & Lightning-Fast', - description: 'Next-gen websites that convert. Premium design, maximum performance, SEO optimized. Your #1 competitor on Google in 90 days or money back!', - features: [ - '🎨 Premium UI/UX design: Figma mockups + modern animations', - '⚡ Extreme performance: <1.5s load time', - '📱 Perfect responsive: tested on 50+ different devices', - '🔍 Supercharged SEO: schema markup, sitemap, optimized meta', - '🛒 E-commerce ready: Stripe, PayPal, crypto (if needed)' - ] - } - }, - testimonials: { - title: '🌟 They Transformed Their Business With My Services', - subtitle: 'Join 500+ satisfied entrepreneurs. Average rating 5.0/5.0 across all my services. Quality speaks for itself!' - }, - cta: { - title: '🎯 Stop Searching, You Found THE Right Developer', - subtitle: '⏰ Every day without action = lost opportunities. Launch your project NOW and get ahead of your competitors. Limited spots this month!', - button: '🔥 Book My Order Now' - } - }, - - // Contact page - contact: { - title: 'Contact Full Stack Developer', - subtitle: 'Get in touch for web development projects, freelance work, or technical consultation. Free project estimation and consultation available.', - stats: { - responseTime: 'Quick Response', - satisfaction: 'Client Satisfaction', - collaboration: 'Global Reach' - }, - quickContact: 'Quick Contact', - findMeOn: 'Connect on Social Media', - methods: { - email: 'Email Address', - phone: 'Phone Number', - location: 'Location', - responseTime: 'Response within 24 hours', - availability: 'Available for remote & freelance' - }, - faq: { - title: 'Frequently Asked Questions', - subtitle: 'Common questions about my web development services and working process.', - responseTime: { - title: 'What\'s your typical response time?', - description: 'I respond to all inquiries within 24 hours. For urgent projects, I\'m available for immediate consultation.' - }, - projectTypes: { - title: 'What types of projects do you handle?', - description: 'Full stack web applications, REST APIs, Discord bots, e-commerce sites, SaaS platforms, and custom software solutions using modern technologies.' - }, - collaboration: { - title: 'Do you work remotely?', - description: 'Yes, I work with clients worldwide. Remote collaboration via Slack, Discord, Zoom, and project management tools. Flexible timezone availability.' - } - }, - form: { - name: 'Your Name', - email: 'Email Address', - subject: 'Project Subject', - message: 'Project Details', - send: 'Send Message', - sending: 'Sending...', - success: 'Message sent successfully! I\'ll respond within 24 hours.', - error: 'Error sending message. Please try again or email directly.', - required: 'This field is required', - invalidEmail: 'Please enter a valid email address' - }, - info: { - title: 'Let\'s Build Something Great', - description: 'Whether you need a Vue.js application, React website, Node.js API, or custom software solution, I\'m here to help bring your vision to life.', - email: 'Email', - social: 'Social Profiles' - } - }, - - // Project data - projectData: { - 'virtual-tour': { - title: 'Virtual Tour - Interactive 360° Experience', - description: 'My high school teacher and me had an idea to create a Virtual tour with 360° videos to allow everyone to visit the school from the web.', - longDescription: 'Collaborative project with my high school teacher to create an immersive virtual tour experience of our school. Uses 360° videos to provide interactive navigation and allow prospective students and parents to explore the school facilities remotely. Intuitive interface enabling exploration of different spaces: classrooms, laboratories, common areas, and sports facilities.', - buttons: { - visit: 'Visit' - } - }, - 'xinko': { - title: 'Xinko - Multipurpose Discord Bot', - description: 'Xinko is a multipurpose bot that can help you create and manage your discord servers with ease and fun. It has many commands and features.', - longDescription: 'Comprehensive Discord bot designed to simplify server management. Xinko offers a wide range of commands for moderation, entertainment, utility, and community management. User-friendly interface with advanced permission system, modern slash commands, and integration with various APIs. Perfect for communities of all sizes looking to automate and enhance their Discord experience.', - buttons: { - invite: 'Invite' - } - }, - 'image-manipulation': { - title: 'Image Manipulation - NPM Package', - description: 'Discord Image Generation: NPM package for code-based image manipulation. Originally an API, now open-source.', - longDescription: 'Open-source NPM package for programmatic image generation and manipulation. Originally developed as a proprietary API, then made available to the community. Offers advanced image processing features: meme generation, filters, visual effects, and custom compositions. Particularly popular in the Discord bot ecosystem for creating dynamic and interactive visual content.', - buttons: { - repository: 'Repository', - 'npm package': 'NPM Package' - } - }, - 'primate-web-admin': { - title: 'Primate Web Admin - Management Interface', - description: 'Primate Web Admin is a Web interface to manage Primate that is a Munki-like deployment tool for Windows.', - longDescription: 'Modern web administration interface for Primate, a software deployment system for Windows environments. Inspired by Munki (macOS solution), Primate Web Admin offers centralized management of software deployments on Windows infrastructure. Intuitive interface for package management, update scheduling, client monitoring, and detailed reporting generation.', - buttons: {} - }, - 'instagram-bot': { - title: 'Instagram Bot - Full Automation', - description: 'Fully functional Instagram bot using Insta.js by androz2091. It has many commands. Generate images with commands like: !stonk or !invert.', - longDescription: 'Instagram automation bot developed with androz2091\'s Insta.js library. Offers a complete range of automation features: content publishing, follower interaction, custom image generation, and direct message management. Includes specialized commands for meme creation and visual effects (!stonk, !invert) as well as moderation tools and performance analytics.', - buttons: { - repository: 'Repository' - } - }, - 'crowdin-status-bot': { - title: 'Crowdin Status Bot - Translation Tracker', - description: 'A bot that fetches Crowdin translation status and updates Discord messages with the latest status. Stay informed on progress!', - longDescription: 'Discord bot specialized in automatic monitoring of Crowdin translation projects. Connects to Crowdin API to retrieve real-time progress statistics and automatically updates Discord messages with the latest information. Essential tool for localization teams and multilingual open-source projects, keeping the community informed about translation progress and encouraging contributor participation.', - buttons: { - repository: 'Repository' - } - }, - 'flowboard': { - title: 'FlowBoard - Trello clone', - description: 'FlowBoard is a complete project management solution for streamlining tasks, team collaboration, timeline management, and progress tracking with detailed analytics.', - longDescription: 'FlowBoard revolutionizes team collaboration and project management with its comprehensive suite of tools. Built with modern web technologies, it offers an intuitive interface for organizing tasks, managing timelines, and tracking progress. The platform features customizable boards, real-time collaboration, advanced analytics, and seamless communication tools. Perfect for teams of all sizes looking to boost productivity and streamline their workflow processes.', - buttons: {} - } - }, - - // Footer - footer: { - navigation: 'Quick Links', - services: 'Services', - copyright: 'All rights reserved.', - legalNotices: 'Legal Notices', - privacyPolicy: 'Privacy Policy', - servicesList: { - webDev: 'Web Development', - mobileApps: 'Mobile Apps', - apiBackend: 'API Development', - consulting: 'Tech Consulting' - } - }, - - // Common - common: { - loading: 'Loading...', - error: 'An error occurred', - retry: 'Retry', - close: 'Close', - save: 'Save', - cancel: 'Cancel', - confirm: 'Confirm', - delete: 'Delete', - edit: 'Edit', - view: 'View', - back: 'Back', - next: 'Next', - previous: 'Previous', - search: 'Search', - filter: 'Filter', - sort: 'Sort', - reset: 'Reset' - }, - - // SEO - seo: { - home: { - title: 'Full Stack Developer for Hire Vue.js React Node.js | 5+ Years Exp | Killian Dalcin', - description: '⭐ Expert Full Stack Developer for hire. Custom Vue.js/React web apps, professional Discord bots, robust Node.js APIs. ✅ 100% satisfaction rate ✅ Free quote 24h ✅ Fast delivery' - }, - projects: { - title: 'Full Stack Developer Portfolio 2024 | 50+ Vue.js React Node.js Projects', - description: '🏆 Discover 50+ successful web projects: high-performance Vue.js apps, scalable React platforms, Node.js APIs, Discord bots. Detailed case studies with proven ROI.' - }, - about: { - title: 'Killian Dalcin - Expert Full Stack Developer Vue.js React Node.js | Bio', - description: '👨‍💻 Senior Full Stack Developer with 5+ years expertise. Vue.js, React, Node.js specialist. 50+ projects delivered, 100% client satisfaction. Discover my journey and skills.' - }, - contact: { - title: 'Contact Full Stack Developer for Hire | Free Quote Within 24h', - description: '📞 Contact an expert Full Stack Developer for your web project. Free consultation, detailed quote within 24h. Vue.js, React, Node.js. Response guaranteed <24h.' - }, - fiverr: { - title: 'Fiverr Services 5⭐ Discord Bot & Web Dev | Top Seller 2024', - description: '🔥 Premium Fiverr services: Custom Discord bots from $150, Minecraft Java plugins, pro Telegram bots, modern websites. Top Rated Seller, 100% satisfaction, express delivery.' - } - }, - - // Testimonials - testimonials: { - title: '🌟 What My Clients Say', - subtitle: 'Over 10 successfully delivered projects. Discover authentic testimonials from satisfied clients who trust me.', - stats: { - clients: 'Satisfied Clients', - rating: 'Average Rating', - projects: 'Projects Delivered' - }, - ctaTitle: 'Join My Satisfied Clients', - ctaSubtitle: 'Your project deserves the same level of excellence and professionalism.', - ctaText: '🚀 Start My Project', - reviewsLink: 'https://www.fiverr.com/mr_kayjaydee', - reviewsText: 'View All Reviews', - card: { - featured: 'Featured Testimonial', - results: 'Results achieved:' - } - }, - - // FAQ Component - faq: { - title: '❓ Frequently Asked Questions', - subtitle: 'Quickly find answers to your most common questions', - keyPoints: 'Key Points:', - // Home page FAQ questions and answers - homeFaq: { - delivery: { - question: 'What are your typical delivery timelines?', - answer: 'Timelines vary based on project complexity:

Simple Discord Bot: 3-5 days
Showcase Website: 1-2 weeks
Complex Web Application: 4-8 weeks

I commit to meeting agreed deadlines and keep you regularly informed of progress.', - features: [ - 'Detailed planning provided', - 'Daily updates', - 'Often delivered early' - ] - }, - maintenance: { - question: 'Do you offer maintenance after delivery?', - answer: 'Absolutely! Every project includes a free maintenance period. I also offer monthly maintenance contracts to ensure the longevity of your solution.', - features: [ - 'Free support based on package', - 'Security updates', - '24/7 monitoring available' - ] - }, - companies: { - question: 'Do you work with companies of all sizes?', - answer: 'Yes! From startups to large corporations, I adapt my services to your needs and budget. Every project receives the same level of excellence.', - features: [ - 'Custom solutions', - 'Adapted pricing', - 'Personalized support' - ] - } - } - }, - pricing: { - title: 'Choose your learning plan', - subtitle: 'Access comprehensive web development training with our flexible plans tailored for all levels', - monthly: 'Monthly', - annual: 'Annual', - mostPopular: 'Most Popular', - startTrial: 'Start Free Trial', - trialInfo: '14-day free trial, then billing', - plans: { - starter: { - name: 'Starter', - description: 'Perfect to begin your web development journey' - }, - pro: { - name: 'Pro', - description: 'Ideal for developers who want to accelerate their learning' - }, - expert: { - name: 'Expert', - description: 'For those aiming for excellence and a professional career' - } - }, - features: { - basicCourses: 'Access to basic courses (HTML, CSS, JavaScript)', - communityAccess: 'Access to learning community', - mobileApp: 'Mobile app to learn anywhere', - basicSupport: 'Email support', - certificates: 'Completion certificates', - allCourses: 'Access to all courses and technologies', - liveWorkshops: 'Live workshops every week', - mentorship: 'Monthly mentorship sessions', - prioritySupport: '24/7 priority support', - jobBoard: 'Access to exclusive job board', - portfolioReview: 'Portfolio review by experts', - everythingPro: 'Everything in Pro plan included', - oneOnOneCoaching: 'Weekly one-on-one coaching', - customProjects: 'Custom projects based on your goals', - internshipPlacement: 'Internship placement assistance', - careerGuidance: 'Personalized career guidance', - exclusiveContent: 'Exclusive and early-access content', - networkingEvents: 'Networking events with professionals' - }, - faq: { - title: 'Frequently Asked Questions', - items: { - trial: { - question: 'How does the free trial work?', - answer: 'Enjoy 14 days of full access to your chosen plan. No commitment, you can cancel anytime during the trial period.' - }, - cancel: { - question: 'Can I cancel my subscription anytime?', - answer: 'Yes, you can cancel your subscription anytime from your dashboard. Access remains active until the end of your billing period.' - }, - refund: { - question: 'Do you offer a money-back guarantee?', - answer: 'We offer a 30-day money-back guarantee if you\'re not satisfied with your training.' - }, - upgrade: { - question: 'Can I change plans during my subscription?', - answer: 'Absolutely! You can upgrade to a higher plan anytime. The difference will be prorated.' - }, - certificates: { - question: 'Are the certificates recognized?', - answer: 'Our certificates are recognized by many tech companies and can be added to your LinkedIn profile.' - }, - support: { - question: 'What type of support is available?', - answer: 'Depending on your plan, you have access to email support, live chat, or personalized mentorship sessions.' - } - } - } - } -} diff --git a/src/locales/fr.ts b/src/locales/fr.ts deleted file mode 100644 index c8476ba..0000000 --- a/src/locales/fr.ts +++ /dev/null @@ -1,517 +0,0 @@ -export default { - // Navigation - nav: { - home: 'Accueil', - projects: 'Projets Portfolio', - about: 'À propos', - contact: 'Contact', - formation: 'Formation', - fiverr: 'Services Fiverr' - }, - - // Home page - home: { - title: '🚀 Développeur Full Stack Freelance Vue.js, React & Node.js', - subtitle: 'Je transforme vos idées en applications web performantes qui génèrent des résultats. Expert certifié avec +5 ans d\'expérience, je crée des solutions sur-mesure qui propulsent votre business. ⭐ 100% de clients satisfaits ⏱️ Livraison rapide garantie', - cta: { - viewProjects: '🎯 Découvrir Mes Réalisations', - contactMe: '💬 Devis Gratuit Sous 24h' - }, - featuredProjects: { - title: 'Applications Web Qui Cartonnent 🏆', - subtitle: 'Portfolio de projets réels qui ont transformé des idées en succès. Applications Vue.js ultra-rapides, plateformes React scalables, API Node.js robustes. Chaque projet = ROI prouvé pour mes clients.', - viewAll: 'Explorer Tous les Projets →' - }, - services: { - title: 'Services Premium de Développement Web 💎', - subtitle: 'Solutions clés en main qui boostent votre croissance. Technologies de pointe + méthodologie éprouvée = succès garanti pour votre projet digital.', - webDev: { - title: '⚡ Applications Web Vue.js/React Sur-Mesure', - description: 'Création d\'applications web lightning-fast qui convertissent. SPA modernes, PWA offline-first, e-commerce haute conversion. SEO-friendly dès la conception.' - }, - mobileApps: { - title: '📱 Apps Mobiles Cross-Platform Rentables', - description: 'Une seule codebase = iOS + Android + Web. React Native pour des apps natives performantes. 60% d\'économie vs développement natif. Push notifications, géolocalisation, paiements intégrés.' - }, - optimization: { - title: '🚀 Optimisation Performance & SEO Technique', - description: 'Boostez votre visibilité Google et vos conversions. Core Web Vitals optimisés, temps de chargement <2s. Audit SEO complet offert. +250% de trafic organique en moyenne.' - }, - maintenance: { - title: '🛡️ Maintenance Proactive & Support 24/7', - description: 'Dormez tranquille, je veille sur vos apps. Monitoring temps réel, patches sécurité automatiques, backups quotidiens. Intervention <2h en cas d\'urgence. 99.9% uptime garanti.' - } - }, - cta2: { - title: 'Vous Cherchez un Développeur Full Stack ?', - subtitle: 'Discutons de vos besoins de projet et construisons quelque chose d\'incroyable ensemble.', - startProject: 'Démarrer une Conversation', - learnMore: '🎯 Découvrir Mes Succès' - } - }, - - // Projects page - projects: { - title: 'Portfolio de Développement Web', - subtitle: 'Parcourez mes projets de développement full stack incluant des applications Vue.js, sites React, API Node.js, bots Discord et solutions d\'entreprise. Exemples concrets de code propre et d\'architecture moderne.', - categories: { - all: 'Tous les Projets', - 'webdevelopment': 'Développement Web', - 'botdevelopment': 'Développement de Bot', - 'opensource': 'Open Source', - 'enterprisesoftware': 'Logiciel d\'Entreprise', - 'socialmediabot': 'Bots Réseaux Sociaux', - 'automation': 'Outils d\'Automatisation' - }, - buttons: { - website: 'Site en Direct', - repository: 'Code Source', - npmpackage: 'Package NPM', - viewProject: 'Voir les Détails' - }, - projectDetail: { - backToProjects: 'Retour aux Projets', - viewDemo: 'Voir la Démo', - sourceCode: 'Code Source', - share: 'Partager', - aboutProject: 'À propos du Projet', - keyFeatures: 'Fonctionnalités Principales', - technologiesUsed: 'Technologies Utilisées', - gallery: 'Galerie', - projectInfo: 'Informations du Projet', - date: 'Date', - category: 'Catégorie', - status: 'Statut', - relatedProjects: 'Projets Similaires' - }, - noResults: { - title: 'Aucun projet trouvé', - description: 'Essayez de modifier vos critères de recherche ou de filtrage.' - } - }, - - // About page - about: { - title: 'À propos de Killian - Développeur Full Stack', - subtitle: 'Développeur web expérimenté passionné par Vue.js, React, Node.js et les technologies JavaScript modernes.', - intro: { - title: 'Développeur Full Stack Professionnel', - content: 'Je suis Killian, un développeur full stack expérimenté spécialisé dans les technologies JavaScript. Avec une expertise en Vue.js, React, Node.js et TypeScript, je crée des applications web évolutives, des API RESTful et des systèmes temps réel qui dépassent les attentes des clients.' - }, - skills: { - title: 'Compétences Techniques & Expertise', - programming: 'Langages de Programmation', - frontend: 'Technologies Frontend', - backend: 'Technologies Backend', - tools: 'DevOps & Outils', - systems: 'Systèmes d\'Exploitation' - }, - experience: { - title: 'Expérience Professionnelle', - content: 'Des années d\'expérience professionnelle en développement web construisant des applications d\'entreprise, des plateformes e-commerce, des produits SaaS et des solutions logicielles personnalisées. Un historique prouvé de livraison de code de haute qualité dans les délais et le budget.' - }, - approach: { - title: 'Philosophie de Développement', - subtitle: 'Mon approche du développement full stack se concentre sur le code propre, l\'architecture évolutive et l\'expérience utilisateur exceptionnelle.', - performance: { - title: 'Développement Axé Performance', - description: 'Code optimisé, lazy loading, code splitting et stratégies de cache. Atteindre des scores Lighthouse parfaits et des métriques Core Web Vitals.' - }, - architecture: { - title: 'Architecture Évolutive', - description: 'Microservices, fonctions serverless et modèles de conception modulaires. Construire des applications qui évoluent sans effort avec la croissance de votre entreprise.' - }, - quality: { - title: 'Qualité du Code & Tests', - description: 'Développement piloté par les tests (TDD), tests automatisés, intégration continue (CI/CD) et revues de code complètes garantissant des déploiements sans bugs.' - }, - collaboration: { - title: 'Collaboration Agile', - description: 'Excellente communication, méthodologies agiles et gestion de projet transparente. Mises à jour régulières et résolution collaborative de problèmes.' - } - }, - cta: { - title: 'Vous Cherchez un Développeur Full Stack ?', - description: 'Discutons de vos besoins de projet et construisons quelque chose d\'incroyable ensemble.', - button: 'Démarrer une Conversation' - } - }, - - // Fiverr page - fiverr: { - title: '🔥 Services Fiverr Premium - Développeur 5⭐ Top Rated Seller', - subtitle: '✅ 500+ commandes livrées ✅ 100% satisfaction client ✅ Réponse <1h ✅ Support FR/EN 24/7. Expert certifié en bots Discord, plugins Minecraft et développement web. Transformez vos idées en réalité AUJOURD\'HUI !', - profileCta: '🎯 Commander Maintenant sur Fiverr', - stats: { - rating: 'Note Parfaite 5⭐' - }, - pricing: { - startingAt: 'Dès' - }, - services: { - title: '💎 Services Premium Qui Cartonnent', - subtitle: 'Solutions professionnelles livrées en temps record. Chaque service inclut : ✅ Code source complet ✅ Documentation détaillée ✅ Support 30 jours ✅ Révisions illimitées', - features: 'Ce Qui Est Inclus', - orderNow: '🚀 Commander Ce Service', - learnMore: 'Voir Tous les Détails', - moreFeatures: 'avantages premium inclus', - comingSoon: 'Disponible Bientôt', - available: '🟢 Disponible Immédiatement' - }, - serviceData: { - 'discord-bot': { - title: '🤖 Bot Discord Ultra-Complet | #1 Best-Seller', - description: 'Le bot Discord de vos rêves, codé par un expert. Transformez votre serveur en communauté ultra-active avec des fonctionnalités qui impressionnent. +1000 bots livrés, 100% clients ravis !', - features: [ - '⚡ Système de modération IA avancé (anti-spam, anti-raid, auto-mod intelligent)', - '🎮 Mini-jeux addictifs : casino, RPG, quiz avec leaderboards globaux', - '🎵 Lecteur musique HD : Spotify, YouTube, SoundCloud, avec playlist sauvegardées', - '🎨 Interface web moderne pour configuration facile (dashboard React inclus)', - '☁️ Hébergement VPS premium OFFERT pendant 3 mois (valeur 150€)' - ] - }, - 'minecraft-plugin': { - title: '⛏️ Plugin Minecraft Java Premium | Spigot/Paper Expert', - description: 'Plugins Minecraft sur-mesure qui transforment votre serveur en expérience unique. Compatible 1.8 → 1.20+, optimisé pour gros serveurs (1000+ joueurs). Votre avantage concurrentiel !', - features: [ - '🎯 Gameplay révolutionnaire : donjons procéduraux, boss custom, sorts magiques', - '💰 Économie avancée : boutiques GUI, auction house, métiers avec XP', - '🏆 Systèmes de progression : levels, skills, classes RPG personnalisables', - '💾 Base de données optimisée MySQL/Redis pour performances maximales', - '🌍 Multi-serveurs : BungeeCord/Velocity ready avec synchronisation' - ] - }, - 'telegram-bot': { - title: '💬 Bot Telegram Pro Business | Automatisation Puissante', - description: 'Bot Telegram professionnel qui booste votre business. Parfait pour e-commerce, support client, communautés. Interface moderne, 0 code requis pour l\'utilisation !', - features: [ - '🤖 IA conversationnelle : ChatGPT intégré pour réponses naturelles', - '🛒 E-commerce complet : catalogue produits, panier, paiements Stripe/PayPal', - '📢 Broadcasting intelligent : segments utilisateurs, A/B testing, analytics', - '🌐 Multi-langues automatique avec détection et traduction DeepL', - '🔐 Sécurité maximale : 2FA, encryption, RGPD compliant' - ] - }, - 'website-development': { - title: '🌟 Site Web Premium Vue.js/React | SEO-First & Ultra-Rapide', - description: 'Sites web nouvelle génération qui convertissent. Design premium, performance maximale, SEO optimisé. Votre concurrent #1 sur Google en 90 jours ou remboursé !', - features: [ - '🎨 Design UI/UX premium : mockups Figma + animations modernes', - '⚡ Performance extrême : chargement <1.5s', - '📱 Responsive parfait : testé sur 50+ appareils différents', - '🔍 SEO surpuissant : schema markup, sitemap, meta optimisées', - '🛒 E-commerce ready : Stripe, PayPal, cryptos (si besoin)' - ] - } - }, - testimonials: { - title: '🌟 Ils Ont Transformé Leur Business Avec Mes Services', - subtitle: 'Rejoignez 500+ entrepreneurs satisfaits. Note moyenne 5.0/5.0 sur l\'ensemble de mes services. La qualité parle d\'elle-même !' - }, - cta: { - title: '🎯 Arrêtez de Chercher, Vous Avez Trouvé LE Bon Développeur', - subtitle: '⏰ Chaque jour sans agir = opportunités perdues. Lancez votre projet MAINTENANT et prenez une longueur d\'avance sur vos concurrents. Places limitées ce mois-ci !', - button: '🔥 Réserver Ma Commande Maintenant' - } - }, - - // Contact page - contact: { - title: 'Contacter Développeur Full Stack', - subtitle: 'Contactez-moi pour des projets de développement web, du travail freelance ou une consultation technique. Estimation de projet et consultation gratuites disponibles.', - stats: { - responseTime: 'Réponse Rapide', - satisfaction: 'Satisfaction Client', - collaboration: 'Portée Mondiale' - }, - quickContact: 'Contact Rapide', - findMeOn: 'Connectez-vous sur les Réseaux Sociaux', - methods: { - email: 'Adresse Email', - phone: 'Numéro de Téléphone', - location: 'Localisation', - responseTime: 'Réponse sous 24 heures', - availability: 'Disponible pour remote & freelance' - }, - faq: { - title: 'Questions Fréquemment Posées', - subtitle: 'Questions courantes sur mes services de développement web et mon processus de travail.', - responseTime: { - title: 'Quel est votre délai de réponse typique ?', - description: 'Je réponds à toutes les demandes dans les 24 heures. Pour les projets urgents, je suis disponible pour une consultation immédiate.' - }, - projectTypes: { - title: 'Quels types de projets gérez-vous ?', - description: 'Applications web full stack, API REST, bots Discord, sites e-commerce, plateformes SaaS et solutions logicielles personnalisées utilisant des technologies modernes.' - }, - collaboration: { - title: 'Travaillez-vous à distance ?', - description: 'Oui, je travaille avec des clients du monde entier. Collaboration à distance via Slack, Discord, Zoom et outils de gestion de projet. Disponibilité flexible sur les fuseaux horaires.' - } - }, - form: { - name: 'Votre Nom', - email: 'Adresse Email', - subject: 'Sujet du Projet', - message: 'Détails du Projet', - send: 'Envoyer le Message', - sending: 'Envoi en cours...', - success: 'Message envoyé avec succès ! Je répondrai dans les 24 heures.', - error: 'Erreur lors de l\'envoi du message. Veuillez réessayer ou envoyer un email directement.', - required: 'Ce champ est requis', - invalidEmail: 'Veuillez entrer une adresse email valide' - }, - info: { - title: 'Construisons Quelque Chose de Grand', - description: 'Que vous ayez besoin d\'une application Vue.js, d\'un site React, d\'une API Node.js ou d\'une solution logicielle personnalisée, je suis là pour donner vie à votre vision.', - email: 'Email', - social: 'Profils Sociaux' - } - }, - - // Project data - projectData: { - 'virtual-tour': { - title: 'Visite Virtuelle - Expérience 360° Interactive', - description: 'Mon professeur de lycée et moi avons eu l\'idée de créer une visite virtuelle avec des vidéos 360° pour permettre à tous de visiter l\'école depuis le web.', - longDescription: 'Projet collaboratif avec mon professeur de lycée pour créer une expérience de visite virtuelle immersive de notre établissement. Utilise des vidéos 360° pour offrir une navigation interactive et permettre aux futurs étudiants et parents de découvrir les installations scolaires à distance. Interface intuitive permettant d\'explorer les différents espaces : salles de classe, laboratoires, espaces communs et installations sportives.', - buttons: { - visit: 'Visiter' - } - }, - 'xinko': { - title: 'Xinko - Bot Discord Polyvalent', - description: 'Xinko est un bot polyvalent qui peut vous aider à créer et gérer vos serveurs Discord avec facilité et plaisir. Il possède de nombreuses commandes et fonctionnalités.', - longDescription: 'Bot Discord complet conçu pour simplifier la gestion des serveurs. Xinko offre une large gamme de commandes pour la modération, le divertissement, l\'utilitaire et la gestion communautaire. Interface conviviale avec système de permissions avancé, commandes slash modernes et intégration avec diverses APIs. Parfait pour les communautés de toutes tailles cherchant à automatiser et enrichir leur expérience Discord.', - buttons: { - invite: 'Inviter' - } - }, - 'image-manipulation': { - title: 'Manipulation d\'Images - Package NPM', - description: 'Discord Image Generation : Package NPM pour la manipulation d\'images basée sur le code. Initialement une API, maintenant open-source.', - longDescription: 'Package NPM open-source pour la génération et manipulation d\'images programmatique. Développé initialement comme API propriétaire, puis rendu disponible à la communauté. Offre des fonctionnalités avancées de traitement d\'images : génération de memes, filtres, effets visuels et compositions personnalisées. Particulièrement populaire dans l\'écosystème des bots Discord pour créer du contenu visuel dynamique et interactif.', - buttons: { - repository: 'Dépôt', - 'npm package': 'Package NPM' - } - }, - 'primate-web-admin': { - title: 'Primate Web Admin - Interface de Gestion', - description: 'Primate Web Admin est une interface Web pour gérer Primate qui est un outil de déploiement similaire à Munki pour Windows.', - longDescription: 'Interface d\'administration web moderne pour Primate, un système de déploiement de logiciels pour environnements Windows. Inspiré de Munki (solution macOS), Primate Web Admin offre une gestion centralisée des déploiements logiciels sur infrastructure Windows. Interface intuitive pour la gestion des packages, planification des mises à jour, surveillance des clients et génération de rapports détaillés.', - buttons: {} - }, - 'instagram-bot': { - title: 'Bot Instagram - Automatisation Complète', - description: 'Bot Instagram entièrement fonctionnel utilisant Insta.js par androz2091. Il possède de nombreuses commandes. Génère des images avec des commandes comme : !stonk ou !invert.', - longDescription: 'Bot d\'automatisation Instagram développé avec la bibliothèque Insta.js d\'androz2091. Offre une gamme complète de fonctionnalités d\'automatisation : publication de contenu, interaction avec les followers, génération d\'images personnalisées et gestion des messages directs. Inclut des commandes spécialisées pour la création de memes et effets visuels (!stonk, !invert) ainsi que des outils de modération et d\'analyse des performances.', - buttons: { - repository: 'Dépôt' - } - }, - 'crowdin-status-bot': { - title: 'Bot de Statut Crowdin - Suivi des Traductions', - description: 'Un bot qui récupère le statut des traductions Crowdin et met à jour les messages Discord avec le dernier statut. Restez informé des progrès !', - longDescription: 'Bot Discord spécialisé dans le suivi automatique des projets de traduction Crowdin. Se connecte à l\'API Crowdin pour récupérer les statistiques de progression en temps réel et met à jour automatiquement les messages Discord avec les dernières informations. Outil essentiel pour les équipes de localisation et projets open-source multilingues, permettant de maintenir la communauté informée des avancées de traduction et d\'encourager la participation des contributeurs.', - buttons: { - repository: 'Dépôt' - } - }, - 'flowboard': { - title: 'FlowBoard - Clone de Trello ', - description: 'FlowBoard est une solution complète de gestion de projet pour rationaliser les tâches, la collaboration d\'équipe, la gestion des délais et le suivi des progrès avec des analyses détaillées.', - longDescription: 'FlowBoard révolutionne la collaboration d\'équipe et la gestion de projet avec sa suite complète d\'outils. Construite avec des technologies web modernes, elle offre une interface intuitive pour organiser les tâches, gérer les délais et suivre les progrès. La plateforme propose des tableaux personnalisables, une collaboration en temps réel, des analyses avancées et des outils de communication transparents. Parfaite pour les équipes de toutes tailles cherchant à booster leur productivité et rationaliser leurs processus de travail.', - buttons: {} - } - }, - - // Footer - footer: { - navigation: 'Liens Rapides', - services: 'Services', - copyright: 'Tous droits réservés.', - legalNotices: 'Mentions Légales', - privacyPolicy: 'Politique de Confidentialité', - servicesList: { - webDev: 'Développement Web', - mobileApps: 'Applications Mobiles', - apiBackend: 'Développement API', - consulting: 'Consulting Tech' - } - }, - - // Common - common: { - loading: 'Chargement...', - error: 'Une erreur s\'est produite', - retry: 'Réessayer', - close: 'Fermer', - save: 'Sauvegarder', - cancel: 'Annuler', - confirm: 'Confirmer', - delete: 'Supprimer', - edit: 'Modifier', - view: 'Voir', - back: 'Retour', - next: 'Suivant', - previous: 'Précédent', - search: 'Rechercher', - filter: 'Filtrer', - sort: 'Trier', - reset: 'Réinitialiser' - }, - - // SEO - seo: { - home: { - title: 'Développeur Full Stack Freelance Vue.js React Node.js | +5 ans exp | Killian Dalcin', - description: '⭐ Développeur Full Stack expert freelance. Création d\'applications web Vue.js/React performantes, bots Discord sur-mesure, API Node.js robustes. ✅ 100% clients satisfaits ✅ Devis gratuit 24h ✅ Livraison rapide' - }, - projects: { - title: 'Portfolio Développeur Full Stack 2024 | 50+ Projets Vue.js React Node.js', - description: '🏆 Découvrez 50+ projets web réussis : applications Vue.js haute performance, plateformes React scalables, API Node.js, bots Discord. Études de cas détaillées avec ROI prouvé.' - }, - about: { - title: 'Killian Dalcin - Expert Développeur Full Stack Vue.js React Node.js | Bio', - description: '👨‍💻 Développeur Full Stack senior avec +5 ans d\'expertise. Spécialiste Vue.js, React, Node.js. 50+ projets livrés, 100% satisfaction client. Découvrez mon parcours et mes compétences.' - }, - contact: { - title: 'Contact Développeur Full Stack Freelance | Devis Gratuit Sous 24h', - description: '📞 Contactez un expert développeur Full Stack pour votre projet web. Consultation gratuite, devis détaillé sous 24h. Vue.js, React, Node.js. Réponse garantie en <24h.' - }, - fiverr: { - title: 'Services Fiverr 5⭐ Bot Discord & Dev Web | Top Seller 2024', - description: '🔥 Services Fiverr premium : Bots Discord sur-mesure dès 150€, plugins Minecraft Java, bots Telegram pro, sites web modernes. Top Rated Seller, 100% satisfaction, livraison express.' - } - }, - - // Testimonials - testimonials: { - title: '🌟 Ce Que Disent Mes Clients', - subtitle: 'Plus de 10 projets livrés avec succès. Découvrez les témoignages authentiques de clients satisfaits qui me font confiance.', - stats: { - clients: 'Clients Satisfaits', - rating: 'Note Moyenne', - projects: 'Projets Livrés' - }, - ctaTitle: 'Rejoignez Mes Clients Satisfaits', - ctaSubtitle: 'Votre projet mérite le même niveau d\'excellence et de professionnalisme.', - ctaText: '🚀 Démarrer Mon Projet', - reviewsLink: 'https://www.fiverr.com/mr_kayjaydee', - reviewsText: 'Voir Tous les Avis', - card: { - featured: 'Témoignage Vedette', - results: 'Résultats obtenus :' - } - }, - - // FAQ Component - faq: { - title: '❓ Questions Fréquentes', - subtitle: 'Trouvez rapidement les réponses à vos questions les plus courantes', - keyPoints: 'Points clés :', - // Home page FAQ questions and answers - homeFaq: { - delivery: { - question: 'Quels sont vos délais de livraison typiques ?', - answer: 'Les délais varient selon la complexité du projet :

Bot Discord simple : 3-5 jours
Site vitrine : 1-2 semaines
Application web complexe : 4-8 semaines

Je m\'engage à respecter les délais convenus et vous tiens informé régulièrement de l\'avancement.', - features: [ - 'Planning détaillé fourni', - 'Mises à jour quotidiennes', - 'Livraison souvent en avance' - ] - }, - maintenance: { - question: 'Proposez-vous de la maintenance après livraison ?', - answer: 'Absolument ! Chaque projet inclut une période de maintenance gratuite. Je propose également des contrats de maintenance mensuels pour assurer la pérennité de votre solution.', - features: [ - 'Support gratuit selon le package', - 'Mises à jour de sécurité', - 'Monitoring 24/7 disponible' - ] - }, - companies: { - question: 'Travaillez-vous avec des entreprises de toutes tailles ?', - answer: 'Oui ! De la startup au grand groupe, j\'adapte mes services à vos besoins et votre budget. Chaque projet bénéficie du même niveau d\'excellence.', - features: [ - 'Solutions sur-mesure', - 'Tarifs adaptés', - 'Accompagnement personnalisé' - ] - } - } - }, - pricing: { - title: 'Choisissez votre plan de formation', - subtitle: 'Accédez à une formation complète en développement web avec nos plans flexibles adaptés à tous les niveaux', - monthly: 'Mensuel', - annual: 'Annuel', - mostPopular: 'Le plus populaire', - startTrial: 'Commencer l\'essai gratuit', - trialInfo: '14 jours d\'essai gratuit, puis facturation', - plans: { - starter: { - name: 'Débutant', - description: 'Parfait pour commencer votre parcours en développement web' - }, - pro: { - name: 'Pro', - description: 'Idéal pour les développeurs qui veulent accélérer leur apprentissage' - }, - expert: { - name: 'Expert', - description: 'Pour ceux qui visent l\'excellence et une carrière professionnelle' - } - }, - features: { - basicCourses: 'Accès aux cours de base (HTML, CSS, JavaScript)', - communityAccess: 'Accès à la communauté d\'apprentissage', - mobileApp: 'Application mobile pour apprendre partout', - basicSupport: 'Support par email', - certificates: 'Certificats de completion', - allCourses: 'Accès à tous les cours et technologies', - liveWorkshops: 'Ateliers en direct chaque semaine', - mentorship: 'Sessions de mentorat mensuel', - prioritySupport: 'Support prioritaire 24/7', - jobBoard: 'Accès au tableau d\'emploi exclusif', - portfolioReview: 'Révision de portfolio par des experts', - everythingPro: 'Tout du plan Pro inclus', - oneOnOneCoaching: 'Coaching individuel hebdomadaire', - customProjects: 'Projets personnalisés selon vos objectifs', - internshipPlacement: 'Aide au placement en stage', - careerGuidance: 'Conseils carrière personnalisés', - exclusiveContent: 'Contenu exclusif et avant-première', - networkingEvents: 'Événements de networking avec les pros' - }, - faq: { - title: 'Questions fréquentes', - items: { - trial: { - question: 'Comment fonctionne l\'essai gratuit ?', - answer: 'Profitez de 14 jours d\'accès complet à votre plan choisi. Aucun engagement, vous pouvez annuler à tout moment pendant la période d\'essai.' - }, - cancel: { - question: 'Puis-je annuler mon abonnement à tout moment ?', - answer: 'Oui, vous pouvez annuler votre abonnement à tout moment depuis votre tableau de bord. L\'accès reste actif jusqu\'à la fin de votre période de facturation.' - }, - refund: { - question: 'Offrez-vous une garantie de remboursement ?', - answer: 'Nous offrons une garantie de remboursement de 30 jours si vous n\'êtes pas satisfait de votre formation.' - }, - upgrade: { - question: 'Puis-je changer de plan en cours d\'abonnement ?', - answer: 'Absolument ! Vous pouvez passer à un plan supérieur à tout moment. La différence sera calculée au prorata.' - }, - certificates: { - question: 'Les certificats sont-ils reconnus ?', - answer: 'Nos certificats sont reconnus par de nombreuses entreprises tech et peuvent être ajoutés à votre profil LinkedIn.' - }, - support: { - question: 'Quel type de support est disponible ?', - answer: 'Selon votre plan, vous avez accès au support par email, chat en direct, ou sessions de mentorat personnalisées.' - } - } - } - } -} diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index e1ed49b..0000000 --- a/src/main.ts +++ /dev/null @@ -1,16 +0,0 @@ -import './assets/main.css' - -import { createApp } from 'vue' -import { createPinia } from 'pinia' - -import App from './App.vue' -import router from './router' -import i18n from './i18n' - -const app = createApp(App) - -app.use(createPinia()) -app.use(router) -app.use(i18n) - -app.mount('#app') diff --git a/src/router/index.ts b/src/router/index.ts deleted file mode 100644 index 9075136..0000000 --- a/src/router/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { createRouter, createWebHistory, type RouteLocationNormalized } from 'vue-router' -import { nextTick } from 'vue' -import HomePage from '../views/HomePage.vue' - -// Google Analytics gtag types -declare global { - interface Window { - dataLayer: unknown[] - gtag: (...args: unknown[]) => void - } -} - -const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes: [ - { - path: '/', - name: 'home', - component: HomePage - }, - { - path: '/projects', - name: 'projects', - component: () => import('../views/ProjectsPage.vue') - }, - { - path: '/project/:id', - name: 'project-detail', - component: () => import('../views/ProjectDetailPage.vue') - }, - { - path: '/about', - name: 'about', - component: () => import('../views/AboutPage.vue') - }, - { - path: '/contact', - name: 'contact', - component: () => import('../views/ContactPage.vue') - }, - { - path: '/fiverr', - name: 'fiverr', - component: () => import('../views/FiverrPage.vue') - }, - { - path: '/formation', - name: 'formation', - component: () => import('../views/FormationPage.vue') - }, - // TODO: page 404 - { - path: '/:pathMatch(.*)*', - name: 'not-found', - component: HomePage, - meta: { - title: 'Page non trouvée - 404', - description: 'La page que vous recherchez n\'existe pas. Retournez à l\'accueil pour découvrir mes services.' - } - } - ], - scrollBehavior(to, from, savedPosition) { - // If there's a saved position (back/forward navigation), use it - if (savedPosition) { - return savedPosition - } - - // If navigating to a hash anchor, scroll to that element - if (to.hash) { - return { - el: to.hash, - behavior: 'smooth' - } - } - - // For all other navigation, scroll to top - return { - top: 0, - behavior: 'smooth' - } - } -}) - -// SEO Meta tags handler -router.beforeEach((to, from, next) => { - // Update document title - if (to.meta?.title) { - document.title = to.meta.title as string - } - - // Update meta description - if (to.meta?.description) { - let metaDescription = document.querySelector('meta[name="description"]') - if (!metaDescription) { - metaDescription = document.createElement('meta') - metaDescription.setAttribute('name', 'description') - document.head.appendChild(metaDescription) - } - metaDescription.setAttribute('content', to.meta.description as string) - } - - next() -}) - -// Google Analytics page view tracking function -const trackPageView = (route: RouteLocationNormalized) => { - // Track page view with gtag - if (window.gtag) { - window.gtag('config', 'G-CDVVNFY6MV', { - page_path: route.path, - page_title: document.title, - page_location: window.location.href - }) - } -} - -// Track page views on route changes -router.afterEach((to) => { - nextTick(() => { - // Smooth scroll to top - window.scrollTo({ - top: 0, - left: 0, - behavior: 'smooth' - }) - - // Track page view for GTM - trackPageView(to) - }) -}) - -// Track initial page load -router.isReady().then(() => { - // Track the initial route after router is ready - trackPageView(router.currentRoute.value) -}) - -export default router diff --git a/src/stores/counter.ts b/src/stores/counter.ts deleted file mode 100644 index b6757ba..0000000 --- a/src/stores/counter.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ref, computed } from 'vue' -import { defineStore } from 'pinia' - -export const useCounterStore = defineStore('counter', () => { - const count = ref(0) - const doubleCount = computed(() => count.value * 2) - function increment() { - count.value++ - } - - return { count, doubleCount, increment } -}) diff --git a/src/style.css b/src/style.css deleted file mode 100644 index d4b5078..0000000 --- a/src/style.css +++ /dev/null @@ -1 +0,0 @@ -@import 'tailwindcss'; diff --git a/src/types/index.ts b/src/types/index.ts deleted file mode 100644 index 2054e74..0000000 --- a/src/types/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -export interface Project { - id: string - title: string - image: string - description: string - longDescription?: string - technologies?: string[] - category?: string - featured?: boolean - buttons?: ProjectButton[] - date?: string - demoUrl?: string - githubUrl?: string - features?: string[] - gallery?: string[] - status?: string -} - -export interface ProjectButton { - title: string - link: string -} - -export interface Technology { - name: string - level: 'Beginner' | 'Intermediate' | 'Advanced' - image: string -} - -export interface TechStack { - programming: Technology[] - front: Technology[] - database: Technology[] - devtools: Technology[] - operating_systems: Technology[] - socials: Technology[] -} diff --git a/src/views/AboutPage.vue b/src/views/AboutPage.vue deleted file mode 100644 index b3c873f..0000000 --- a/src/views/AboutPage.vue +++ /dev/null @@ -1,215 +0,0 @@ - - - - - diff --git a/src/views/ContactPage.vue b/src/views/ContactPage.vue deleted file mode 100644 index 547f233..0000000 --- a/src/views/ContactPage.vue +++ /dev/null @@ -1,201 +0,0 @@ - - - - - diff --git a/src/views/FiverrPage.vue b/src/views/FiverrPage.vue deleted file mode 100644 index 1db3846..0000000 --- a/src/views/FiverrPage.vue +++ /dev/null @@ -1,138 +0,0 @@ - - - - - diff --git a/src/views/HomePage.vue b/src/views/HomePage.vue deleted file mode 100644 index fb75008..0000000 --- a/src/views/HomePage.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/src/views/ProjectDetailPage.vue b/src/views/ProjectDetailPage.vue deleted file mode 100644 index b4dda16..0000000 --- a/src/views/ProjectDetailPage.vue +++ /dev/null @@ -1,264 +0,0 @@ - - - - - diff --git a/src/views/ProjectsPage.vue b/src/views/ProjectsPage.vue deleted file mode 100644 index 6204d18..0000000 --- a/src/views/ProjectsPage.vue +++ /dev/null @@ -1,194 +0,0 @@ - - - - - diff --git a/src/views/styles/AboutPage.css b/src/views/styles/AboutPage.css deleted file mode 100644 index 1d62e46..0000000 --- a/src/views/styles/AboutPage.css +++ /dev/null @@ -1,74 +0,0 @@ -/* AboutPage Styles */ - -/* Approach Section */ -.approach-section { - background: var(--bg-secondary); - padding: var(--space-4xl) 0; -} - -/* Category Icons */ -.category-icon { - width: 3rem; - height: 3rem; - border-radius: var(--border-radius-lg); - display: flex; - align-items: center; - justify-content: center; - margin-right: var(--space-md); - color: var(--text-inverse); -} - -/* Approach Icons */ -.approach-icon { - width: 3rem; - height: 3rem; - border-radius: var(--border-radius-lg); - display: flex; - align-items: center; - justify-content: center; - margin-right: var(--space-md); - flex-shrink: 0; -} - -/* Custom animations with delays */ -.animate-fade-in-up { - animation: fadeInUp 0.6s ease-out forwards; - opacity: 0; -} - -/* Spacing utilities */ -.space-y-lg > * + * { - margin-top: var(--space-lg); -} - -/* Responsive utilities */ -@media (min-width: 640px) { - .sm\:flex-row { - flex-direction: row; - } -} - -@media (min-width: 768px) { - .md\:grid-cols-2 { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1024px) { - .lg\:grid-cols-2 { - grid-template-columns: repeat(2, 1fr); - } -} - -/* Custom utilities */ -.max-w-2xl { - max-width: 42rem; -} - -.max-w-4xl { - max-width: 56rem; -} - -.flex-shrink-0 { - flex-shrink: 0; -} diff --git a/src/views/styles/ContactPage.css b/src/views/styles/ContactPage.css deleted file mode 100644 index 2dc0071..0000000 --- a/src/views/styles/ContactPage.css +++ /dev/null @@ -1,283 +0,0 @@ -/* ContactPage Styles */ - -/* Contact Page Styles */ -.contact-page { - min-height: 100vh; - background: var(--bg-primary); -} - -/* Hero Section */ -.contact-hero { - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - padding: var(--space-4xl) 0 var(--space-3xl); - position: relative; - overflow: hidden; -} - -.contact-hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23f3f4f6' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.5; -} - -.hero-content { - position: relative; - z-index: 1; -} - -/* Stats Grid */ -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); - gap: var(--space-xl); - max-width: 500px; - margin: var(--space-2xl) auto 0; -} - -.stat-item { - text-align: center; -} - -.stat-number { - font-size: 2rem; - font-weight: bold; - color: var(--color-primary); - line-height: 1; -} - -.stat-label { - font-size: 0.875rem; - color: var(--text-secondary); - margin-top: var(--space-xs); -} - -/* FAQ Section */ -.faq-section { - background: var(--bg-secondary); - padding: var(--space-4xl) 0; -} - -/* Spacing utilities */ -.space-y-md > * + * { - margin-top: var(--space-md); -} - -.space-y-sm > * + * { - margin-top: var(--space-sm); -} - -/* FAQ Icons */ -.faq-icon { - width: 3rem; - height: 3rem; - border-radius: var(--border-radius-lg); - display: flex; - align-items: center; - justify-content: center; - margin: 0 auto var(--space-lg); -} - -.faq-icon-success { - background: var(--color-success); - color: var(--text-inverse); -} - -.faq-icon-primary { - background: var(--color-primary); - color: var(--text-inverse); -} - -.faq-icon-secondary { - background: var(--color-secondary); - color: var(--text-inverse); -} - -.contact-link { - color: var(--color-primary); - text-decoration: none; - font-weight: 500; - transition: color var(--transition-fast); -} - -.contact-link:hover { - color: var(--color-primary-dark); -} - -.contact-text { - color: var(--text-primary); - font-weight: 500; -} - -.contact-description { - font-size: 0.875rem; - color: var(--text-secondary); - margin-top: var(--space-xs); -} - -/* Social Links */ -.social-link { - display: flex; - align-items: center; - padding: var(--space-sm) var(--space-md); - background: var(--bg-secondary); - border-radius: var(--border-radius-lg); - text-decoration: none; - transition: all var(--transition-fast); - group: true; -} - -.social-link:hover { - background: var(--color-primary); - color: var(--text-inverse); - transform: translateX(4px); -} - -.social-icon { - width: 32px; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - margin-right: var(--space-sm); - color: var(--text-secondary); - transition: color var(--transition-fast); -} - -.social-link:hover .social-icon { - color: var(--text-inverse); -} - -.social-name { - flex: 1; - font-weight: 500; - color: var(--text-primary); - transition: color var(--transition-fast); -} - -.social-link:hover .social-name { - color: var(--text-inverse); -} - -.social-arrow { - width: 16px; - height: 16px; - color: var(--text-secondary); - transition: all var(--transition-fast); -} - -.social-link:hover .social-arrow { - color: var(--text-inverse); - transform: translateX(2px); -} - -/* Responsive */ -@media (min-width: 768px) { - .md\:grid-cols-3 { - grid-template-columns: repeat(3, 1fr); - } -} - -@media (min-width: 1024px) { - .lg\:grid-cols-2 { - grid-template-columns: repeat(2, 1fr); - } -} - -/* Utilities */ -.max-w-2xl { - max-width: 42rem; -} - -.max-w-4xl { - max-width: 56rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.text-center { - text-align: center; -} - -.grid { - display: grid; -} - -.gap-xl { - gap: var(--space-xl); -} - -.gap-2xl { - gap: var(--space-2xl); -} - -.flex { - display: flex; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.mb-lg { - margin-bottom: var(--space-lg); -} - -.mb-md { - margin-bottom: var(--space-md); -} - -.mb-2xl { - margin-bottom: var(--space-2xl); -} - -.text-xl { - font-size: 1.25rem; -} - -.text-2xl { - font-size: 1.5rem; -} - -.font-bold { - font-weight: 700; -} - -.w-5 { - width: 1.25rem; -} - -.h-5 { - height: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.h-6 { - height: 1.5rem; -} - -.w-12 { - width: 3rem; -} - -.h-12 { - height: 3rem; -} - -.rounded-lg { - border-radius: var(--border-radius-lg); -} diff --git a/src/views/styles/FiverrPage.css b/src/views/styles/FiverrPage.css deleted file mode 100644 index 6d38872..0000000 --- a/src/views/styles/FiverrPage.css +++ /dev/null @@ -1,51 +0,0 @@ -/* Fiverr Page Main Styles */ -.fiverr-page { - min-height: 100vh; - background: var(--bg-primary); -} - -/* Services Grid Section */ -.services-grid-section { - padding: var(--space-4xl) 0; -} - -.section-header { - margin-bottom: var(--space-3xl); -} - -.section-title { - font-size: var(--font-size-4xl); - font-weight: var(--font-weight-bold); - color: var(--text-primary); - margin-bottom: var(--space-lg); -} - -.section-subtitle { - font-size: var(--font-size-lg); - color: var(--text-secondary); - max-width: 600px; - margin: 0 auto; - line-height: var(--line-height-relaxed); -} - -.services-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); - gap: var(--space-2xl); -} - -/* Responsive Design */ -@media (max-width: 768px) { - .services-grid { - grid-template-columns: 1fr; - gap: var(--space-xl); - } - - .section-title { - font-size: var(--font-size-3xl); - } - - .section-subtitle { - font-size: var(--font-size-base); - } -} diff --git a/src/views/styles/HomePage.css b/src/views/styles/HomePage.css deleted file mode 100644 index 79e50c6..0000000 --- a/src/views/styles/HomePage.css +++ /dev/null @@ -1,157 +0,0 @@ -/* HomePage Styles */ - -/* Services Section */ -.services-section { - background: var(--bg-secondary); - padding: var(--space-4xl) 0; -} - -/* Services Grid - 2x2 Layout */ -.services-grid { - display: grid; - grid-template-columns: 1fr; - gap: 2rem; - margin-bottom: 3rem; -} - -@media (min-width: 768px) { - .services-grid { - grid-template-columns: repeat(2, 1fr); - gap: 2rem; - } -} - -/* Projects Grid - 3 Columns */ -.projects-grid { - display: grid; - grid-template-columns: 1fr; - gap: 2rem; - margin-bottom: 3rem; -} - -@media (min-width: 768px) { - .projects-grid { - grid-template-columns: repeat(2, 1fr); - gap: 2rem; - } -} - -@media (min-width: 1024px) { - .projects-grid { - grid-template-columns: repeat(3, 1fr); - gap: 2rem; - } -} - -/* Service Icons */ -.service-icon { - width: 3rem; - height: 3rem; - border-radius: var(--border-radius-lg); - display: flex; - align-items: center; - justify-content: center; - margin-right: var(--space-md); - flex-shrink: 0; -} - -/* Scroll Icon */ -.scroll-icon { - width: 1.5rem; - height: 1.5rem; - color: var(--text-tertiary); -} - -/* Custom animations with delays */ -.animate-fade-in-up { - animation: fadeInUp 0.6s ease-out forwards; - opacity: 0; -} - -/* Responsive utilities */ -@media (min-width: 640px) { - .sm\:flex-row { - flex-direction: row; - } -} - -@media (min-width: 768px) { - .md\:grid-cols-2 { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1024px) { - .lg\:grid-cols-3 { - grid-template-columns: repeat(3, 1fr); - } - - .lg\:grid-cols-4 { - grid-template-columns: repeat(4, 1fr); - } -} - -/* Custom utilities */ -.max-w-2xl { - max-width: 42rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.opacity-90 { - opacity: 0.9; -} - -.transform { - transform: translateX(0); -} - -.-translate-x-1\/2 { - transform: translateX(-50%); -} - -.absolute { - position: absolute; -} - -.bottom-8 { - bottom: 2rem; -} - -.left-1\/2 { - left: 50%; -} - -.animate-bounce { - animation: bounce 1s infinite; -} - -@keyframes bounce { - 0%, - 20%, - 53%, - 80%, - 100% { - transform: translate3d(-50%, 0, 0); - } - - 40%, - 43% { - transform: translate3d(-50%, -30px, 0); - } - - 70% { - transform: translate3d(-50%, -15px, 0); - } - - 90% { - transform: translate3d(-50%, -4px, 0); - } -} - -.text-secondary { - color: var(--text-secondary); -} diff --git a/src/views/styles/ProjectDetailPage.css b/src/views/styles/ProjectDetailPage.css deleted file mode 100644 index b9e88b8..0000000 --- a/src/views/styles/ProjectDetailPage.css +++ /dev/null @@ -1,553 +0,0 @@ -/* ProjectDetailPage Styles */ - -/* Project Detail Page Styles - Redesigned */ -.project-detail-page { - min-height: 100vh; - background: var(--bg-primary); -} - -/* Hero Section - New Layout */ -.project-hero { - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - padding: var(--space-2xl) 0 var(--space-4xl); - position: relative; - overflow: hidden; -} - -.project-hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23f3f4f6' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.3; -} - -.hero-content { - position: relative; - z-index: 1; -} - -/* Breadcrumb */ -.breadcrumb { - margin-bottom: var(--space-2xl); -} - -.breadcrumb-link { - display: inline-flex; - align-items: center; - gap: var(--space-sm); - color: var(--text-secondary); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - transition: all var(--transition-fast); - background: none; - border: none; - cursor: pointer; - padding: var(--space-sm) var(--space-md); - border-radius: var(--border-radius-md); -} - -.breadcrumb-link:hover { - color: var(--color-primary); - background: var(--bg-secondary); -} - -.breadcrumb-icon { - width: 16px; - height: 16px; -} - -/* Hero Grid Layout */ -.hero-grid { - display: grid; - grid-template-columns: 400px 1fr; - gap: var(--space-3xl); - align-items: start; -} - -/* Project Image Container */ -.project-image-container { - position: relative; - border-radius: var(--border-radius-xl); - overflow: hidden; - box-shadow: var(--shadow-xl); - background: var(--bg-secondary); -} - -.project-image { - width: 100%; - height: 300px; - object-fit: cover; - display: block; -} - -.image-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(45deg, rgba(37, 99, 235, 0.1) 0%, rgba(124, 58, 237, 0.1) 100%); - opacity: 0; - transition: opacity var(--transition-fast); -} - -.project-image-container:hover .image-overlay { - opacity: 1; -} - -/* Project Info */ -.project-info { - display: flex; - flex-direction: column; - justify-content: center; - min-height: 300px; -} - -.project-meta { - display: flex; - gap: var(--space-md); - margin-bottom: var(--space-lg); - flex-wrap: wrap; -} - -.project-category { - background: var(--color-primary); - color: white; - padding: var(--space-xs) var(--space-md); - border-radius: var(--border-radius-full); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); -} - -.project-date { - background: var(--bg-secondary); - color: var(--text-secondary); - padding: var(--space-xs) var(--space-md); - border-radius: var(--border-radius-full); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - border: var(--border-width) solid var(--border-color); -} - -.project-title { - font-size: clamp(var(--font-size-3xl), 4vw, var(--font-size-4xl)); - font-weight: var(--font-weight-extrabold); - margin-bottom: var(--space-lg); - line-height: var(--line-height-tight); - color: var(--text-primary); -} - -.project-description { - font-size: var(--font-size-lg); - line-height: var(--line-height-relaxed); - margin-bottom: var(--space-2xl); - color: var(--text-secondary); -} - -/* Actions */ -.project-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-md); -} - -/* Content Section */ -.project-content { - padding: var(--space-4xl) 0; -} - -.content-grid { - display: grid; - grid-template-columns: 1fr 320px; - gap: var(--space-4xl); -} - -.main-content { - min-width: 0; -} - -.content-section { - margin-bottom: var(--space-4xl); -} - -.section-title { - font-size: var(--font-size-2xl); - font-weight: var(--font-weight-bold); - color: var(--text-primary); - margin-bottom: var(--space-xl); - padding-bottom: var(--space-md); - border-bottom: 3px solid var(--color-primary); - position: relative; -} - -.section-title::after { - content: ''; - position: absolute; - bottom: -3px; - left: 0; - width: 60px; - height: 3px; - background: var(--color-secondary); -} - -.section-content { - color: var(--text-secondary); - line-height: var(--line-height-relaxed); -} - -.project-long-description { - font-size: var(--font-size-lg); - margin-bottom: var(--space-xl); - line-height: var(--line-height-relaxed); -} - -/* Features */ -.features-list { - margin-top: var(--space-2xl); -} - -.features-title { - font-size: var(--font-size-xl); - font-weight: var(--font-weight-semibold); - color: var(--text-primary); - margin-bottom: var(--space-lg); -} - -.features { - list-style: none; - padding: 0; - margin: 0; - display: grid; - gap: var(--space-md); -} - -.feature-item { - display: flex; - align-items: center; - gap: var(--space-md); - padding: var(--space-md); - background: var(--bg-secondary); - border-radius: var(--border-radius-lg); - border: var(--border-width) solid var(--border-color); - font-size: var(--font-size-base); - transition: all var(--transition-fast); -} - -.feature-item:hover { - transform: translateX(4px); - border-color: var(--color-primary); -} - -.feature-icon { - width: 20px; - height: 20px; - color: var(--color-success); - flex-shrink: 0; -} - -/* Technologies */ -.tech-grid { - display: flex; - flex-wrap: wrap; - gap: var(--space-md); -} - -.tech-item { - animation: fadeInUp 0.6s ease-out; -} - -/* Gallery */ -.gallery-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: var(--space-xl); -} - -.gallery-item { - border-radius: var(--border-radius-xl); - overflow: hidden; - box-shadow: var(--shadow-lg); - transition: all var(--transition-fast); - background: var(--bg-secondary); - position: relative; - cursor: pointer; -} - -.gallery-item:hover { - transform: translateY(-8px); - box-shadow: var(--shadow-xl); -} - -.gallery-item:hover .gallery-overlay { - opacity: 1; -} - -.gallery-image { - width: 100%; - height: 200px; - object-fit: cover; - transition: transform var(--transition-normal); -} - -.gallery-item:hover .gallery-image { - transform: scale(1.05); -} - -.gallery-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.6); - display: flex; - align-items: center; - justify-content: center; - opacity: 0; - transition: opacity var(--transition-normal); - backdrop-filter: blur(2px); -} - -.gallery-expand-icon { - width: 2rem; - height: 2rem; - color: white; - filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3)); -} - -/* Sidebar */ -.sidebar { - display: flex; - flex-direction: column; - gap: var(--space-xl); -} - -/* Info Card */ -.info-card { - background: var(--bg-secondary); - border-radius: var(--border-radius-xl); - padding: var(--space-xl); - border: var(--border-width) solid var(--border-color); - box-shadow: var(--shadow-sm); -} - -.info-title { - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - color: var(--text-primary); - margin-bottom: var(--space-lg); -} - -.info-list { - display: flex; - flex-direction: column; - gap: var(--space-md); -} - -.info-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: var(--space-md) 0; - border-bottom: var(--border-width) solid var(--border-color); -} - -.info-item:last-child { - border-bottom: none; -} - -.info-label { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - color: var(--text-secondary); -} - -.info-value { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - color: var(--text-primary); -} - -/* Related Projects */ -.related-projects { - background: var(--bg-secondary); - border-radius: var(--border-radius-xl); - padding: var(--space-xl); - border: var(--border-width) solid var(--border-color); - box-shadow: var(--shadow-sm); -} - -.related-title { - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - color: var(--text-primary); - margin-bottom: var(--space-lg); -} - -.related-list { - display: flex; - flex-direction: column; - gap: var(--space-md); -} - -.related-item { - display: flex; - gap: var(--space-md); - padding: var(--space-md); - border-radius: var(--border-radius-lg); - transition: all var(--transition-fast); - text-decoration: none; - color: inherit; - border: var(--border-width) solid transparent; -} - -.related-item:hover { - background: var(--bg-primary); - border-color: var(--border-color); - transform: translateX(4px); -} - -.related-image { - width: 60px; - height: 60px; - object-fit: cover; - border-radius: var(--border-radius-md); - flex-shrink: 0; -} - -.related-content { - flex: 1; - min-width: 0; -} - -.related-project-title { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - color: var(--text-primary); - margin-bottom: var(--space-xs); - line-height: var(--line-height-tight); -} - -.related-project-description { - font-size: var(--font-size-xs); - color: var(--text-secondary); - line-height: var(--line-height-relaxed); - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -/* Responsive Design */ -@media (max-width: 1200px) { - .hero-grid { - grid-template-columns: 350px 1fr; - gap: var(--space-2xl); - } - - .content-grid { - grid-template-columns: 1fr 280px; - gap: var(--space-3xl); - } -} - -@media (max-width: 1024px) { - .hero-grid { - grid-template-columns: 1fr; - gap: var(--space-2xl); - } - - .project-image-container { - max-width: 500px; - margin: 0 auto; - } - - .content-grid { - grid-template-columns: 1fr; - gap: var(--space-2xl); - } - - .sidebar { - order: -1; - } -} - -@media (max-width: 768px) { - .project-hero { - padding: var(--space-xl) 0 var(--space-2xl); - } - - .hero-grid { - gap: var(--space-xl); - } - - .project-image { - height: 250px; - } - - .project-info { - min-height: auto; - } - - .project-actions { - flex-direction: column; - align-items: stretch; - } - - .project-actions .btn, - .project-actions .btn-outline { - justify-content: center; - } - - .gallery-grid { - grid-template-columns: 1fr; - } - - .related-item { - flex-direction: column; - text-align: center; - } - - .related-image { - width: 100%; - height: 120px; - } -} - -@media (max-width: 480px) { - .project-meta { - flex-direction: column; - gap: var(--space-sm); - } - - .project-category, - .project-date { - display: inline-block; - width: fit-content; - } - - .features { - gap: var(--space-sm); - } - - .feature-item { - padding: var(--space-sm); - } -} - -/* Animations */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} diff --git a/src/views/styles/ProjectsPage.css b/src/views/styles/ProjectsPage.css deleted file mode 100644 index 085cbc6..0000000 --- a/src/views/styles/ProjectsPage.css +++ /dev/null @@ -1,283 +0,0 @@ -/* ProjectsPage Styles */ - -/* Projects Page Styles */ -.projects-page { - min-height: 100vh; - background: var(--bg-primary); -} - -/* Hero Section */ -.projects-hero { - background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 100%); - padding: var(--space-4xl) 0 var(--space-3xl); - position: relative; - overflow: hidden; -} - -.projects-hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23f3f4f6' fill-opacity='0.4'%3E%3Ccircle cx='30' cy='30' r='1'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - opacity: 0.5; -} - -.hero-content { - position: relative; - z-index: 1; -} - -.hero-title { - font-size: clamp(var(--font-size-4xl), 4vw, var(--font-size-5xl)); - font-weight: var(--font-weight-extrabold); - margin-bottom: var(--space-lg); - background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.hero-subtitle { - font-size: var(--font-size-lg); - color: var(--text-secondary); - margin-bottom: var(--space-2xl); - max-width: 600px; - margin-left: auto; - margin-right: auto; - line-height: var(--line-height-relaxed); -} - -/* Stats Grid */ -.stats-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--space-xl); - max-width: 400px; - margin: 0 auto; -} - -.stat-item { - text-align: center; -} - -.stat-number { - font-size: var(--font-size-3xl); - font-weight: var(--font-weight-bold); - color: var(--color-primary); - margin-bottom: var(--space-xs); -} - -.stat-label { - font-size: var(--font-size-sm); - color: var(--text-secondary); - font-weight: var(--font-weight-medium); -} - -/* Filters Section */ -.filters-section { - background: var(--bg-primary); - padding: var(--space-xl) 0; - border-bottom: var(--border-width) solid var(--border-color); - position: sticky; - top: 80px; - z-index: 10; -} - -.filters-container { - display: flex; - flex-wrap: wrap; - gap: var(--space-lg); - align-items: end; -} - -.search-container { - flex: 1; - min-width: 300px; -} - -.search-input-wrapper { - position: relative; -} - -.search-icon { - position: absolute; - left: var(--space-md); - top: 50%; - transform: translateY(-50%); - width: 20px; - height: 20px; - color: var(--text-tertiary); - pointer-events: none; -} - -.search-input { - width: 100%; - padding: var(--space-md) var(--space-md) var(--space-md) 48px; - font-size: var(--font-size-base); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-lg); - background: var(--bg-primary); - color: var(--text-primary); - transition: all var(--transition-fast); -} - -.search-input:focus { - outline: none; - border-color: var(--color-primary); - box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); -} - -.filter-group { - display: flex; - flex-direction: column; - gap: var(--space-sm); - min-width: 150px; -} - -.filter-label { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); - color: var(--text-primary); -} - -.filter-select { - padding: var(--space-md); - font-size: var(--font-size-base); - border: var(--border-width) solid var(--border-color); - border-radius: var(--border-radius-lg); - background: var(--bg-primary); - color: var(--text-primary); - transition: all var(--transition-fast); - cursor: pointer; -} - -.filter-select:focus { - outline: none; - border-color: var(--color-primary); - box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); -} - -/* Projects Grid Section */ -.projects-grid-section { - padding: var(--space-2xl) 0; -} - -.results-info { - margin-bottom: var(--space-xl); -} - -.results-text { - color: var(--text-secondary); - font-size: var(--font-size-sm); -} - -.projects-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); - gap: var(--space-xl); -} - -.project-card-item { - animation: fadeInUp 0.6s ease-out; -} - -/* No Results */ -.no-results { - display: flex; - justify-content: center; - padding: var(--space-4xl) 0; -} - -.no-results-content { - text-align: center; - max-width: 400px; -} - -.no-results-icon { - width: 64px; - height: 64px; - color: var(--text-tertiary); - margin: 0 auto var(--space-lg); -} - -.no-results-title { - font-size: var(--font-size-xl); - font-weight: var(--font-weight-bold); - color: var(--text-primary); - margin-bottom: var(--space-md); -} - -.no-results-description { - color: var(--text-secondary); - margin-bottom: var(--space-xl); - line-height: var(--line-height-relaxed); -} - -/* Responsive Design */ -@media (max-width: 768px) { - .stats-grid { - grid-template-columns: repeat(3, 1fr); - gap: var(--space-md); - } - - .stat-number { - font-size: var(--font-size-2xl); - } - - .filters-container { - flex-direction: column; - align-items: stretch; - } - - .search-container { - min-width: auto; - } - - .filter-group { - min-width: auto; - } - - .projects-grid { - grid-template-columns: 1fr; - gap: var(--space-lg); - } - - .filters-section { - position: static; - } -} - -@media (max-width: 480px) { - .hero-subtitle { - font-size: var(--font-size-base); - } - - .stats-grid { - gap: var(--space-sm); - } - - .stat-number { - font-size: var(--font-size-xl); - } -} - -/* Animations */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} - -/* Utility Classes */ -.text-center { - text-align: center; -}